Compare commits

...

13 Commits

Author SHA1 Message Date
zhexu14
7006d370e4 Bump pydcs to support DCS 2.9.21. Add support for F-14A-135-GR Early. (#3531) 2025-10-25 11:32:09 +00:00
zhexu14
2591a2b9a8 Add setting to fast forward until player is at IP (#3530) 2025-10-24 23:56:51 +00:00
zhexu14
545990b16d Add basic MiG-29 Fulcrum (full fidelity) support (#3529)
Add basic support for full fidelity MiG-29 Fulcrum.
2025-10-24 23:48:33 +00:00
zhexu14
bb1d4f1b18 Bump pydcs to support DCS 2.9.20 (#3528) 2025-10-18 12:46:25 +00:00
zhexu14
c4a195646f Replan (#3527)
This PR

- Introduces replanning of missions after continuing a turn.
- A new doctrine field setting the AEWC mission duration that was
previously hard coded.
2025-10-17 11:23:55 +00:00
zhexu14
d09a15a7f3 Allow player to continue playing after the end of a turn. (#3526)
This PR:

Keeps track of time spent in mission 

Introduces a new "turnless mode" setting, which activates the following:
- At the end of a mission, fast forwards through the time spent in the
mission, skipping any combat (which has already been tracked through
state.json)
- Removes killed flights from the ATO
- Does not start a new turn, instead allows the player to continue the
current turn.
2025-10-16 12:51:27 +00:00
zhexu14
5676c40788 Update A4EC mod version to 2.3 (#3525) 2025-10-03 23:28:48 +10:00
zhexu14
a7488a5fdd Update pydcs to support DCS 2.9.19 (#3524) 2025-09-14 21:26:31 +10:00
dependabot[bot]
1a9fa8ad5a Bump axios from 1.8.3 to 1.12.1 in /client (#3523)
Bumps [axios](https://github.com/axios/axios) from 1.8.3 to 1.12.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>Release v1.12.1</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)
(<a
href="b5f26b75bd">b5f26b7</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+10/-4
([#7020](https://github.com/axios/axios/issues/7020) )">Dmitriy
Mozgovoy</a></li>
</ul>
<h2>Release v1.12.0</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li>adding build artifacts (<a
href="9ec86de257">9ec86de</a>)</li>
<li>dont add dist on release (<a
href="a2edc3606a">a2edc36</a>)</li>
<li><strong>fetch-adapter:</strong> set correct Content-Type for Node
FormData (<a
href="https://redirect.github.com/axios/axios/issues/6998">#6998</a>)
(<a
href="a9f47afbf3">a9f47af</a>)</li>
<li><strong>node:</strong> enforce maxContentLength for data: URLs (<a
href="https://redirect.github.com/axios/axios/issues/7011">#7011</a>)
(<a
href="945435fc51">945435f</a>)</li>
<li>package exports (<a
href="https://redirect.github.com/axios/axios/issues/5627">#5627</a>)
(<a
href="aa78ac23fc">aa78ac2</a>)</li>
<li><strong>params:</strong> removing '[' and ']' from URL encode
exclude characters (<a
href="https://redirect.github.com/axios/axios/issues/3316">#3316</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5715">#5715</a>)
(<a
href="6d84189349">6d84189</a>)</li>
<li>release pr run (<a
href="fd7f404488">fd7f404</a>)</li>
<li><strong>types:</strong> change the type guard on isCancel (<a
href="https://redirect.github.com/axios/axios/issues/5595">#5595</a>)
(<a
href="0dbb7fd4f6">0dbb7fd</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>adapter:</strong> surface low‑level network error details;
attach original error via cause (<a
href="https://redirect.github.com/axios/axios/issues/6982">#6982</a>)
(<a
href="78b290c57c">78b290c</a>)</li>
<li><strong>fetch:</strong> add fetch, Request, Response env config
variables for the adapter; (<a
href="https://redirect.github.com/axios/axios/issues/7003">#7003</a>)
(<a
href="c959ff2901">c959ff2</a>)</li>
<li>support reviver on JSON.parse (<a
href="https://redirect.github.com/axios/axios/issues/5926">#5926</a>)
(<a
href="2a9763426e">2a97634</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/5924">#5924</a></li>
<li><strong>types:</strong> extend AxiosResponse interface to include
custom headers type (<a
href="https://redirect.github.com/axios/axios/issues/6782">#6782</a>)
(<a
href="7960d34ede">7960d34</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/WillianAgostini" title="+132/-16760
([#7002](https://github.com/axios/axios/issues/7002)
[#5926](https://github.com/axios/axios/issues/5926)
[#6782](https://github.com/axios/axios/issues/6782) )">Willian
Agostini</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+4263/-293
([#7006](https://github.com/axios/axios/issues/7006)
[#7003](https://github.com/axios/axios/issues/7003) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mkhani01"
title="+111/-15 ([#6982](https://github.com/axios/axios/issues/6982)
)">khani</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/AmeerAssadi"
title="+123/-0 ([#7011](https://github.com/axios/axios/issues/7011)
)">Ameer Assadi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/emiedonmokumo"
title="+55/-35 ([#6998](https://github.com/axios/axios/issues/6998)
)">Emiedonmokumo Dick-Boro</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/opsysdebug"
title="+8/-8 ([#6980](https://github.com/axios/axios/issues/6980)
)">Zeroday BYTE</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+7/-7 ([#6985](https://github.com/axios/axios/issues/6985)
[#6985](https://github.com/axios/axios/issues/6985) )">Jason
Saayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/HealGaren"
title="+5/-7 ([#5715](https://github.com/axios/axios/issues/5715)
)">최예찬</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/gligorkot"
title="+3/-1 ([#5627](https://github.com/axios/axios/issues/5627)
)">Gligor Kotushevski</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/adimit"
title="+2/-1 ([#5595](https://github.com/axios/axios/issues/5595)
)">Aleksandar Dimitrov</a></li>
</ul>
<h2>Release v1.11.0</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li>form-data npm pakcage (<a
href="https://redirect.github.com/axios/axios/issues/6970">#6970</a>)
(<a
href="e72c193722">e72c193</a>)</li>
<li>prevent RangeError when using large Buffers (<a
href="https://redirect.github.com/axios/axios/issues/6961">#6961</a>)
(<a
href="a2214ca1bc">a2214ca</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/axios/axios/compare/v1.12.0...v1.12.1">1.12.1</a>
(2025-09-12)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)
(<a
href="b5f26b75bd">b5f26b7</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+10/-4
([#7020](https://github.com/axios/axios/issues/7020) )">Dmitriy
Mozgovoy</a></li>
</ul>
<h1><a
href="https://github.com/axios/axios/compare/v1.11.0...v1.12.0">1.12.0</a>
(2025-09-11)</h1>
<h3>Bug Fixes</h3>
<ul>
<li>adding build artifacts (<a
href="9ec86de257">9ec86de</a>)</li>
<li>dont add dist on release (<a
href="a2edc3606a">a2edc36</a>)</li>
<li><strong>fetch-adapter:</strong> set correct Content-Type for Node
FormData (<a
href="https://redirect.github.com/axios/axios/issues/6998">#6998</a>)
(<a
href="a9f47afbf3">a9f47af</a>)</li>
<li><strong>node:</strong> enforce maxContentLength for data: URLs (<a
href="https://redirect.github.com/axios/axios/issues/7011">#7011</a>)
(<a
href="945435fc51">945435f</a>)</li>
<li>package exports (<a
href="https://redirect.github.com/axios/axios/issues/5627">#5627</a>)
(<a
href="aa78ac23fc">aa78ac2</a>)</li>
<li><strong>params:</strong> removing '[' and ']' from URL encode
exclude characters (<a
href="https://redirect.github.com/axios/axios/issues/3316">#3316</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5715">#5715</a>)
(<a
href="6d84189349">6d84189</a>)</li>
<li>release pr run (<a
href="fd7f404488">fd7f404</a>)</li>
<li><strong>types:</strong> change the type guard on isCancel (<a
href="https://redirect.github.com/axios/axios/issues/5595">#5595</a>)
(<a
href="0dbb7fd4f6">0dbb7fd</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>adapter:</strong> surface low‑level network error details;
attach original error via cause (<a
href="https://redirect.github.com/axios/axios/issues/6982">#6982</a>)
(<a
href="78b290c57c">78b290c</a>)</li>
<li><strong>fetch:</strong> add fetch, Request, Response env config
variables for the adapter; (<a
href="https://redirect.github.com/axios/axios/issues/7003">#7003</a>)
(<a
href="c959ff2901">c959ff2</a>)</li>
<li>support reviver on JSON.parse (<a
href="https://redirect.github.com/axios/axios/issues/5926">#5926</a>)
(<a
href="2a9763426e">2a97634</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/5924">#5924</a></li>
<li><strong>types:</strong> extend AxiosResponse interface to include
custom headers type (<a
href="https://redirect.github.com/axios/axios/issues/6782">#6782</a>)
(<a
href="7960d34ede">7960d34</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/WillianAgostini" title="+132/-16760
([#7002](https://github.com/axios/axios/issues/7002)
[#5926](https://github.com/axios/axios/issues/5926)
[#6782](https://github.com/axios/axios/issues/6782) )">Willian
Agostini</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+4263/-293
([#7006](https://github.com/axios/axios/issues/7006)
[#7003](https://github.com/axios/axios/issues/7003) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mkhani01"
title="+111/-15 ([#6982](https://github.com/axios/axios/issues/6982)
)">khani</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/AmeerAssadi"
title="+123/-0 ([#7011](https://github.com/axios/axios/issues/7011)
)">Ameer Assadi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/emiedonmokumo"
title="+55/-35 ([#6998](https://github.com/axios/axios/issues/6998)
)">Emiedonmokumo Dick-Boro</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/opsysdebug"
title="+8/-8 ([#6980](https://github.com/axios/axios/issues/6980)
)">Zeroday BYTE</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/jasonsaayman"
title="+7/-7 ([#6985](https://github.com/axios/axios/issues/6985)
[#6985](https://github.com/axios/axios/issues/6985) )">Jason
Saayman</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/HealGaren"
title="+5/-7 ([#5715](https://github.com/axios/axios/issues/5715)
)">최예찬</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/gligorkot"
title="+3/-1 ([#5627](https://github.com/axios/axios/issues/5627)
)">Gligor Kotushevski</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/adimit"
title="+2/-1 ([#5595](https://github.com/axios/axios/issues/5595)
)">Aleksandar Dimitrov</a></li>
</ul>
<h1><a
href="https://github.com/axios/axios/compare/v1.10.0...v1.11.0">1.11.0</a>
(2025-07-22)</h1>
<h3>Bug Fixes</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3cac78c2de"><code>3cac78c</code></a>
chore(release): v1.12.1 (<a
href="https://redirect.github.com/axios/axios/issues/7021">#7021</a>)</li>
<li><a
href="b5f26b75bd"><code>b5f26b7</code></a>
fix(types): fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)</li>
<li><a
href="0d8ad6e1de"><code>0d8ad6e</code></a>
chore(release): v1.12.0 (<a
href="https://redirect.github.com/axios/axios/issues/7013">#7013</a>)</li>
<li><a
href="fd7f404488"><code>fd7f404</code></a>
fix: release pr run</li>
<li><a
href="a2edc3606a"><code>a2edc36</code></a>
fix: dont add dist on release</li>
<li><a
href="9ec86de257"><code>9ec86de</code></a>
fix: adding build artifacts</li>
<li><a
href="945435fc51"><code>945435f</code></a>
fix(node): enforce maxContentLength for data: URLs (<a
href="https://redirect.github.com/axios/axios/issues/7011">#7011</a>)</li>
<li><a
href="28e5e3016d"><code>28e5e30</code></a>
chore(sponsor): update sponsor block (<a
href="https://redirect.github.com/axios/axios/issues/7005">#7005</a>)</li>
<li><a
href="d03f245a40"><code>d03f245</code></a>
chore(CI): fixed release info script to use npm registry instead of git
as fi...</li>
<li><a
href="a0bc911379"><code>a0bc911</code></a>
chore: removing dist files from src (<a
href="https://redirect.github.com/axios/axios/issues/7002">#7002</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.8.3...v1.12.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.8.3&new-version=1.12.1)](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>
2025-09-14 11:27:19 +10:00
dependabot[bot]
cc3e3a8fa1 Bump pyinstaller from 5.13.1 to 6.0.0 (#3522)
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from
5.13.1 to 6.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pyinstaller/pyinstaller/releases">pyinstaller's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.0</h2>
<p>Please see the <a
href="https://pyinstaller.org/en/v6.0.0/CHANGES.html#id1">v6.0.0 section
of the changelog</a> for a list of the changes since v5.13.2.</p>
<h2>v5.13.2</h2>
<p>Please see the <a
href="https://pyinstaller.org/en/v5.13.2/CHANGES.html#id1">v5.13.2
section of the changelog</a> for a list of the changes since
v5.13.1.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst">pyinstaller's
changelog</a>.</em></p>
<blockquote>
<h2>6.0.0 (2023-09-22)</h2>
<p>Features</p>
<pre><code>
* (macOS) PyInstaller now attempts to preserve the ``.framework``
bundles when
collecting shared libraries from them. If a shared library is to be
collected
  from a ``.framework`` bundle, the ``Info.plist`` is also automatically
collected. The ``.framework`` bundle collection code also attempts to
fix the
bundles' structure to conform to code-signing requirements (i.e.,
creation of
the ``Current`` symbolic link in the ``Versions`` directory, and
top-level
  contents being symbolic links that point to counterparts in the
``Versions/Current`` directory). Note that other resources (for example
from
  ``Resources`` or ``Helpers`` directories) still need to be explicitly
  collected by hooks. (:issue:`7619`)
* (macOS) The file relocation mechanism in ``BUNDLE`` that generates
macOS .app
bundles has been completely redesigned. All data files are now placed
into
directory structure rooted in ``Contents/Resources``, all shared
libraries (as
well as nested .framework bundles) are placed into directory structure
rooted
in ``Contents/Frameworks``, and only the the program executable is
placed into
the ``Contents/MacOS`` directory. The contents of ``Contents/Resources``
and
``Contents/Frameworks`` directories are cross-linked via symlinks
between the
two directory trees in order to maintain illusion of mixed-content
directories
(in both directory trees). The cross-linking is done at either file
level or
(sub)directory level, depending on the content type of a (sub)directory.
For
directories in ``Contents/Frameworks`` that contain a dot in the name, a
work-around is automatically applied: the directory is created with a
modified
name that does not include the dot, and next to it, a symbolic link is
created
under the original name and pointing to the directory with modified
name.
  (:issue:`7619`)
* (non-Windows) PyInstaller now attempts to preserve the parent
directory
  structure for shared libraries discovered and collected by the binary
  dependency analysis, instead of automatically collecting them into the
top-level application directory. Due to library search path assumptions
made in various places, symbolic links to collected libraries are
created
  in the top-level application directory. This complements earlier work
  (:issue:`7028`) that implemented DLL parent directory structure
  preservation on Windows. (:issue:`7619`)
* (Windows) Add an option to hide or minimize the console window in
  console-enabled applications, but only if the program's process owns
the console window (i.e., the program was not launched from an existing
  console window). (:issue:`7729`)
* (Windows) The :option:`--add-data` and :option:`--add-binary` options
accept
  the POSIX syntax of ``--add-data=source:dest`` rather than
``--add-data=source;dest``. The latter will continue to work on Windows
to
avoid breaking backwards compatibility but is discouraged in favour of
the now
  cross platform format. (:issue:`6724`)
* Add automatic binary vs. data file (re)classification step to the
analysis
  process. PyInstaller now inspects all files passed to ``Analysis`` via
&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="7001defa6f"><code>7001def</code></a>
Release v6.0.0. [skip ci]</li>
<li><a
href="87cda61c09"><code>87cda61</code></a>
building: fix executable-bit preservation for collected shell
scripts</li>
<li><a
href="d1adaed16d"><code>d1adaed</code></a>
tests: add a test with bundled shell script</li>
<li><a
href="8bbc4f72bc"><code>8bbc4f7</code></a>
bootloader: onefile: set executable bit only on extracted binaries</li>
<li><a
href="3bd5160ee7"><code>3bd5160</code></a>
building: use <code>shutil.copyfile</code> when copying files into
onedir build</li>
<li><a
href="3b4099bdb1"><code>3b4099b</code></a>
Cherry pick v5 release commits into develop. [skip ci]</li>
<li><a
href="962ac8ff4c"><code>962ac8f</code></a>
hookutils: remove requirements_for_package</li>
<li><a
href="984545a775"><code>984545a</code></a>
hookutils: adjust behavior of collect_data_files with
include_py_files</li>
<li><a
href="deb6613da8"><code>deb6613</code></a>
hookutils: have collect_all look up the dist from package name</li>
<li><a
href="e4e6ea345b"><code>e4e6ea3</code></a>
hookutils: implement replacement for is_module_satisfies</li>
<li>Additional commits viewable in <a
href="https://github.com/pyinstaller/pyinstaller/compare/v5.13.1...v6.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pyinstaller&package-manager=pip&previous-version=5.13.1&new-version=6.0.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>
2025-09-14 11:27:08 +10:00
dependabot[bot]
d4d0d9e060 Bump electron from 28.3.2 to 35.7.5 in /client (#3521)
Bumps [electron](https://github.com/electron/electron) from 28.3.2 to
35.7.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/electron/electron/releases">electron's
releases</a>.</em></p>
<blockquote>
<h2>electron v35.7.5</h2>
<h1>Release Notes for v35.7.5</h1>
<blockquote>
<p>[!WARNING]
Electron 35.x.y has reached end-of-support as per the project's <a
href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy">support
policy</a>. Developers and applications are encouraged to upgrade to a
newer version of Electron.</p>
</blockquote>
<h2>Fixes</h2>
<ul>
<li>Fixed an issue where <code>shell.openPath</code> was not
non-blocking as expected. <a
href="https://redirect.github.com/electron/electron/pull/48079">#48079</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/48088">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/48088">37</a>,
<a
href="https://redirect.github.com/electron/electron/pull/48088">38</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>electron v35.7.4</h2>
<h1>Release Notes for v35.7.4</h1>
<ul>
<li>Fix ffmpeg generation on Windows non-x64</li>
</ul>
<h2>electron v35.7.2</h2>
<h1>Release Notes for v35.7.2</h1>
<h2>Fixes</h2>
<ul>
<li>Fixed an issue where printing PDFs with <code>webContents.print({
silent: true })</code> would fail. <a
href="https://redirect.github.com/electron/electron/pull/47645">#47645</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47624">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47397">37</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>electron v35.7.0</h2>
<h1>Release Notes for v35.7.0</h1>
<h2>Other Changes</h2>
<ul>
<li>Updated Node.js to v22.16.0. <a
href="https://redirect.github.com/electron/electron/pull/47213">#47213</a></li>
</ul>
<h2>electron v35.6.0</h2>
<h1>Release Notes for v35.6.0</h1>
<h2>Features</h2>
<ul>
<li>Added support for <code>--no-experimental-global-navigator</code>
flag. <a
href="https://redirect.github.com/electron/electron/pull/47416">#47416</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47417">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47418">37</a>)<!--
raw HTML omitted --></li>
<li>Added support for customizing system accent color and highlighting
of active window border. <a
href="https://redirect.github.com/electron/electron/pull/47539">#47539</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47538">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47537">37</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>Fixed a potential crash using <code>session.clearData</code> in some
circumstances. <a
href="https://redirect.github.com/electron/electron/pull/47410">#47410</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47411">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47412">37</a>)<!--
raw HTML omitted --></li>
<li>Fixed an error when importing <code>electron</code> for the first
time from an ESM module loaded by a CJS module in a packaged app. <a
href="https://redirect.github.com/electron/electron/pull/47344">#47344</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47343">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47342">37</a>)<!--
raw HTML omitted --></li>
<li>Fixed an issue where calling <code>Fetch.continueResponse</code> via
debugger with <code>WebContentsView</code> could cause a crash. <a
href="https://redirect.github.com/electron/electron/pull/47443">#47443</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47442">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47444">37</a>)<!--
raw HTML omitted --></li>
<li>Fixed an issue where utility processes could leak file handles. <a
href="https://redirect.github.com/electron/electron/pull/47542">#47542</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47541">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47543">37</a>)<!--
raw HTML omitted --></li>
<li>Partially fixes an issue with printing a PDF via
<code>webContents.print()</code> where the callback would not be called.
<a
href="https://redirect.github.com/electron/electron/pull/47399">#47399</a>
<!-- raw HTML omitted -->(Also in <a
href="https://redirect.github.com/electron/electron/pull/47400">36</a>,
<a
href="https://redirect.github.com/electron/electron/pull/47398">37</a>)<!--
raw HTML omitted --></li>
</ul>
<h2>Other Changes</h2>
<ul>
<li>Backported fix for 420637585. <a
href="https://redirect.github.com/electron/electron/pull/47369">#47369</a></li>
</ul>
<h2>electron v35.5.1</h2>
<h1>Release Notes for v35.5.1</h1>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md">electron's
changelog</a>.</em></p>
<blockquote>
<h1>Breaking Changes</h1>
<p>Breaking changes will be documented here, and deprecation warnings
added to JS code where possible, at least <a
href="https://github.com/electron/electron/blob/main/docs/tutorial/electron-versioning.md#semver">one
major version</a> before the change is made.</p>
<h3>Types of Breaking Changes</h3>
<p>This document uses the following convention to categorize breaking
changes:</p>
<ul>
<li><strong>API Changed:</strong> An API was changed in such a way that
code that has not been updated is guaranteed to throw an exception.</li>
<li><strong>Behavior Changed:</strong> The behavior of Electron has
changed, but not in such a way that an exception will necessarily be
thrown.</li>
<li><strong>Default Changed:</strong> Code depending on the old default
may break, not necessarily throwing an exception. The old behavior can
be restored by explicitly specifying the value.</li>
<li><strong>Deprecated:</strong> An API was marked as deprecated. The
API will continue to function, but will emit a deprecation warning, and
will be removed in a future release.</li>
<li><strong>Removed:</strong> An API or feature was removed, and is no
longer supported by Electron.</li>
</ul>
<h2>Planned Breaking API Changes (39.0)</h2>
<h3>Deprecated: <code>--host-rules</code> command line switch</h3>
<p>Chromium is deprecating the <code>--host-rules</code> switch.</p>
<p>You should use <code>--host-resolver-rules</code> instead.</p>
<h3>Behavior Changed: window.open popups are always resizable</h3>
<p>Per current <a
href="https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-open-dev">WHATWG
spec</a>, the <code>window.open</code> API will now always create a
resizable popup window.</p>
<p>To restore previous behavior:</p>
<pre lang="js"><code>webContents.setWindowOpenHandler((details) =&gt; {
  return {
    action: 'allow',
    overrideBrowserWindowOptions: {
      resizable: details.features.includes('resizable=yes')
    }
  }
})
</code></pre>
<h3>Behavior Changed: shared texture OSR <code>paint</code> event data
structure</h3>
<p>When using shared texture offscreen rendering feature, the
<code>paint</code> event now emits a more structured object.
It moves the <code>sharedTextureHandle</code>, <code>planes</code>,
<code>modifier</code> into a unified <code>handle</code> property.
See <a
href="https://www.electronjs.org/docs/latest/api/structures/offscreen-shared-texture">here</a>
for more details.</p>
<h2>Planned Breaking API Changes (38.0)</h2>
<h3>Removed: <code>ELECTRON_OZONE_PLATFORM_HINT</code> environment
variable</h3>
<p>The default value of the <code>--ozone-plaftform</code> flag <a
href="https://chromium-review.googlesource.com/c/chromium/src/+/6775426">changed
to <code>auto</code></a>.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="86d839a881"><code>86d839a</code></a>
build: correct CHECK syntax (<a
href="https://redirect.github.com/electron/electron/issues/48106">#48106</a>)</li>
<li><a
href="5be0be7f04"><code>5be0be7</code></a>
fix: ensure snapshot is valid (<a
href="https://redirect.github.com/electron/electron/issues/48105">#48105</a>)</li>
<li><a
href="df232d1269"><code>df232d1</code></a>
ci: cleanup use new arc cluster (<a
href="https://redirect.github.com/electron/electron/issues/48007">#48007</a>)</li>
<li><a
href="ab51554bdf"><code>ab51554</code></a>
ci: fixup mac runner hang (<a
href="https://redirect.github.com/electron/electron/issues/47992">#47992</a>)</li>
<li><a
href="203abdd5a9"><code>203abdd</code></a>
ci: use new arc cluster (<a
href="https://redirect.github.com/electron/electron/issues/47913">#47913</a>)</li>
<li><a
href="ea17e8339f"><code>ea17e83</code></a>
build: fix ffmpeg generation on Windows non-x64 (<a
href="https://redirect.github.com/electron/electron/issues/47845">#47845</a>)</li>
<li><a
href="7b5d411819"><code>7b5d411</code></a>
build(dev-deps): drop unused <code>@​types/webpack</code> dep (<a
href="https://redirect.github.com/electron/electron/issues/47806">#47806</a>)</li>
<li><a
href="def6203bb9"><code>def6203</code></a>
build: deep update brace-expansion to resolve an audit alert (<a
href="https://redirect.github.com/electron/electron/issues/47719">#47719</a>)</li>
<li><a
href="28d8ed037c"><code>28d8ed0</code></a>
test: cleanup RenderFrame lifespan tests (<a
href="https://redirect.github.com/electron/electron/issues/47795">#47795</a>)</li>
<li><a
href="ee8942dcbf"><code>ee8942d</code></a>
build: drop eslint-plugin-unicorn (<a
href="https://redirect.github.com/electron/electron/issues/47690">#47690</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/electron/electron/compare/v28.3.2...v35.7.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=electron&package-manager=npm_and_yarn&previous-version=28.3.2&new-version=35.7.5)](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>
2025-09-07 20:33:32 +10:00
dependabot[bot]
6a99c61e2e Bump form-data in /client (#3520)
Bumps and [form-data](https://github.com/form-data/form-data). These
dependencies needed to be updated together.
Updates `form-data` from 4.0.0 to 4.0.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/form-data/form-data/releases">form-data's
releases</a>.</em></p>
<blockquote>
<h2>v4.0.4</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.3...v4.0.4">v4.0.4</a>
- 2025-07-16</h2>
<h3>Commits</h3>
<ul>
<li>[meta] add <code>auto-changelog</code> <a
href="811f68282f"><code>811f682</code></a></li>
<li>[Tests] handle predict-v8-randomness failures in node &lt; 17 and
node &gt; 23 <a
href="1d11a76434"><code>1d11a76</code></a></li>
<li>[Fix] Switch to using <code>crypto</code> random for boundary values
<a
href="3d1723080e"><code>3d17230</code></a></li>
<li>[Tests] fix linting errors <a
href="5e340800b5"><code>5e34080</code></a></li>
<li>[meta] actually ensure the readme backup isn’t published <a
href="316c82ba93"><code>316c82b</code></a></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code> <a
href="58c25d7640"><code>58c25d7</code></a></li>
<li>[meta] fix readme capitalization <a
href="2300ca1959"><code>2300ca1</code></a></li>
</ul>
<h2>v4.0.3</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.2...v4.0.3">v4.0.3</a>
- 2025-06-05</h2>
<h3>Fixed</h3>
<ul>
<li>[Fix] <code>append</code>: avoid a crash on nullish values <a
href="https://redirect.github.com/form-data/form-data/issues/577"><code>[#577](https://github.com/form-data/form-data/issues/577)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>[eslint] use a shared config <a
href="426ba9ac44"><code>426ba9a</code></a></li>
<li>[eslint] fix some spacing issues <a
href="20941917f0"><code>2094191</code></a></li>
<li>[Refactor] use <code>hasown</code> <a
href="81ab41b46f"><code>81ab41b</code></a></li>
<li>[Fix] validate boundary type in <code>setBoundary()</code> method <a
href="8d8e469309"><code>8d8e469</code></a></li>
<li>[Tests] add tests to check the behavior of <code>getBoundary</code>
with non-strings <a
href="837b8a1f75"><code>837b8a1</code></a></li>
<li>[Dev Deps] remove unused deps <a
href="870e4e6659"><code>870e4e6</code></a></li>
<li>[meta] remove local commit hooks <a
href="e6e83ccb54"><code>e6e83cc</code></a></li>
<li>[Dev Deps] update <code>eslint</code> <a
href="4066fd6f65"><code>4066fd6</code></a></li>
<li>[meta] fix scripts to use prepublishOnly <a
href="c4bbb13c0e"><code>c4bbb13</code></a></li>
</ul>
<h2>v4.0.2</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.1...v4.0.2">v4.0.2</a>
- 2025-02-14</h2>
<h3>Merged</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
</ul>
<h3>Commits</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/form-data/form-data/blob/master/CHANGELOG.md">form-data's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.3...v4.0.4">v4.0.4</a>
- 2025-07-16</h2>
<h3>Commits</h3>
<ul>
<li>[meta] add <code>auto-changelog</code> <a
href="811f68282f"><code>811f682</code></a></li>
<li>[Tests] handle predict-v8-randomness failures in node &lt; 17 and
node &gt; 23 <a
href="1d11a76434"><code>1d11a76</code></a></li>
<li>[Fix] Switch to using <code>crypto</code> random for boundary values
<a
href="3d1723080e"><code>3d17230</code></a></li>
<li>[Tests] fix linting errors <a
href="5e340800b5"><code>5e34080</code></a></li>
<li>[meta] actually ensure the readme backup isn’t published <a
href="316c82ba93"><code>316c82b</code></a></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code> <a
href="58c25d7640"><code>58c25d7</code></a></li>
<li>[meta] fix readme capitalization <a
href="2300ca1959"><code>2300ca1</code></a></li>
</ul>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.2...v4.0.3">v4.0.3</a>
- 2025-06-05</h2>
<h3>Fixed</h3>
<ul>
<li>[Fix] <code>append</code>: avoid a crash on nullish values <a
href="https://redirect.github.com/form-data/form-data/issues/577"><code>[#577](https://github.com/form-data/form-data/issues/577)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>[eslint] use a shared config <a
href="426ba9ac44"><code>426ba9a</code></a></li>
<li>[eslint] fix some spacing issues <a
href="20941917f0"><code>2094191</code></a></li>
<li>[Refactor] use <code>hasown</code> <a
href="81ab41b46f"><code>81ab41b</code></a></li>
<li>[Fix] validate boundary type in <code>setBoundary()</code> method <a
href="8d8e469309"><code>8d8e469</code></a></li>
<li>[Tests] add tests to check the behavior of <code>getBoundary</code>
with non-strings <a
href="837b8a1f75"><code>837b8a1</code></a></li>
<li>[Dev Deps] remove unused deps <a
href="870e4e6659"><code>870e4e6</code></a></li>
<li>[meta] remove local commit hooks <a
href="e6e83ccb54"><code>e6e83cc</code></a></li>
<li>[Dev Deps] update <code>eslint</code> <a
href="4066fd6f65"><code>4066fd6</code></a></li>
<li>[meta] fix scripts to use prepublishOnly <a
href="c4bbb13c0e"><code>c4bbb13</code></a></li>
</ul>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.1...v4.0.2">v4.0.2</a>
- 2025-02-14</h2>
<h3>Merged</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>Merge tags v2.5.3 and v3.0.3 <a
href="92613b9208"><code>92613b9</code></a></li>
<li>[Tests] migrate from travis to GHA <a
href="806eda7774"><code>806eda7</code></a></li>
<li>[Tests] migrate from travis to GHA <a
href="8fdb3bc6b5"><code>8fdb3bc</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="41996f5ac7"><code>41996f5</code></a>
v4.0.4</li>
<li><a
href="316c82ba93"><code>316c82b</code></a>
[meta] actually ensure the readme backup isn’t published</li>
<li><a
href="2300ca1959"><code>2300ca1</code></a>
[meta] fix readme capitalization</li>
<li><a
href="811f68282f"><code>811f682</code></a>
[meta] add <code>auto-changelog</code></li>
<li><a
href="5e340800b5"><code>5e34080</code></a>
[Tests] fix linting errors</li>
<li><a
href="1d11a76434"><code>1d11a76</code></a>
[Tests] handle predict-v8-randomness failures in node &lt; 17 and node
&gt; 23</li>
<li><a
href="58c25d7640"><code>58c25d7</code></a>
[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li><a
href="3d1723080e"><code>3d17230</code></a>
[Fix] Switch to using <code>crypto</code> random for boundary
values</li>
<li><a
href="d8d67dc8ac"><code>d8d67dc</code></a>
v4.0.3</li>
<li><a
href="e6e83ccb54"><code>e6e83cc</code></a>
[meta] remove local commit hooks</li>
<li>Additional commits viewable in <a
href="https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~ljharb">ljharb</a>, a new releaser for
form-data since your current version.</p>
</details>
<br />

Updates `form-data` from 3.0.1 to 3.0.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/form-data/form-data/releases">form-data's
releases</a>.</em></p>
<blockquote>
<h2>v4.0.4</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.3...v4.0.4">v4.0.4</a>
- 2025-07-16</h2>
<h3>Commits</h3>
<ul>
<li>[meta] add <code>auto-changelog</code> <a
href="811f68282f"><code>811f682</code></a></li>
<li>[Tests] handle predict-v8-randomness failures in node &lt; 17 and
node &gt; 23 <a
href="1d11a76434"><code>1d11a76</code></a></li>
<li>[Fix] Switch to using <code>crypto</code> random for boundary values
<a
href="3d1723080e"><code>3d17230</code></a></li>
<li>[Tests] fix linting errors <a
href="5e340800b5"><code>5e34080</code></a></li>
<li>[meta] actually ensure the readme backup isn’t published <a
href="316c82ba93"><code>316c82b</code></a></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code> <a
href="58c25d7640"><code>58c25d7</code></a></li>
<li>[meta] fix readme capitalization <a
href="2300ca1959"><code>2300ca1</code></a></li>
</ul>
<h2>v4.0.3</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.2...v4.0.3">v4.0.3</a>
- 2025-06-05</h2>
<h3>Fixed</h3>
<ul>
<li>[Fix] <code>append</code>: avoid a crash on nullish values <a
href="https://redirect.github.com/form-data/form-data/issues/577"><code>[#577](https://github.com/form-data/form-data/issues/577)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>[eslint] use a shared config <a
href="426ba9ac44"><code>426ba9a</code></a></li>
<li>[eslint] fix some spacing issues <a
href="20941917f0"><code>2094191</code></a></li>
<li>[Refactor] use <code>hasown</code> <a
href="81ab41b46f"><code>81ab41b</code></a></li>
<li>[Fix] validate boundary type in <code>setBoundary()</code> method <a
href="8d8e469309"><code>8d8e469</code></a></li>
<li>[Tests] add tests to check the behavior of <code>getBoundary</code>
with non-strings <a
href="837b8a1f75"><code>837b8a1</code></a></li>
<li>[Dev Deps] remove unused deps <a
href="870e4e6659"><code>870e4e6</code></a></li>
<li>[meta] remove local commit hooks <a
href="e6e83ccb54"><code>e6e83cc</code></a></li>
<li>[Dev Deps] update <code>eslint</code> <a
href="4066fd6f65"><code>4066fd6</code></a></li>
<li>[meta] fix scripts to use prepublishOnly <a
href="c4bbb13c0e"><code>c4bbb13</code></a></li>
</ul>
<h2>v4.0.2</h2>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.1...v4.0.2">v4.0.2</a>
- 2025-02-14</h2>
<h3>Merged</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
</ul>
<h3>Commits</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/form-data/form-data/blob/master/CHANGELOG.md">form-data's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.3...v4.0.4">v4.0.4</a>
- 2025-07-16</h2>
<h3>Commits</h3>
<ul>
<li>[meta] add <code>auto-changelog</code> <a
href="811f68282f"><code>811f682</code></a></li>
<li>[Tests] handle predict-v8-randomness failures in node &lt; 17 and
node &gt; 23 <a
href="1d11a76434"><code>1d11a76</code></a></li>
<li>[Fix] Switch to using <code>crypto</code> random for boundary values
<a
href="3d1723080e"><code>3d17230</code></a></li>
<li>[Tests] fix linting errors <a
href="5e340800b5"><code>5e34080</code></a></li>
<li>[meta] actually ensure the readme backup isn’t published <a
href="316c82ba93"><code>316c82b</code></a></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code> <a
href="58c25d7640"><code>58c25d7</code></a></li>
<li>[meta] fix readme capitalization <a
href="2300ca1959"><code>2300ca1</code></a></li>
</ul>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.2...v4.0.3">v4.0.3</a>
- 2025-06-05</h2>
<h3>Fixed</h3>
<ul>
<li>[Fix] <code>append</code>: avoid a crash on nullish values <a
href="https://redirect.github.com/form-data/form-data/issues/577"><code>[#577](https://github.com/form-data/form-data/issues/577)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>[eslint] use a shared config <a
href="426ba9ac44"><code>426ba9a</code></a></li>
<li>[eslint] fix some spacing issues <a
href="20941917f0"><code>2094191</code></a></li>
<li>[Refactor] use <code>hasown</code> <a
href="81ab41b46f"><code>81ab41b</code></a></li>
<li>[Fix] validate boundary type in <code>setBoundary()</code> method <a
href="8d8e469309"><code>8d8e469</code></a></li>
<li>[Tests] add tests to check the behavior of <code>getBoundary</code>
with non-strings <a
href="837b8a1f75"><code>837b8a1</code></a></li>
<li>[Dev Deps] remove unused deps <a
href="870e4e6659"><code>870e4e6</code></a></li>
<li>[meta] remove local commit hooks <a
href="e6e83ccb54"><code>e6e83cc</code></a></li>
<li>[Dev Deps] update <code>eslint</code> <a
href="4066fd6f65"><code>4066fd6</code></a></li>
<li>[meta] fix scripts to use prepublishOnly <a
href="c4bbb13c0e"><code>c4bbb13</code></a></li>
</ul>
<h2><a
href="https://github.com/form-data/form-data/compare/v4.0.1...v4.0.2">v4.0.2</a>
- 2025-02-14</h2>
<h3>Merged</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/pull/573"><code>[#573](https://github.com/form-data/form-data/issues/573)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
<li>fix (npmignore): ignore temporary build files <a
href="https://redirect.github.com/form-data/form-data/pull/532"><code>[#532](https://github.com/form-data/form-data/issues/532)</code></a></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available (<a
href="https://redirect.github.com/form-data/form-data/issues/573">#573</a>)
<a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
<li>[Fix] set <code>Symbol.toStringTag</code> when available <a
href="https://redirect.github.com/form-data/form-data/issues/396"><code>[#396](https://github.com/form-data/form-data/issues/396)</code></a></li>
</ul>
<h3>Commits</h3>
<ul>
<li>Merge tags v2.5.3 and v3.0.3 <a
href="92613b9208"><code>92613b9</code></a></li>
<li>[Tests] migrate from travis to GHA <a
href="806eda7774"><code>806eda7</code></a></li>
<li>[Tests] migrate from travis to GHA <a
href="8fdb3bc6b5"><code>8fdb3bc</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="41996f5ac7"><code>41996f5</code></a>
v4.0.4</li>
<li><a
href="316c82ba93"><code>316c82b</code></a>
[meta] actually ensure the readme backup isn’t published</li>
<li><a
href="2300ca1959"><code>2300ca1</code></a>
[meta] fix readme capitalization</li>
<li><a
href="811f68282f"><code>811f682</code></a>
[meta] add <code>auto-changelog</code></li>
<li><a
href="5e340800b5"><code>5e34080</code></a>
[Tests] fix linting errors</li>
<li><a
href="1d11a76434"><code>1d11a76</code></a>
[Tests] handle predict-v8-randomness failures in node &lt; 17 and node
&gt; 23</li>
<li><a
href="58c25d7640"><code>58c25d7</code></a>
[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li><a
href="3d1723080e"><code>3d17230</code></a>
[Fix] Switch to using <code>crypto</code> random for boundary
values</li>
<li><a
href="d8d67dc8ac"><code>d8d67dc</code></a>
v4.0.3</li>
<li><a
href="e6e83ccb54"><code>e6e83cc</code></a>
[meta] remove local commit hooks</li>
<li>Additional commits viewable in <a
href="https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~ljharb">ljharb</a>, a new releaser for
form-data since your current version.</p>
</details>
<br />


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>
2025-09-07 20:33:23 +10:00
dependabot[bot]
5398ec59a5 Bump ws in /client (#3519)
Bumps and [ws](https://github.com/websockets/ws). These dependencies
needed to be updated together.
Updates `ws` from 8.5.0 to 8.18.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/websockets/ws/releases">ws's
releases</a>.</em></p>
<blockquote>
<h2>8.18.3</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed a spec violation where the <code>Sec-WebSocket-Version</code>
header was not added
to the HTTP response if the client requested version was either invalid
or
unacceptable (33f5dbaf).</li>
</ul>
<h2>8.18.2</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed an issue that, during message decompression when the maximum
size was
exceeded, led to the emission of an inaccurate error and closure of the
connection with an improper close code (<a
href="https://redirect.github.com/websockets/ws/issues/2285">#2285</a>).</li>
</ul>
<h2>8.18.1</h2>
<h1>Bug fixes</h1>
<ul>
<li>The length of the UNIX domain socket paths in the tests has been
shortened to
make them work when run via <a
href="https://github.com/nodejs/citgm">CITGM</a> (021f7b8b).</li>
</ul>
<h2>8.18.0</h2>
<h1>Features</h1>
<ul>
<li>Added support for <code>Blob</code> (<a
href="https://redirect.github.com/websockets/ws/issues/2229">#2229</a>).</li>
</ul>
<h2>8.17.1</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed a DoS vulnerability (<a
href="https://redirect.github.com/websockets/ws/issues/2231">#2231</a>).</li>
</ul>
<p>A request with a number of headers exceeding
the[<code>server.maxHeadersCount</code>][]
threshold could be used to crash a ws server.</p>
<pre lang="js"><code>const http = require('http');
const WebSocket = require('ws');
<p>const wss = new WebSocket.Server({ port: 0 }, function () {
const chars =
&quot;!#$%&amp;'*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~&quot;.split('');
const headers = {};
let count = 0;</p>
<p>for (let i = 0; i &lt; chars.length; i++) {
if (count === 2000) break;</p>
<pre><code>for (let j = 0; j &amp;lt; chars.length; j++) {
  const key = chars[i] + chars[j];
  headers[key] = 'x';
</code></pre>
<p>&lt;/tr&gt;&lt;/table&gt;
</code></pre></p>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dabbdec92f"><code>dabbdec</code></a>
[dist] 8.18.3</li>
<li><a
href="33f5dbaf33"><code>33f5dba</code></a>
[fix] Respond with the supported protocol versions (<a
href="https://redirect.github.com/websockets/ws/issues/2291">#2291</a>)</li>
<li><a
href="22a5a17db5"><code>22a5a17</code></a>
[ci] Test on node 24</li>
<li><a
href="e67eb7ad70"><code>e67eb7a</code></a>
[ci] Do not test on node 23</li>
<li><a
href="fa670f2b24"><code>fa670f2</code></a>
[ci] Run the lint step on node 22</li>
<li><a
href="0eb8535f9b"><code>0eb8535</code></a>
[dist] 8.18.2</li>
<li><a
href="4f20aedbe2"><code>4f20aed</code></a>
[fix] Handle oversized messages with designated error (<a
href="https://redirect.github.com/websockets/ws/issues/2285">#2285</a>)</li>
<li><a
href="aa998e38c5"><code>aa998e3</code></a>
[pkg] Update globals to version 16.0.0</li>
<li><a
href="cf259541e8"><code>cf25954</code></a>
[minor] Fix nit in error message</li>
<li><a
href="b92745a9d6"><code>b92745a</code></a>
[dist] 8.18.1</li>
<li>Additional commits viewable in <a
href="https://github.com/websockets/ws/compare/8.5.0...8.18.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `ws` from 7.5.7 to 7.5.10
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/websockets/ws/releases">ws's
releases</a>.</em></p>
<blockquote>
<h2>8.18.3</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed a spec violation where the <code>Sec-WebSocket-Version</code>
header was not added
to the HTTP response if the client requested version was either invalid
or
unacceptable (33f5dbaf).</li>
</ul>
<h2>8.18.2</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed an issue that, during message decompression when the maximum
size was
exceeded, led to the emission of an inaccurate error and closure of the
connection with an improper close code (<a
href="https://redirect.github.com/websockets/ws/issues/2285">#2285</a>).</li>
</ul>
<h2>8.18.1</h2>
<h1>Bug fixes</h1>
<ul>
<li>The length of the UNIX domain socket paths in the tests has been
shortened to
make them work when run via <a
href="https://github.com/nodejs/citgm">CITGM</a> (021f7b8b).</li>
</ul>
<h2>8.18.0</h2>
<h1>Features</h1>
<ul>
<li>Added support for <code>Blob</code> (<a
href="https://redirect.github.com/websockets/ws/issues/2229">#2229</a>).</li>
</ul>
<h2>8.17.1</h2>
<h1>Bug fixes</h1>
<ul>
<li>Fixed a DoS vulnerability (<a
href="https://redirect.github.com/websockets/ws/issues/2231">#2231</a>).</li>
</ul>
<p>A request with a number of headers exceeding
the[<code>server.maxHeadersCount</code>][]
threshold could be used to crash a ws server.</p>
<pre lang="js"><code>const http = require('http');
const WebSocket = require('ws');
<p>const wss = new WebSocket.Server({ port: 0 }, function () {
const chars =
&quot;!#$%&amp;'*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~&quot;.split('');
const headers = {};
let count = 0;</p>
<p>for (let i = 0; i &lt; chars.length; i++) {
if (count === 2000) break;</p>
<pre><code>for (let j = 0; j &amp;lt; chars.length; j++) {
  const key = chars[i] + chars[j];
  headers[key] = 'x';
</code></pre>
<p>&lt;/tr&gt;&lt;/table&gt;
</code></pre></p>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="dabbdec92f"><code>dabbdec</code></a>
[dist] 8.18.3</li>
<li><a
href="33f5dbaf33"><code>33f5dba</code></a>
[fix] Respond with the supported protocol versions (<a
href="https://redirect.github.com/websockets/ws/issues/2291">#2291</a>)</li>
<li><a
href="22a5a17db5"><code>22a5a17</code></a>
[ci] Test on node 24</li>
<li><a
href="e67eb7ad70"><code>e67eb7a</code></a>
[ci] Do not test on node 23</li>
<li><a
href="fa670f2b24"><code>fa670f2</code></a>
[ci] Run the lint step on node 22</li>
<li><a
href="0eb8535f9b"><code>0eb8535</code></a>
[dist] 8.18.2</li>
<li><a
href="4f20aedbe2"><code>4f20aed</code></a>
[fix] Handle oversized messages with designated error (<a
href="https://redirect.github.com/websockets/ws/issues/2285">#2285</a>)</li>
<li><a
href="aa998e38c5"><code>aa998e3</code></a>
[pkg] Update globals to version 16.0.0</li>
<li><a
href="cf259541e8"><code>cf25954</code></a>
[minor] Fix nit in error message</li>
<li><a
href="b92745a9d6"><code>b92745a</code></a>
[dist] 8.18.1</li>
<li>Additional commits viewable in <a
href="https://github.com/websockets/ws/compare/8.5.0...8.18.3">compare
view</a></li>
</ul>
</details>
<br />


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>
2025-09-07 20:33:11 +10:00
60 changed files with 1964 additions and 739 deletions

View File

@@ -4,8 +4,12 @@ Saves from 13.x are not compatible with 14.0.0.
## Features/Improvements
* **[Engine]** Support for DCS 2.9.16.10973
* **[Engine]** Support for DCS 2.9.21.
* **[Engine]** Support for MiG-29 Fulcrum (full fidelity version).
* **[Engine]** Support for F-14A-135-GR Early.
* **[Mods]** A4EC mod version updated to 2.3.
* **[UI]** Allow saving after fast forwarding manually with sim speed controls (--show-sim-speed-controls option).
* **[UI]** Add new option to fast forward until player is at the IP.
## Fixes

418
client/package-lock.json generated
View File

@@ -18,7 +18,7 @@
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"@types/react-redux": "^7.1.24",
"axios": "^1.8.3",
"axios": "^1.12.1",
"electron-window-state": "^5.0.3",
"esri-leaflet": "^3.0.8",
"leaflet": "^1.9.2",
@@ -38,7 +38,7 @@
"@types/leaflet": "^1.8.0",
"@types/redux-logger": "^3.0.9",
"@types/websocket": "^1.0.5",
"electron": "^28.3.2",
"electron": "^35.7.5",
"electron-is-dev": "^2.0.0",
"generate-license-file": "^2.0.0",
"jest-transform-stub": "^2.0.0",
@@ -6097,23 +6097,24 @@
}
},
"node_modules/axios": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
"integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
"license": "MIT",
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.12.1.tgz",
"integrity": "sha512-Kn4kbSXpkFHCGE6rBFNwIv0GQs4AvDT80jlveJDKFxjbTYMUeB4QtsdPCv6H8Cm19Je7IU6VFtRl2zWZI0rudQ==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/axios/node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -6826,6 +6827,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-me-maybe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
@@ -8382,6 +8395,19 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -8416,14 +8442,14 @@
}
},
"node_modules/electron": {
"version": "28.3.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-28.3.2.tgz",
"integrity": "sha512-bmrQpdncbYNTArlg4n+qsASoXy3eeCELxeRmwUS52RNgvio1gGx5FLCwf8d4R+TsxwfkDWOaWbW0taIKheivKA==",
"version": "35.7.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz",
"integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^18.11.18",
"@types/node": "^22.7.7",
"extract-zip": "^2.0.1"
},
"bin": {
@@ -8468,6 +8494,21 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/electron/node_modules/@types/node": {
"version": "22.18.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz",
"integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==",
"dev": true,
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/electron/node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true
},
"node_modules/emittery": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
@@ -8613,13 +8654,9 @@
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"engines": {
"node": ">= 0.4"
}
@@ -8628,7 +8665,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -8639,6 +8675,31 @@
"integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
"dev": true
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -10198,14 +10259,16 @@
}
},
"node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
"integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
"dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.35"
},
"engines": {
"node": ">= 6"
@@ -10286,7 +10349,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10366,16 +10428,20 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -10399,6 +10465,18 @@
"node": ">=8.0.0"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -10572,12 +10650,11 @@
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.1.3"
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -10696,23 +10773,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -10721,12 +10785,11 @@
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dependencies": {
"has-symbols": "^1.0.2"
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -10739,7 +10802,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -14462,6 +14524,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -14552,19 +14622,19 @@
}
},
"node_modules/mime-db": {
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.51.0"
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
@@ -20817,16 +20887,16 @@
}
},
"node_modules/webpack-dev-server/node_modules/ws": {
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
"integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
"version": "8.18.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
"dev": true,
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
@@ -21426,9 +21496,9 @@
}
},
"node_modules/ws": {
"version": "7.5.7",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
"integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
"version": "7.5.10",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
"engines": {
"node": ">=8.3.0"
@@ -26075,22 +26145,24 @@
"dev": true
},
"axios": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz",
"integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==",
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.12.1.tgz",
"integrity": "sha512-Kn4kbSXpkFHCGE6rBFNwIv0GQs4AvDT80jlveJDKFxjbTYMUeB4QtsdPCv6H8Cm19Je7IU6VFtRl2zWZI0rudQ==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
},
"dependencies": {
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
}
}
@@ -26632,6 +26704,15 @@
"set-function-length": "^1.2.1"
}
},
"call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"requires": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
}
},
"call-me-maybe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
@@ -27782,6 +27863,16 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
"dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"requires": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
}
},
"duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -27810,14 +27901,31 @@
}
},
"electron": {
"version": "28.3.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-28.3.2.tgz",
"integrity": "sha512-bmrQpdncbYNTArlg4n+qsASoXy3eeCELxeRmwUS52RNgvio1gGx5FLCwf8d4R+TsxwfkDWOaWbW0taIKheivKA==",
"version": "35.7.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz",
"integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==",
"dev": true,
"requires": {
"@electron/get": "^2.0.0",
"@types/node": "^18.11.18",
"@types/node": "^22.7.7",
"extract-zip": "^2.0.1"
},
"dependencies": {
"@types/node": {
"version": "22.18.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz",
"integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==",
"dev": true,
"requires": {
"undici-types": "~6.21.0"
}
},
"undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true
}
}
},
"electron-is-dev": {
@@ -27966,19 +28074,14 @@
}
},
"es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"requires": {
"get-intrinsic": "^1.2.4"
}
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
},
"es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
},
"es-module-lexer": {
"version": "1.5.4",
@@ -27986,6 +28089,25 @@
"integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
"dev": true
},
"es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"requires": {
"es-errors": "^1.3.0"
}
},
"es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"requires": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
}
},
"es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -29144,14 +29266,16 @@
}
},
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
"integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.35"
}
},
"forwarded": {
@@ -29205,8 +29329,7 @@
"function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"function.prototype.name": {
"version": "1.1.5",
@@ -29265,16 +29388,20 @@
"dev": true
},
"get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"requires": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
}
},
"get-own-enumerable-property-symbols": {
@@ -29289,6 +29416,15 @@
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true
},
"get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"requires": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
}
},
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -29416,13 +29552,9 @@
}
},
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
"requires": {
"get-intrinsic": "^1.1.3"
}
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
},
"got": {
"version": "11.8.6",
@@ -29510,32 +29642,23 @@
"es-define-property": "^1.0.0"
}
},
"has-proto": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"requires": {
"has-symbols": "^1.0.2"
"has-symbols": "^1.0.3"
}
},
"hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"requires": {
"function-bind": "^1.1.2"
}
@@ -32322,6 +32445,11 @@
}
}
},
"math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
},
"mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -32388,16 +32516,16 @@
"dev": true
},
"mime-db": {
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.51.0"
"mime-db": "1.52.0"
}
},
"mimic-fn": {
@@ -37026,9 +37154,9 @@
}
},
"ws": {
"version": "8.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
"integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
"version": "8.18.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
"dev": true,
"requires": {}
}
@@ -37523,9 +37651,9 @@
}
},
"ws": {
"version": "7.5.7",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
"integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
"version": "7.5.10",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
"requires": {}
},

View File

@@ -15,7 +15,7 @@
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"@types/react-redux": "^7.1.24",
"axios": "^1.8.3",
"axios": "^1.12.1",
"electron-window-state": "^5.0.3",
"esri-leaflet": "^3.0.8",
"leaflet": "^1.9.2",
@@ -66,7 +66,7 @@
"@types/leaflet": "^1.8.0",
"@types/redux-logger": "^3.0.9",
"@types/websocket": "^1.0.5",
"electron": "^28.3.2",
"electron": "^35.7.5",
"electron-is-dev": "^2.0.0",
"generate-license-file": "^2.0.0",
"jest-transform-stub": "^2.0.0",

View File

@@ -12,6 +12,7 @@ from .flightmembers import FlightMembers
from .flightroster import FlightRoster
from .flightstate import FlightState, Navigating, Uninitialized
from .flightstate.killed import Killed
from .flighttype import FlightType
from ..sidc import (
Entity,
SidcDescribable,
@@ -31,7 +32,6 @@ if TYPE_CHECKING:
from game.data.weapons import WeaponType
from .flightmember import FlightMember
from .flightplans.flightplan import FlightPlan
from .flighttype import FlightType
from .flightwaypoint import FlightWaypoint
from .package import Package
from .starttype import StartType
@@ -58,7 +58,8 @@ class Flight(SidcDescribable):
self.coalition = squadron.coalition
self.squadron = squadron
self.flight_type = flight_type
self.squadron.claim_inventory(count)
if flight_type != FlightType.IDLE:
self.squadron.claim_inventory(count)
if roster is None:
self.roster = FlightMembers(self, initial_size=count)
else:

View File

@@ -69,6 +69,15 @@ class FlightMembers(IFlightRoster):
self.flight.squadron.return_pilot(current_pilot)
self.members[index].pilot = pilot
def remove_pilot(self, pilot: Pilot) -> None:
for i, member in enumerate(self.members):
if member.pilot is not None and member.pilot.name == pilot.name:
self.members.pop(i)
if (code := member.tgp_laser_code) is not None:
code.release()
return
raise ValueError(f"Pilot {pilot.name} not a member")
def clear(self) -> None:
self.flight.squadron.return_pilots(
[p for p in self.iter_pilots() if p is not None]

View File

@@ -12,7 +12,7 @@ from game.utils import Distance, Heading, Speed, feet, knots, meters, nautical_m
class AewcFlightPlan(PatrollingFlightPlan[PatrollingLayout]):
@property
def patrol_duration(self) -> timedelta:
return timedelta(hours=4)
return self.flight.coalition.doctrine.aewc.duration
@property
def patrol_speed(self) -> Speed:

View File

@@ -64,6 +64,7 @@ class FlightPlanBuilderTypes:
FlightType.TRANSPORT: AirliftFlightPlan.builder_type(),
FlightType.FERRY: FerryFlightPlan.builder_type(),
FlightType.AIR_ASSAULT: AirAssaultFlightPlan.builder_type(),
FlightType.IDLE: BarCapFlightPlan.builder_type(),
}
try:
return builder_dict[flight.flight_type]

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from collections import deque
from datetime import datetime, timedelta
import logging
from typing import TYPE_CHECKING
from dcs import Point
@@ -13,6 +14,7 @@ from game.ato.flightstate.flightstate import FlightState
from game.ato.flightwaypoint import FlightWaypoint
from game.ato.flightwaypointtype import FlightWaypointType
from game.ato.starttype import StartType
from game.settings.settings import FastForwardStopCondition
from game.utils import Distance, LBS_TO_KG, Speed, pairwise
if TYPE_CHECKING:
@@ -164,3 +166,17 @@ class InFlight(FlightState, ABC):
@property
def spawn_type(self) -> StartType:
return StartType.IN_FLIGHT
def should_halt_sim(self) -> bool:
if (
self.flight.client_count > 0
and self.settings.fast_forward_stop_condition
== FastForwardStopCondition.PLAYER_AT_IP
and self.is_at_ip
):
logging.info(
f"Interrupting simulation because {self.flight} has players and has "
"reached IP"
)
return True
return False

View File

@@ -57,6 +57,7 @@ class FlightType(Enum):
REFUELING = "Refueling"
FERRY = "Ferry"
AIR_ASSAULT = "Air Assault"
IDLE = "Idle"
def __str__(self) -> str:
return self.value

View File

@@ -47,6 +47,17 @@ class MissionScheduler:
margin=5 * 60,
)
for package in self.coalition.ato.packages:
if package.time_over_target > datetime.min:
if package.primary_task in dca_types:
if (
package.mission_departure_time is not None
and package.mission_departure_time
> previous_cap_end_time[package.target]
):
previous_cap_end_time[package.target] = (
package.mission_departure_time
)
continue # If package already has TOT, leave it.
tot = TotEstimator(package).earliest_tot(now)
if package.primary_task in dca_types:
previous_end_time = previous_cap_end_time[package.target]

View File

@@ -24,6 +24,7 @@ from game.theater.theatergroundobject import (
VehicleGroupGroundObject,
)
from game.threatzones import ThreatZones
from game.ato.flighttype import FlightType
if TYPE_CHECKING:
from game import Game
@@ -77,7 +78,8 @@ class TheaterState(WorldState["TheaterState"]):
self.threatening_air_defenses.remove(target)
if target in self.detecting_air_defenses:
self.detecting_air_defenses.remove(target)
self.enemy_air_defenses.remove(target)
if target in self.enemy_air_defenses:
self.enemy_air_defenses.remove(target)
self._rebuild_threat_zones()
def eliminate_ship(self, target: NavalGroundObject) -> None:
@@ -85,7 +87,8 @@ class TheaterState(WorldState["TheaterState"]):
self.threatening_air_defenses.remove(target)
if target in self.detecting_air_defenses:
self.detecting_air_defenses.remove(target)
self.enemy_ships.remove(target)
if target in self.enemy_ships:
self.enemy_ships.remove(target)
self._rebuild_threat_zones()
def has_battle_position(self, target: VehicleGroupGroundObject) -> bool:
@@ -155,21 +158,16 @@ class TheaterState(WorldState["TheaterState"]):
tracer,
)
# 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_rounds = math.ceil(mission_duration / barcap_duration)
refueling_targets: list[MissionTarget] = []
theater_refuling_point = finder.preferred_theater_refueling_control_point()
if theater_refuling_point is not None:
refueling_targets.append(theater_refuling_point)
return TheaterState(
theater_state = TheaterState(
context=context,
barcaps_needed={
cp: barcap_rounds for cp in finder.vulnerable_control_points()
cp: cls._barcap_rounds(game, player, now, cp)
for cp in finder.vulnerable_control_points()
},
active_front_lines=list(finder.front_lines()),
front_line_stances={f: None for f in finder.front_lines()},
@@ -191,3 +189,62 @@ class TheaterState(WorldState["TheaterState"]):
enemy_barcaps=list(game.theater.control_points_for(not player)),
threat_zones=game.threat_zone_for(not player),
)
# Look through packages already planned in the ATO and eliminate from the
# list of targets.
for package in coalition.ato.packages:
if isinstance(package.target, NavalGroundObject):
theater_state.eliminate_ship(package.target)
if package.primary_task == FlightType.BAI and isinstance(
package.target, VehicleGroupGroundObject
):
theater_state.eliminate_battle_position(package.target)
if isinstance(package.target, IadsGroundObject):
theater_state.eliminate_air_defense(package.target)
if (
package.primary_task == FlightType.STRIKE
and isinstance(package.target, TheaterGroundObject)
and package.target in theater_state.strike_targets
):
theater_state.strike_targets.remove(package.target)
if package.primary_task == FlightType.AEWC:
# If a planned AEWC mission covers the target beyond the planned mission duration, it can safely be removed
if (
package.time_over_target + coalition.doctrine.aewc.duration
> now + game.settings.desired_player_mission_duration
) and package.target in theater_state.aewc_targets:
theater_state.aewc_targets.remove(package.target)
if (
package.primary_task
in (
FlightType.OCA_AIRCRAFT,
FlightType.OCA_RUNWAY,
)
and isinstance(package.target, ControlPoint)
and package.target in theater_state.oca_targets
):
theater_state.oca_targets.remove(package.target)
return theater_state
@classmethod
def _barcap_rounds(
cls, game: Game, player: bool, now: datetime, control_point: ControlPoint
) -> int:
"""Calculate number of additional rounds of CAP required to cover mission duration."""
coalition = game.coalition_for(player)
# Look through ATO for any existing planned CAP missions and calculate last planned CAP end
planned_cap_coverage_end_time = now
for package in coalition.ato.packages:
if package.target == control_point:
cap_end_time = (
package.time_over_target + coalition.doctrine.cap.duration
)
if cap_end_time > planned_cap_coverage_end_time:
planned_cap_coverage_end_time = cap_end_time
# When mission is expected to finish
mission_end_time = now + game.settings.desired_player_mission_duration
return math.ceil(
(mission_end_time - planned_cap_coverage_end_time).total_seconds()
/ coalition.doctrine.cap.duration.total_seconds()
)

View File

@@ -52,6 +52,16 @@ class Helicopter:
)
@dataclass
class Aewc:
#: The duration that AEWC flights will remain on-station
duration: timedelta
@staticmethod
def from_dict(data: dict[str, Any]) -> Aewc:
return Aewc(duration=timedelta(minutes=data["duration_minutes"]))
@dataclass
class Cas:
#: The duration that CAP flights will remain on-station.
@@ -169,6 +179,9 @@ class Doctrine:
#: Helicopter specific doctrines.
helicopter: Helicopter
#: Doctrine for AEWC missions.
aewc: Aewc
#: Doctrine for CAS missions.
cas: Cas
@@ -238,6 +251,7 @@ class Doctrine:
data["ground_unit_procurement_ratios"]
),
helicopter=Helicopter.from_dict(data["helicopter"]),
aewc=Aewc.from_dict(data["aewc"]),
cas=Cas.from_dict(data["cas"]),
cap=Cap.from_dict(data["cap"]),
sweep=Sweep.from_dict(data["sweep"]),

View File

@@ -38,6 +38,7 @@ from game.radio.channels import (
HindChannelNamer,
HipChannelNamer,
KiowaChannelNamer,
FulcrumChannelNamer,
)
from game.utils import (
Distance,
@@ -118,6 +119,7 @@ class RadioConfig:
"hind": HindChannelNamer,
"hip": HipChannelNamer,
"kiowa": KiowaChannelNamer,
"fulcrum": FulcrumChannelNamer,
}[config.get("namer", "default")]

View File

@@ -196,6 +196,9 @@ class StateData:
#: True if the mission ended. If False, the mission exited abnormally.
mission_ended: bool
#: Simulation time since mission start in seconds
simulation_time_seconds: float
#: Names of aircraft units that were killed during the mission.
killed_aircraft: List[str]
@@ -248,6 +251,7 @@ class StateData:
return cls(
mission_ended=data["mission_ended"],
simulation_time_seconds=data["simulation_time_seconds"],
killed_aircraft=killed_aircraft,
killed_ground_units=killed_ground_units,
destroyed_statics=data["destroyed_objects_positions"],

View File

@@ -148,7 +148,7 @@ class AircraftGenerator:
faction.country,
squadron,
1,
FlightType.BARCAP,
FlightType.IDLE,
StartType.COLD,
divert=None,
)

View File

@@ -285,7 +285,7 @@ class FlightGroupConfigurator:
if (
unit_callsign.name is None
): # pydcs needs unit.callsign to be set for eastern callsigns
unit.callsign = str(unit_callsign) # type: ignore
unit.callsign = str(unit_callsign)
else: # Use western callsign
unit.callsign_dict = unit_callsign.pydcs_dict(
country=self.flight.country

View File

@@ -243,11 +243,7 @@ class FlightGroupSpawner:
for i in range(self.flight.count):
group.units[i].position = hpad.position
group.units[i].heading = hpad.heading
# pydcs has just `parking_id = None`, so mypy thinks str is invalid. Ought
# to fix pydcs, but that's not the kind of change we want to pull into the
# 6.1 branch, and frankly we should probably just improve pydcs's handling
# of FARPs instead.
group.units[i].parking_id = str(i + 1) # type: ignore
group.units[i].parking_id = str(i + 1)
return group
def dcs_start_type(self) -> DcsStartType:

View File

@@ -4,7 +4,7 @@ from datetime import datetime
from typing import Any, Iterable, Union
from dcs import Mission
from dcs.planes import AJS37, F_14B, JF_17
from dcs.planes import AJS37, F_14A_135_GR, F_14A_135_GR_Early, F_14B, JF_17
from dcs.point import MovingPoint, PointAction
from dcs.unitgroup import FlyingGroup
@@ -127,5 +127,9 @@ class PydcsWaypointBuilder:
for i, t in enumerate(targets):
if self.group.units[0].unit_type == JF_17 and i < 4:
self.group.add_nav_target_point(t.position, "PP" + str(i + 1))
if self.group.units[0].unit_type == F_14B and i == 0:
if (
self.group.units[0].unit_type
in [F_14A_135_GR, F_14A_135_GR_Early, F_14B]
and i == 0
):
self.group.add_nav_target_point(t.position, "ST")

View File

@@ -450,3 +450,15 @@ class KiowaChannelNamer(ChannelNamer):
@classmethod
def name(cls) -> str:
return "kiowa"
class FulcrumChannelNamer(ChannelNamer):
"""Channel namer for MiG-29A Fulcrum"""
@staticmethod
def channel_name(radio_id: int, channel_id: int) -> str:
return f"R862 Ch {channel_id}"
@classmethod
def name(cls) -> str:
return "fulcrum"

View File

@@ -234,7 +234,6 @@ RADIOS: List[Radio] = [
# Ka-50
# Note: Also capable of 100MHz-150MHz, but we can't model gaps.
Radio("R-800L1", (RadioRange(MHz(220), MHz(400), kHz(25), Modulation.AM),)),
Radio("R-828", (RadioRange(MHz(20), MHz(60), kHz(25), Modulation.FM),)),
# UH-1H
Radio("AN/ARC-51BX", (RadioRange(MHz(225), MHz(400), kHz(50), Modulation.AM),)),
Radio("AN/ARC-131", (RadioRange(MHz(30), MHz(76), kHz(50), Modulation.FM),)),
@@ -298,6 +297,16 @@ RADIOS: List[Radio] = [
# Mi-8/Mi-24
Radio("R863", (RadioRange(MHz(220), MHz(400), kHz(25), Modulation.AM),)),
Radio("R828", (RadioRange(MHz(20), MHz(60), kHz(25), Modulation.FM),)),
# MiG-29A
Radio(
"R862",
(
RadioRange(MHz(220), MHz(400), kHz(25), Modulation.AM),
RadioRange(MHz(100), MHz(150), kHz(25), Modulation.AM),
RadioRange(MHz(220), MHz(400), kHz(25), Modulation.FM),
RadioRange(MHz(100), MHz(150), kHz(25), Modulation.FM),
),
),
]

View File

@@ -35,6 +35,7 @@ class FastForwardStopCondition(Enum):
PLAYER_TAKEOFF = "Player takeoff time"
PLAYER_TAXI = "Player taxi time"
PLAYER_STARTUP = "Player startup time"
PLAYER_AT_IP = "Player at IP"
MANUAL = "Manual fast forward control"
@@ -355,6 +356,16 @@ class Settings:
"your game after aborting take off."
),
)
turnless_mode: bool = boolean_option(
"Enable turnless mode (WIP)",
page=MISSION_GENERATOR_PAGE,
section=GAMEPLAY_SECTION,
default=False,
detail=(
"If enabled, turns do not end after mission completion. A new mission "
"can be started picking up from where the previous mission ended."
),
)
fast_forward_stop_condition: FastForwardStopCondition = choices_option(
"Fast forward until",
page=MISSION_GENERATOR_PAGE,
@@ -365,6 +376,7 @@ class Settings:
"Player startup time": FastForwardStopCondition.PLAYER_STARTUP,
"Player taxi time": FastForwardStopCondition.PLAYER_TAXI,
"Player takeoff time": FastForwardStopCondition.PLAYER_TAKEOFF,
"Player at IP": FastForwardStopCondition.PLAYER_AT_IP,
"First contact": FastForwardStopCondition.FIRST_CONTACT,
"Manual": FastForwardStopCondition.MANUAL,
},

View File

@@ -28,9 +28,17 @@ class AircraftSimulation:
self.set_initial_flight_states()
def on_game_tick(
self, events: GameUpdateEvents, time: datetime, duration: timedelta
self,
events: GameUpdateEvents,
time: datetime,
duration: timedelta,
combat_resolution_method: CombatResolutionMethod,
force_continue: bool,
) -> None:
if not self._auto_resolve_combat() and self.combats:
if (
not self._auto_resolve_combat(combat_resolution_method, force_continue)
and self.combats
):
logging.error(
"Cannot resume simulation because aircraft are in combat and "
"auto-resolve is disabled"
@@ -45,7 +53,7 @@ class AircraftSimulation:
duration,
self.results,
events,
self.game.settings.combat_resolution_method,
combat_resolution_method,
):
events.end_combat(combat)
else:
@@ -61,11 +69,22 @@ class AircraftSimulation:
# After updating all combat states, check for halts.
for flight in self.iter_flights():
if flight.should_halt_sim():
if flight.should_halt_sim() and not force_continue:
events.complete_simulation()
return
if not self._auto_resolve_combat() and self.combats:
# Find completed flights, removing them from the ATO and returning aircraft
# and pilots back to the squadron.
for flight in self.iter_flights():
if type(flight.state) == Completed:
flight.package.remove_flight(flight)
if len(flight.package.flights) == 0:
flight.squadron.coalition.ato.remove_package(flight.package)
if (
not self._auto_resolve_combat(combat_resolution_method, force_continue)
and self.combats
):
events.complete_simulation()
def set_initial_flight_states(self) -> None:
@@ -90,10 +109,9 @@ class AircraftSimulation:
for package in packages:
yield from package.flights
def _auto_resolve_combat(self) -> bool:
return (
self.game.settings.fast_forward_stop_condition
!= FastForwardStopCondition.DISABLED
and self.game.settings.combat_resolution_method
!= CombatResolutionMethod.PAUSE
)
def _auto_resolve_combat(
self, combat_resolution_method: CombatResolutionMethod, force_continue: bool
) -> bool:
if force_continue:
return True
return combat_resolution_method != CombatResolutionMethod.PAUSE

View File

@@ -100,7 +100,11 @@ class GameLoop:
if not self.started:
raise RuntimeError("Attempted to tick game loop before initialization")
try:
self.sim.tick(self.events)
self.sim.tick(
self.events,
self.game.settings.combat_resolution_method,
force_continue=False,
)
self.completed = self.events.simulation_complete
if not suppress_events:
self.send_update(rate_limit=True)

View File

@@ -8,6 +8,7 @@ from game.ground_forces.combat_stance import CombatStance
from game.theater import ControlPoint
from .gameupdateevents import GameUpdateEvents
from ..ato.airtaaskingorder import AirTaskingOrder
from ..ato.flightstate.atdeparture import AtDeparture
if TYPE_CHECKING:
from ..game import Game
@@ -57,6 +58,25 @@ class MissionResultsProcessor:
logging.info(f"{aircraft} destroyed from {squadron}")
squadron.owned_aircraft -= 1
# Remove air losses from the flight. Remove the flight if all aircraft are lost.
# Remove the package if the flight is the last flight in the package.
# This logic is redundant if we are going to a new turn, since the whole ATO is
# regenerated. However if we want to keep the ATO to continue a turn, this update
# is necessary to make sure lost aircraft are removed from the ATO.
if loss.pilot is not None:
loss.flight.roster.remove_pilot(loss.pilot)
if loss.flight.count == 0: # Last aircraft in the flight, remove the flight
# If no flights in package, generally indicates that the loss is an aircraft
# that is not assigned to a mission and is parked on the ground. There is no need
# to remove the aircraft from the ATO as it was never in the ATO in the first place.
if len(loss.flight.package.flights) == 0:
continue
loss.flight.package.remove_flight(loss.flight)
if len(loss.flight.package.flights) == 0:
loss.flight.squadron.coalition.ato.remove_package(
loss.flight.package
)
@staticmethod
def _commit_pilot_experience(ato: AirTaskingOrder) -> None:
for package in ato.packages:
@@ -148,10 +168,21 @@ class MissionResultsProcessor:
iads_network.update_network(events)
return
@staticmethod
def commit_damaged_runways(debriefing: Debriefing) -> None:
def commit_damaged_runways(self, debriefing: Debriefing) -> None:
for damaged_runway in debriefing.damaged_runways:
damaged_runway.damage_runway()
# Remove any flight in ATO scheduled to take off from the damaged runway.
for coalition in self.game.coalitions:
for package in coalition.ato.packages:
for flight in package.flights:
if flight.departure.name == damaged_runway.name and isinstance(
flight.state, AtDeparture
):
flight.package.remove_flight(flight)
if len(flight.package.flights) == 0:
flight.squadron.coalition.ato.remove_package(
flight.package
)
def commit_captures(self, debriefing: Debriefing, events: GameUpdateEvents) -> None:
for captured in debriefing.base_captures:

View File

@@ -7,6 +7,7 @@ from typing import Optional, TYPE_CHECKING
from game.debriefing import Debriefing
from game.missiongenerator import MissionGenerator
from game.settings.settings import FastForwardStopCondition, CombatResolutionMethod
from game.unitmap import UnitMap
from .aircraftsimulation import AircraftSimulation
from .missionresultsprocessor import MissionResultsProcessor
@@ -37,12 +38,25 @@ class MissionSimulation:
self.time = self.game.simulation_time
self.aircraft_simulation.begin_simulation()
def tick(self, events: GameUpdateEvents) -> GameUpdateEvents:
def tick(
self,
events: GameUpdateEvents,
combat_resolution_method: CombatResolutionMethod,
force_continue: bool,
) -> GameUpdateEvents:
self.time += TICK
self.game.simulation_time = self.time
if self.completed:
raise RuntimeError("Simulation already completed")
self.aircraft_simulation.on_game_tick(events, self.time, TICK)
if (
self.game.settings.fast_forward_stop_condition
== FastForwardStopCondition.DISABLED
):
events.complete_simulation()
return events
self.aircraft_simulation.on_game_tick(
events, self.time, TICK, combat_resolution_method, force_continue
)
self.completed = events.simulation_complete
return events
@@ -76,6 +90,24 @@ class MissionSimulation:
self.game.save_last_turn_state()
MissionResultsProcessor(self.game).commit(debriefing, events)
if self.game.settings.turnless_mode:
# Set completed to False to clear completion of any previous simulation tick.
self.completed = False
# If running in turnless mode, run sim to calculate planned positions of flights
# for the duration of time the DCS mission ran.
start_time = copy.deepcopy(self.time)
while self.time < start_time + timedelta(
seconds=int(debriefing.state_data.simulation_time_seconds)
):
# Always skip combat as we are processing results from DCS. Any combat has already
# been resolved in-game
self.tick(events, CombatResolutionMethod.SKIP, force_continue=True)
self.game.blue.plan_missions(self.game.simulation_time)
self.game.red.plan_missions(self.game.simulation_time)
self.game.game_stats.update(self.game)
# Generate begin_new_turn event which triggers a refresh of the React map screen to
# show newly planned missions.
events.begin_new_turn()
def finish(self) -> None:
self.unit_map = None

File diff suppressed because it is too large Load Diff

View File

@@ -9,17 +9,11 @@ from pydcs_extensions.weapon_injector import inject_weapons
class Su57Weapons:
Kh_59MK2 = {"clsid": "{KH_59MK2}", "name": "Kh-59MK2", "weight": None}
RVV_AE = {"clsid": "{RVV-AE}", "name": "RVV-AE", "weight": 250}
RVV_BD = {"clsid": "{RVV-BD}", "name": "RVV-BD", "weight": 600}
RVV_L = {"clsid": "{RVV-L}", "name": "RVV-L", "weight": 748}
RVV_M = {"clsid": "{RVV-M}", "name": "RVV-M", "weight": 190}
R_37M_Active_Rdr = {"clsid": "{RVV-BD}", "name": "R-37M Active Rdr", "weight": 600}
Su_57_Fuel_Tank = {
"clsid": "{SU_57Tank}",
"name": "Su-57 Fuel Tank",
"weight": 1561.421,
}
R_77PD_Active_rdr = {
"clsid": "{RVV-AE}",
"name": "R-77PD Active rdr",
@@ -56,8 +50,10 @@ class Su_57(PlaneType):
class Pylon1:
R_73__AA_11_Archer____Infra_Red = (1, Weapons.R_73__AA_11_Archer____Infra_Red)
R_77PD_Active_rdr = (1, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (1, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (1, Weapons.KS_172_Passive_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (1, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (1, Weapons.K_77M_Active_Rdr)
L_081_Fantasmagoria_ELINT_pod = (1, Weapons.L_081_Fantasmagoria_ELINT_pod)
Smoke_Generator___red = (1, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (1, Weapons.Smoke_Generator___green)
@@ -93,37 +89,37 @@ class Su_57(PlaneType):
2,
Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr,
)
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser = (
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_ = (
2,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_,
)
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided = (
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_ = (
2,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_,
)
Kh_59M__AS_18_Kazoo____930kg__ASM__IN = (
2,
Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN,
)
MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD = (
2,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
2,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation = (
2,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator = (
2,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
BetAB_500___500_kg_Concrete_Piercing_Bomb_LD = (
2,
Weapons.BetAB_500___500kg_Concrete_Piercing_Bomb_LD,
Weapons.BetAB_500___500_kg_Concrete_Piercing_Bomb_LD,
)
KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag = (
2,
@@ -133,12 +129,12 @@ class Su_57(PlaneType):
2,
Weapons.KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP,
)
FAB_250___250kg_GP_Bomb_LD = (2, Weapons.FAB_250___250kg_GP_Bomb_LD)
OFAB_250_270___250_kg_GP_Bomb_LD = (2, Weapons.OFAB_250_270___250_kg_GP_Bomb_LD)
RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP = (
2,
Weapons.RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP,
)
FAB_500_M_62___500kg_GP_Bomb_LD = (2, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD)
FAB_500M_62___500_kg_GP_Bomb_LD = (2, Weapons.FAB_500M_62___500_kg_GP_Bomb_LD)
RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP = (
2,
Weapons.RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP,
@@ -156,21 +152,20 @@ class Su_57(PlaneType):
2,
Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb,
)
MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD = (
2,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD,
)
R_37M_Active_Rdr = (2, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (2, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (2, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (2, Su57Weapons.KS_172_Passive_Rdr)
R_37M_Active_Rdr = (2, Weapons.R_37M_Active_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (2, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (2, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (2, Weapons.KS_172_Passive_Rdr)
Fuel_tank_800L_Wing = (2, Weapons.Fuel_tank_800L_Wing)
RN_28___260_kg__nuclear_bomb__free_fall = (
2,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
)
Su_57_Fuel_Tank = (2, Su57Weapons.Su_57_Fuel_Tank)
Kh_59MK2 = (2, Su57Weapons.Kh_59MK2)
Smoke_Generator___red = (2, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (2, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (2, Weapons.Smoke_Generator___blue)
@@ -214,37 +209,37 @@ class Su_57(PlaneType):
4,
Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr,
)
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser = (
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_ = (
4,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_,
)
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided = (
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_ = (
4,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_,
)
Kh_59M__AS_18_Kazoo____930kg__ASM__IN = (
4,
Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN,
)
MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD = (
4,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation = (
4,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator = (
4,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
BetAB_500___500_kg_Concrete_Piercing_Bomb_LD = (
4,
Weapons.BetAB_500___500kg_Concrete_Piercing_Bomb_LD,
Weapons.BetAB_500___500_kg_Concrete_Piercing_Bomb_LD,
)
KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag = (
4,
@@ -254,12 +249,12 @@ class Su_57(PlaneType):
4,
Weapons.KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP,
)
FAB_250___250kg_GP_Bomb_LD = (4, Weapons.FAB_250___250kg_GP_Bomb_LD)
OFAB_250_270___250_kg_GP_Bomb_LD = (4, Weapons.OFAB_250_270___250_kg_GP_Bomb_LD)
RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP = (
4,
Weapons.RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP,
)
FAB_500_M_62___500kg_GP_Bomb_LD = (4, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD)
FAB_500M_62___500_kg_GP_Bomb_LD = (4, Weapons.FAB_500M_62___500_kg_GP_Bomb_LD)
RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP = (
4,
Weapons.RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP,
@@ -277,158 +272,61 @@ class Su_57(PlaneType):
4,
Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb,
)
MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD = (
4,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD,
)
R_37M_Active_Rdr = (4, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (4, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (4, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (4, Su57Weapons.KS_172_Passive_Rdr)
R_37M_Active_Rdr = (4, Weapons.R_37M_Active_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (4, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (4, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (4, Weapons.KS_172_Passive_Rdr)
RN_28___260_kg__nuclear_bomb__free_fall = (
4,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
)
Su_57_Fuel_Tank = (4, Su57Weapons.Su_57_Fuel_Tank)
Kh_59MK2 = (4, Su57Weapons.Kh_59MK2)
class Pylon5:
R_77__AA_12_Adder____Active_Rdr = (5, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (5, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (5, Su57Weapons.K_77M_Active_Rdr)
Kh_59MK2 = (5, Su57Weapons.Kh_59MK2)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (5, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (5, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (5, Weapons.KS_172_Passive_Rdr)
class Pylon6:
R_77__AA_12_Adder____Active_Rdr = (6, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (6, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (6, Su57Weapons.K_77M_Active_Rdr)
Kh_59MK2 = (6, Su57Weapons.Kh_59MK2)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (6, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (6, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (6, Weapons.KS_172_Passive_Rdr)
class Pylon7:
R_77__AA_12_Adder____Active_Rdr = (7, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (7, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (7, Su57Weapons.K_77M_Active_Rdr)
Kh_59MK2 = (7, Su57Weapons.Kh_59MK2)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (7, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (7, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (7, Weapons.KS_172_Passive_Rdr)
class Pylon8:
R_77__AA_12_Adder____Active_Rdr = (8, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (8, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (8, Su57Weapons.K_77M_Active_Rdr)
Kh_59MK2 = (8, Su57Weapons.Kh_59MK2)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (8, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (8, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (8, Weapons.KS_172_Passive_Rdr)
class Pylon9:
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
9,
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
)
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
9,
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
)
R_27T__AA_10_Alamo_B____Infra_Red = (
9,
Weapons.R_27T__AA_10_Alamo_B____Infra_Red,
)
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
9,
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
)
R_77__AA_12_Adder____Active_Rdr = (9, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_73__AA_11_Archer____Infra_Red = (9, Weapons.R_73__AA_11_Archer____Infra_Red)
Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr = (
9,
Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr,
)
Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr = (
9,
Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr,
)
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser = (
9,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser,
)
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided = (
9,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided,
)
Kh_59M__AS_18_Kazoo____930kg__ASM__IN = (
9,
Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN,
)
MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD = (
9,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
9,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
9,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
9,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
9,
Weapons.BetAB_500___500kg_Concrete_Piercing_Bomb_LD,
)
KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag = (
9,
Weapons.KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag,
)
KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP = (
9,
Weapons.KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP,
)
FAB_250___250kg_GP_Bomb_LD = (9, Weapons.FAB_250___250kg_GP_Bomb_LD)
RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP = (
9,
Weapons.RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP,
)
FAB_500_M_62___500kg_GP_Bomb_LD = (9, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD)
RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP = (
9,
Weapons.RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP,
)
KAB_500LG___500kg_Laser_Guided_Bomb = (
9,
Weapons.KAB_500LG___500kg_Laser_Guided_Bomb,
)
KAB_500Kr___500kg_TV_Guided_Bomb = (9, Weapons.KAB_500Kr___500kg_TV_Guided_Bomb)
FAB_1500_M_54___1500kg_GP_Bomb_LD = (
9,
Weapons.FAB_1500_M_54___1500kg_GP_Bomb_LD,
)
KAB_1500L___1500kg_Laser_Guided_Bomb = (
9,
Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb,
)
MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD = (
9,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
)
R_37M_Active_Rdr = (9, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (9, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (9, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (9, Su57Weapons.KS_172_Passive_Rdr)
RN_28___260_kg__nuclear_bomb__free_fall = (
9,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
)
Su_57_Fuel_Tank = (9, Su57Weapons.Su_57_Fuel_Tank)
Kh_59MK2 = (9, Su57Weapons.Kh_59MK2)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (9, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (9, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (9, Weapons.KS_172_Passive_Rdr)
class Pylon10:
R_73__AA_11_Archer____Infra_Red = (10, Weapons.R_73__AA_11_Archer____Infra_Red)
Smoke_Generator___red = (10, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (10, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (10, Weapons.Smoke_Generator___blue)
Smoke_Generator___white = (10, Weapons.Smoke_Generator___white)
Smoke_Generator___yellow = (10, Weapons.Smoke_Generator___yellow)
Smoke_Generator___orange = (10, Weapons.Smoke_Generator___orange)
R_77__AA_12_Adder____Active_Rdr = (10, Weapons.R_77__AA_12_Adder____Active_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (10, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (10, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (10, Weapons.KS_172_Passive_Rdr)
class Pylon11:
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
@@ -457,37 +355,37 @@ class Su_57(PlaneType):
11,
Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr,
)
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser = (
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_ = (
11,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_,
)
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided = (
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_ = (
11,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_,
)
Kh_59M__AS_18_Kazoo____930kg__ASM__IN = (
11,
Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN,
)
MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD = (
11,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
11,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation = (
11,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator = (
11,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
BetAB_500___500_kg_Concrete_Piercing_Bomb_LD = (
11,
Weapons.BetAB_500___500kg_Concrete_Piercing_Bomb_LD,
Weapons.BetAB_500___500_kg_Concrete_Piercing_Bomb_LD,
)
KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag = (
11,
@@ -497,12 +395,15 @@ class Su_57(PlaneType):
11,
Weapons.KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP,
)
FAB_250___250kg_GP_Bomb_LD = (11, Weapons.FAB_250___250kg_GP_Bomb_LD)
OFAB_250_270___250_kg_GP_Bomb_LD = (
11,
Weapons.OFAB_250_270___250_kg_GP_Bomb_LD,
)
RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP = (
11,
Weapons.RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP,
)
FAB_500_M_62___500kg_GP_Bomb_LD = (11, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD)
FAB_500M_62___500_kg_GP_Bomb_LD = (11, Weapons.FAB_500M_62___500_kg_GP_Bomb_LD)
RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP = (
11,
Weapons.RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP,
@@ -523,33 +424,22 @@ class Su_57(PlaneType):
11,
Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb,
)
MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD = (
MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD = (
11,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
Weapons.MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD,
)
# ERRR {R-33}
R_37M_Active_Rdr = (11, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (11, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (11, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (11, Su57Weapons.KS_172_Passive_Rdr)
Fuel_tank_800L_Wing = (11, Weapons.Fuel_tank_800L_Wing)
Su_57_Fuel_Tank = (11, Su57Weapons.Su_57_Fuel_Tank)
R_37M_Active_Rdr = (11, Weapons.R_37M_Active_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (11, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (11, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (11, Weapons.KS_172_Passive_Rdr)
RN_28___260_kg__nuclear_bomb__free_fall = (
11,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
)
Smoke_Generator___red = (11, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (11, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (11, Weapons.Smoke_Generator___blue)
Smoke_Generator___white = (11, Weapons.Smoke_Generator___white)
Smoke_Generator___yellow = (11, Weapons.Smoke_Generator___yellow)
Smoke_Generator___orange = (11, Weapons.Smoke_Generator___orange)
Kh_59MK2 = (11, Su57Weapons.Kh_59MK2)
class Pylon12:
R_73__AA_11_Archer____Infra_Red = (12, Weapons.R_73__AA_11_Archer____Infra_Red)
R_77PD_Active_rdr = (12, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (12, Su57Weapons.K_77M_Active_Rdr)
Smoke_Generator___red = (12, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (12, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (12, Weapons.Smoke_Generator___blue)
@@ -557,7 +447,140 @@ class Su_57(PlaneType):
Smoke_Generator___yellow = (12, Weapons.Smoke_Generator___yellow)
Smoke_Generator___orange = (12, Weapons.Smoke_Generator___orange)
pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
class Pylon13:
R_27R__AA_10_Alamo_A____Semi_Act_Rdr = (
13,
Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr,
)
R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = (
13,
Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range,
)
R_27T__AA_10_Alamo_B____Infra_Red = (
13,
Weapons.R_27T__AA_10_Alamo_B____Infra_Red,
)
R_27ET__AA_10_Alamo_D____IR_Extended_Range = (
13,
Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range,
)
R_77__AA_12_Adder____Active_Rdr = (13, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_73__AA_11_Archer____Infra_Red = (13, Weapons.R_73__AA_11_Archer____Infra_Red)
Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr = (
13,
Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr,
)
Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr = (
13,
Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr,
)
Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_ = (
13,
Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_,
)
Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_ = (
13,
Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_,
)
Kh_59M__AS_18_Kazoo____930kg__ASM__IN = (
13,
Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN,
)
MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD = (
13,
Weapons.MBD3_U6_68___6_x_OFAB_100_120___100_kg_GP_Bomb_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
13,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation = (
13,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
)
O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator = (
13,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
)
BetAB_500___500_kg_Concrete_Piercing_Bomb_LD = (
13,
Weapons.BetAB_500___500_kg_Concrete_Piercing_Bomb_LD,
)
KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag = (
13,
Weapons.KMGU_2___96_x_AO_2_5RT_Dispenser__CBU__HE_Frag,
)
KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP = (
13,
Weapons.KMGU_2___96_x_PTAB_2_5KO_Dispenser__CBU__HEAT_AP,
)
OFAB_250_270___250_kg_GP_Bomb_LD = (
13,
Weapons.OFAB_250_270___250_kg_GP_Bomb_LD,
)
RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP = (
13,
Weapons.RBK_250___42_x_PTAB_2_5M__250kg_CBU_Medium_HEAT_AP,
)
FAB_500M_62___500_kg_GP_Bomb_LD = (13, Weapons.FAB_500M_62___500_kg_GP_Bomb_LD)
RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP = (
13,
Weapons.RBK_500_255___30_x_PTAB_10_5__500kg_CBU_Heavy_HEAT_AP,
)
KAB_500LG___500kg_Laser_Guided_Bomb = (
13,
Weapons.KAB_500LG___500kg_Laser_Guided_Bomb,
)
KAB_500Kr___500kg_TV_Guided_Bomb = (
13,
Weapons.KAB_500Kr___500kg_TV_Guided_Bomb,
)
FAB_1500_M_54___1500kg_GP_Bomb_LD = (
13,
Weapons.FAB_1500_M_54___1500kg_GP_Bomb_LD,
)
KAB_1500L___1500kg_Laser_Guided_Bomb = (
13,
Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb,
)
MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD = (
13,
Weapons.MBD3_U6_68___6_x_OFAB_250_270___250_kg_GP_Bomb_LD,
)
# ERRR {R-33}
R_37M_Active_Rdr = (13, Weapons.R_37M_Active_Rdr)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (13, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (13, Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (13, Weapons.KS_172_Passive_Rdr)
Fuel_tank_800L_Wing = (13, Weapons.Fuel_tank_800L_Wing)
RN_28___260_kg__nuclear_bomb__free_fall = (
13,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
)
Smoke_Generator___red = (13, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (13, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (13, Weapons.Smoke_Generator___blue)
Smoke_Generator___white = (13, Weapons.Smoke_Generator___white)
Smoke_Generator___yellow = (13, Weapons.Smoke_Generator___yellow)
Smoke_Generator___orange = (13, Weapons.Smoke_Generator___orange)
class Pylon14:
R_73__AA_11_Archer____Infra_Red = (14, Weapons.R_73__AA_11_Archer____Infra_Red)
# ERRR {RVV-AE}
R_77PD_Active_rdr = (14, Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (14, Weapons.K_77M_Active_Rdr)
Smoke_Generator___red = (14, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (14, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (14, Weapons.Smoke_Generator___blue)
Smoke_Generator___white = (14, Weapons.Smoke_Generator___white)
Smoke_Generator___yellow = (14, Weapons.Smoke_Generator___yellow)
Smoke_Generator___orange = (14, Weapons.Smoke_Generator___orange)
class Pylon15:
Mercury_LLTV_Pod = (15, Weapons.Mercury_LLTV_Pod)
pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
tasks = [
task.CAP,

View File

@@ -50,10 +50,7 @@ class QTopPanel(QFrame):
self.conditionsWidget = QConditionsWidget(sim_controller)
self.budgetBox = QBudgetBox(self.game)
pass_turn_text = "Pass Turn"
if not self.game or self.game.turn == 0:
pass_turn_text = "Begin Campaign"
self.passTurnButton = QPushButton(pass_turn_text)
self.passTurnButton = QPushButton(self._pass_turn_button_text(self.game))
self.passTurnButton.setIcon(CONST.ICONS["PassTurn"])
self.passTurnButton.setProperty("style", "btn-primary")
self.passTurnButton.clicked.connect(self.passTurn)
@@ -120,11 +117,9 @@ class QTopPanel(QFrame):
self.factionsInfos.setGame(game)
self.passTurnButton.setEnabled(True)
if game and game.turn > 0:
self.passTurnButton.setText("Pass Turn")
self.passTurnButton.setText(self._pass_turn_button_text(game))
if game and game.turn == 0:
self.passTurnButton.setText("Begin Campaign")
self.proceedButton.setEnabled(False)
else:
self.proceedButton.setEnabled(True)
@@ -283,3 +278,11 @@ class QTopPanel(QFrame):
def budget_update(self, game: Game):
self.budgetBox.setGame(game)
def _pass_turn_button_text(self, game: Game) -> None:
if game and game.turn > 0:
if game.settings.turnless_mode:
return "End Turn"
else:
return "Pass Turn"
return "Begin campaign"

View File

@@ -571,7 +571,8 @@ class QLiberationWindow(QMainWindow):
if state is not TurnState.CONTINUE:
GameOverDialog(won=state is TurnState.WIN, parent=self).exec()
else:
self.game.pass_turn()
if not self.game.settings.turnless_mode:
self.game.pass_turn()
GameUpdateSignal.get_instance().updateGame(self.game)
def open_tgo_info_dialog(self, tgo: TheaterGroundObject) -> None:

View File

@@ -843,7 +843,7 @@ class GeneratorOptions(QtWidgets.QWizardPage):
modLayout = QtWidgets.QGridLayout()
modLayout_row = 1
modLayout.addWidget(
QtWidgets.QLabel("A-4E Skyhawk (version 2.2.0)"), modLayout_row, 0
QtWidgets.QLabel("A-4E Skyhawk (version 2.3.0)"), modLayout_row, 0
)
modLayout.addWidget(a4_skyhawk, modLayout_row, 1)
modLayout_row += 1

View File

@@ -36,8 +36,8 @@ pre-commit==3.5.0
pydantic==2.5.2
pydantic-settings==2.1.0
pydantic_core==2.14.5
pydcs @ git+https://github.com/dcs-liberation/dcs@38989596a8ec20d4095b9d84541d7a7bafa36704
pyinstaller==5.13.1
pydcs @ git+https://github.com/dcs-liberation/dcs@046ed928de5d4aae1652251b87e46517ab334f6e
pyinstaller==6.0.0
pyinstaller-hooks-contrib==2023.6
pyproj==3.6.1
PySide6==6.4.1

View File

@@ -178,15 +178,15 @@ local unitPayloads = {
["name"] = "Liberation SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 5,
},
[2] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "<CLEAN>",
["num"] = 4,
},
[4] = {
@@ -194,7 +194,7 @@ local unitPayloads = {
["num"] = 3,
},
[5] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "<CLEAN>",
["num"] = 2,
},
},
@@ -265,15 +265,15 @@ local unitPayloads = {
["name"] = "Liberation SEAD Escort",
["pylons"] = {
[1] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 5,
},
[2] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "<CLEAN>",
["num"] = 4,
},
[4] = {
@@ -281,7 +281,7 @@ local unitPayloads = {
["num"] = 3,
},
[5] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "<CLEAN>",
["num"] = 2,
},
},
@@ -352,11 +352,11 @@ local unitPayloads = {
["name"] = "Liberation DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 5,
},
[2] = {
["CLSID"] = "{AGM_45A}",
["CLSID"] = "{C_A4E_AGM-45B_LAU34}",
["num"] = 1,
},
[3] = {

View File

@@ -0,0 +1,344 @@
local unitPayloads = {
["name"] = "F-14A",
["payloads"] = {
[1] = {
["name"] = "CAP",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 L}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 R}",
["num"] = 9,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{AIM_54C_Mk47}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{AIM_54C_Mk47}",
["num"] = 4,
},
[9] = {
["CLSID"] = "{AIM_54C_Mk47}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{AIM_54C_Mk47}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 10,
},
},
[2] = {
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{F14-LANTIRN-TP}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{PHXBRU3242_2*LAU10 LS}",
["num"] = 2,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 4,
},
[9] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 10,
},
},
[3] = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{F14-LANTIRN-TP}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{SHOULDER AIM-7MH}",
["num"] = 2,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 4,
},
[9] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 10,
},
},
[4] = {
["name"] = "BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{F14-LANTIRN-TP}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{PHXBRU3242_2*LAU10 LS}",
["num"] = 2,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{BRU-32 MK-82}",
["num"] = 4,
},
[9] = {
["CLSID"] = "{BRU-32 MK-20}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{BRU-32 MK-20}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 10,
},
},
[5] = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "{F14-LANTIRN-TP}",
["num"] = 9,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[3] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[4] = {
["CLSID"] = "{PHXBRU3242_2*LAU10 LS}",
["num"] = 2,
},
[5] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{BRU-32 GBU-16}",
["num"] = 4,
},
[7] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 6,
},
[8] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 5,
},
[9] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[10] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
},
["tasks"] = {
[1] = 10,
},
},
[6] = {
["name"] = "Liberation DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 L}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 R}",
["num"] = 9,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{MAK79_MK82 4}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{MAK79_MK82 3R}",
["num"] = 6,
},
[9] = {
["CLSID"] = "{MAK79_MK82 3L}",
["num"] = 5,
},
[10] = {
["CLSID"] = "{MAK79_MK82 4}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 31,
},
},
[7] = {
["displayName"] = "Liberation SEAD",
["name"] = "Liberation SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 10,
},
[2] = {
["CLSID"] = "{LAU-138 wtip - AIM-9M}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 L}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{SHOULDER AIM_54C_Mk47 R}",
["num"] = 9,
},
[5] = {
["CLSID"] = "{F14-300gal}",
["num"] = 8,
},
[6] = {
["CLSID"] = "{F14-300gal}",
["num"] = 3,
},
[7] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 6,
},
[9] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 5,
},
[10] = {
["CLSID"] = "{BRU3242_ADM141}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 31,
},
},
},
["unitType"] = "F-14A-135-GR-Early",
}
return unitPayloads

View File

@@ -0,0 +1,224 @@
local unitPayloads = {
["name"] = "MiG-29A",
["payloads"] = {
[1] = {
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
[2] = {
["CLSID"] = "B-8M1 - 20 S-8OFP2",
["num"] = 5,
},
[3] = {
["CLSID"] = "B-8M1 - 20 S-8OFP2",
["num"] = 6,
},
[4] = {
["CLSID"] = "B-8M1 - 20 S-8OFP2",
["num"] = 3,
},
[5] = {
["CLSID"] = "B-8M1 - 20 S-8OFP2",
["num"] = 2,
},
[6] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[7] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 30,
},
},
[2] = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["num"] = 6,
},
[7] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
},
["tasks"] = {
[1] = 32,
},
},
[3] = {
["name"] = "CAP",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{9B25D316-0434-4954-868F-D51DB1A38DF0}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{9B25D316-0434-4954-868F-D51DB1A38DF0}",
["num"] = 5,
},
[5] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 6,
},
[6] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
[7] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 10,
},
},
[4] = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
[2] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 5,
},
[3] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 6,
},
[4] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 2,
},
[6] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[7] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 30,
},
},
[5] = {
["name"] = "SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
[2] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 5,
},
[3] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 6,
},
[4] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{3858707D-F5D5-4bbb-BDD8-ABB0530EBC7C}",
["num"] = 2,
},
[6] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[7] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 30,
},
},
[6] = {
["displayName"] = "OCA/Runway",
["name"] = "OCA/Runway",
["pylons"] = {
[1] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{BD289E34-DF84-4C5E-9220-4B14C346E79D}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{BD289E34-DF84-4C5E-9220-4B14C346E79D}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{PTB_1500_MIG29A}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{BD289E34-DF84-4C5E-9220-4B14C346E79D}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{BD289E34-DF84-4C5E-9220-4B14C346E79D}",
["num"] = 6,
},
[7] = {
["CLSID"] = "{FBC29BFE-3D24-4C64-B81D-941239D12249}",
["num"] = 7,
},
},
["tasks"] = {
[1] = 34,
},
},
},
["unitType"] = "MiG-29 Fulcrum",
}
return unitPayloads

View File

@@ -6,6 +6,8 @@ max_ingress_distance_nm: 30
min_ingress_distance_nm: 10
rendezvous_altitude_ft_msl: 22000
combat_altitude_ft_msl: 18000
aewc:
duration_minutes: 240
cap:
duration_minutes: 30
min_track_length_nm: 12

View File

@@ -6,6 +6,8 @@ max_ingress_distance_nm: 45
min_ingress_distance_nm: 10
rendezvous_altitude_ft_msl: 25000
combat_altitude_ft_msl: 20000
aewc:
duration_minutes: 240
cap:
duration_minutes: 30
min_track_length_nm: 15

View File

@@ -6,6 +6,8 @@ max_ingress_distance_nm: 7
min_ingress_distance_nm: 5
rendezvous_altitude_ft_msl: 10000
combat_altitude_ft_msl: 8000
aewc:
duration_minutes: 240
cap:
duration_minutes: 30
min_track_length_nm: 8

View File

@@ -14,6 +14,7 @@ aircrafts:
- C-130
- C-130J-30 Super Hercules
- F-117A Nighthawk
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-15C Eagle

View File

@@ -15,6 +15,7 @@ aircrafts:
- C-130
- C-130J-30 Super Hercules
- F-117A Nighthawk
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-15C Eagle

View File

@@ -10,6 +10,7 @@ aircrafts:
- B-52H Stratofortress
- C-130
- C-130J-30 Super Hercules
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-4E-45MC Phantom II

View File

@@ -17,6 +17,7 @@ aircrafts:
- C-47 Dakota
- CH-47D
- CH-53E
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-15C Eagle

View File

@@ -7,6 +7,7 @@ locales:
- fa_IR
aircrafts:
- AH-1J SeaCobra
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-4E-45MC Phantom II
- F-5E Tiger II

View File

@@ -6,6 +6,7 @@ description: <p>Iranian 2010s faction</p>
locales:
- fa_IR
aircrafts:
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-4E-45MC Phantom II
- F-5E Tiger II
@@ -14,6 +15,7 @@ aircrafts:
- Mi-24P Hind-F
- Mi-28N Havoc
- MiG-21bis Fishbed-N
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
- Mirage-F1EQ
- Su-22M4 Fitter-K

View File

@@ -13,6 +13,7 @@ aircrafts:
- MiG-21bis Fishbed-N
- MiG-23ML Flogger-G
- MiG-25PD Foxbat-E
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
- Mirage-F1EQ
- SA 342M Gazelle

View File

@@ -11,6 +11,7 @@ aircrafts:
- MiG-19P Farmer-B
- MiG-21bis Fishbed-N
- MiG-23MLD Flogger-K
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
awacs:
- A-50

View File

@@ -10,6 +10,7 @@ aircrafts:
- Mi-24V Hind-E
- Mi-24P Hind-F
- Mi-8MTV2 Hip
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
- MiG-29G Fulcrum-A
- Su-22M4 Fitter-K

View File

@@ -13,6 +13,7 @@ aircrafts:
- MiG-21bis Fishbed-N
- MiG-23MLD Flogger-K
- MiG-25PD Foxbat-E
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
- Su-17M4 Fitter-K
- Su-24M Fencer-D

View File

@@ -14,6 +14,7 @@ aircrafts:
- MiG-23MLD Flogger-K
- MiG-25PD Foxbat-E
- MiG-27K Flogger-J2
- MIG-29-FULCRUM
- MiG-29A Fulcrum-A
- MiG-31 Foxhound
- Su-17M4 Fitter-K

View File

@@ -6,6 +6,7 @@ description: <p>US military during the Vietnam War from 1965 to 1975</p>
locales:
- en_US
aircrafts:
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-4C Phantom II
- F-4B Phantom II

View File

@@ -10,6 +10,7 @@ aircrafts:
- C-130
- CH-47D
- CH-53E
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-4E-45MC Phantom II
- F-4B Phantom II

View File

@@ -16,6 +16,7 @@ aircrafts:
- CH-47D
- CH-53E
- F-117A Nighthawk
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-15C Eagle

View File

@@ -8,6 +8,7 @@ locales:
aircrafts:
- AH-1W SuperCobra
- A-4E Skyhawk
- F-14A Tomcat (Block 135-GR Early)
- F-14A Tomcat (Block 135-GR Late)
- F-14B Tomcat
- F-4B Phantom II

View File

@@ -4,6 +4,7 @@ local WRITESTATE_SCHEDULE_IN_SECONDS = 60
logger = mist.Logger:new("DCSLiberation", "info")
logger:info("Check that json.lua is loaded : json = "..tostring(json))
simulation_time_seconds = 0
crash_events = {} -- killed aircraft will be added via S_EVENT_CRASH event
dead_events = {} -- killed units will be added via S_EVENT_DEAD event
unit_lost_events = {} -- killed units will be added via S_EVENT_UNIT_LOST
@@ -43,6 +44,7 @@ function write_state()
["destroyed_objects_positions"] = destroyed_objects_positions,
["killed_ground_units"] = killed_ground_units,
["unit_hit_point_updates"] = unit_hit_point_updates,
["simulation_time_seconds"] = simulation_time_seconds
}
if not json then
local message = string.format("Unable to save DCS Liberation state to %s, JSON library is not loaded !", _debriefing_file_location)
@@ -160,6 +162,9 @@ end
activeWeapons = {}
local function onEvent(event)
simulation_time_seconds = event.time
if event.id == world.event.S_EVENT_CRASH and event.initiator then
crash_events[#crash_events + 1] = event.initiator.getName(event.initiator)
write_state()

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,62 @@
carrier_capable: true
description:
"The Grumman F-14 Tomcat is a two-crew, variable wing-geometry, maritime\
\ air superiority fighter that served with the US Navy for 32 years and continues\
\ to serve with the IRIAF in Iran. The F-14 was the US Navy's frontline fighter\
\ from the 1970s to the mid-2000s. Over the course of its long service it also became\
\ one of the US Navy\u2019s premier precision ground-attack platform and its lone\
\ airborne reconnaissance asset.\n\nNoteworthy features of the Tomcat are its swing-wing\
\ configuration, two-man crew, and the powerful AN/AWG-9 Weapons Control System\
\ (WCS) and radar. The AWG-9 allows employment of the long-range AIM-54 Phoenix\
\ air-to-air missile, and the LANTIRN targeting pod allows precision ground strikes\
\ using laser-guided bombs. The F-14 Tomcat was present in several historic events\
\ that include the two Gulf of Sidra incidents, Operations Desert Storm Iraqi Freedom,\
\ the Yugoslavian conflict, and Operation Enduring Freedom over Afghanistan. It\
\ was also immortalized in the iconic motion picture, Top Gun, and starred in several\
\ other feature films including The Final Countdown, Executive Decision, and others.\n\
\nThe Tomcat was also played a vital role in the Iran-Iraq war of the 1980s, where\
\ is flew for the Islamic Republic of Iran Air Force."
introduced: 1984
manufacturer: Grumman
origin: USA
price: 22
role: Carrier-based Air-Superiority Fighter/Fighter Bomber
max_range: 350
variants:
F-14A Tomcat (Block 135-GR Early): {}
radios:
intra_flight: AN/ARC-182
inter_flight: AN/ARC-159
channels:
type: common
namer: tomcat
intra_flight_radio_index: 2
inter_flight_radio_index: 1
default_overrides:
INSAlignmentStored: true
# ALE39Loadout: 0
# IlsChannel: 1
# KY28Key: 1
# LGB1: 8
# LGB10: 8
# LGB100: 6
# LGB1000: 1
# M61BURST: 0
# TacanBand: 0
# TacanChannel: 0
# UseLAU138: true
tasks:
BAI: 630
BARCAP: 520
CAS: 630
DEAD: 240
Escort: 520
Fighter sweep: 520
Intercept: 520
OCA/Aircraft: 630
OCA/Runway: 550
SEAD: 90
SEAD Escort: 90
Strike: 550
TARCAP: 520
hit_points: 20

View File

@@ -0,0 +1,52 @@
description:
'The MiG-29 "Fulcrum" is a Russian-designed, twin-engine, supersonic
fighter. First operational in the early 1980s, the Fulcrum is a "light weight" fighter,
comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction
with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon
and both infrared and radar guided air-to-air missiles. For air-to-ground tasks,
the MiG-29 can be armed with a large array of unguided bombs and rockets.
In addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped
with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to
detect and target enemy aircraft just based on target infrared emissions. This allows
the MiG-29 to make stealthy attacks with no warning!
The Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with
the helmet mounted sight and the AA-11 "Archer" air-to-air missile, it is a very
lethal adversary.
The MiG-29 has also been widely exported and has served in many countries that include
Germany, Iran, Ukraine, and Poland.'
introduced: 1983
manufacturer: Mikoyan
origin: USSR/Russia
price: 15
role: Multirole Fighter
max_range: 150
variants:
MIG-29-FULCRUM:
display_name: MiG-29A Fulcrum-A
kneeboard_units: "metric"
radios:
intra_flight: R862
inter_flight: R862
channels:
type: common
namer: fulcrum
intra_flight_radio_index: 1
inter_flight_radio_index: 1
tasks:
BAI: 530
BARCAP: 370
CAS: 530
Escort: 370
Fighter sweep: 370
Intercept: 370
OCA/Aircraft: 530
OCA/Runway: 410
Strike: 410
TARCAP: 370
hit_points: 16

View File

@@ -27,7 +27,8 @@ price: 15
role: Multirole Fighter
max_range: 150
variants:
MiG-29A Fulcrum-A: {}
MiG-29A Fulcrum-A:
display_name: MiG-29A Fulcrum-A (FC3)
kneeboard_units: "metric"
tasks:
BAI: 530