mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Compare commits
44 Commits
6.0.0
...
develop-6.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
801e9efe8c | ||
|
|
5708fe625b | ||
|
|
1dda0c9497 | ||
|
|
56d7641251 | ||
|
|
938d6b4bdf | ||
|
|
5caf07f476 | ||
|
|
d1d4fde6a3 | ||
|
|
440fe2e019 | ||
|
|
c82bc1c211 | ||
|
|
f855d2956c | ||
|
|
24aebf5ff6 | ||
|
|
8004dccdb2 | ||
|
|
7e7cb4f0bc | ||
|
|
801e3afb98 | ||
|
|
48ea33611d | ||
|
|
7b588c5437 | ||
|
|
e85b1a3195 | ||
|
|
8132b9a080 | ||
|
|
8e0cf2284b | ||
|
|
87405ba58a | ||
|
|
0952cf4c75 | ||
|
|
5bf5b41f2d | ||
|
|
715c60583a | ||
|
|
5dcd1e9360 | ||
|
|
ef7978e887 | ||
|
|
8cfb1790b2 | ||
|
|
41203b9bed | ||
|
|
50fb1f5d97 | ||
|
|
e041fa3c70 | ||
|
|
f358c1c0b2 | ||
|
|
a18dbe0a72 | ||
|
|
00e7a1fe55 | ||
|
|
b664a8cac5 | ||
|
|
2c4678aa48 | ||
|
|
eafc70a5e5 | ||
|
|
7fb1d25887 | ||
|
|
d9491c47b8 | ||
|
|
2c26f366a8 | ||
|
|
c30636b4d2 | ||
|
|
a3a91c5771 | ||
|
|
3d64619481 | ||
|
|
3b97f7a2ba | ||
|
|
6779ee96be | ||
|
|
d9134650dc |
76
.gitattributes
vendored
76
.gitattributes
vendored
@@ -14,3 +14,79 @@
|
|||||||
*.pyo binary export-ignore
|
*.pyo binary export-ignore
|
||||||
*.pyd binary
|
*.pyd binary
|
||||||
unshipped_data/arcgis_maps/ filter=lfs diff=lfs merge=lfs -text
|
unshipped_data/arcgis_maps/ filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
||||||
|
# https://github.com/alexkaratarakis/gitattributes/blob/master/Common.gitattributes
|
||||||
|
# Documents
|
||||||
|
*.bibtex text diff=bibtex
|
||||||
|
*.doc diff=astextplain
|
||||||
|
*.DOC diff=astextplain
|
||||||
|
*.docx diff=astextplain
|
||||||
|
*.DOCX diff=astextplain
|
||||||
|
*.dot diff=astextplain
|
||||||
|
*.DOT diff=astextplain
|
||||||
|
*.pdf diff=astextplain
|
||||||
|
*.PDF diff=astextplain
|
||||||
|
*.rtf diff=astextplain
|
||||||
|
*.RTF diff=astextplain
|
||||||
|
*.md text diff=markdown
|
||||||
|
*.mdx text diff=markdown
|
||||||
|
*.tex text diff=tex
|
||||||
|
*.adoc text
|
||||||
|
*.textile text
|
||||||
|
*.mustache text
|
||||||
|
*.csv text
|
||||||
|
*.tab text
|
||||||
|
*.tsv text
|
||||||
|
*.txt text
|
||||||
|
*.sql text
|
||||||
|
*.epub diff=astextplain
|
||||||
|
|
||||||
|
# Graphics
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.gif binary
|
||||||
|
*.tif binary
|
||||||
|
*.tiff binary
|
||||||
|
*.ico binary
|
||||||
|
# SVG treated as text by default.
|
||||||
|
*.svg text
|
||||||
|
# If you want to treat it as binary,
|
||||||
|
# use the following line instead.
|
||||||
|
# *.svg binary
|
||||||
|
*.eps binary
|
||||||
|
|
||||||
|
# Scripts
|
||||||
|
*.bash text eol=lf
|
||||||
|
*.fish text eol=lf
|
||||||
|
*.sh text eol=lf
|
||||||
|
*.zsh text eol=lf
|
||||||
|
# These are explicitly windows files and should use crlf
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.cmd text eol=crlf
|
||||||
|
*.ps1 text eol=crlf
|
||||||
|
|
||||||
|
# Serialisation
|
||||||
|
*.json text
|
||||||
|
*.toml text
|
||||||
|
*.xml text
|
||||||
|
*.yaml text
|
||||||
|
*.yml text
|
||||||
|
|
||||||
|
# Archives
|
||||||
|
*.7z binary
|
||||||
|
*.gz binary
|
||||||
|
*.tar binary
|
||||||
|
*.tgz binary
|
||||||
|
*.zip binary
|
||||||
|
|
||||||
|
# Text files where line endings should be preserved
|
||||||
|
*.patch -text
|
||||||
|
|
||||||
|
#
|
||||||
|
# Exclude files from exporting
|
||||||
|
#
|
||||||
|
|
||||||
|
.gitattributes export-ignore
|
||||||
|
.gitignore export-ignore
|
||||||
|
.gitkeep export-ignore
|
||||||
25
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
25
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
@@ -31,12 +31,13 @@ body:
|
|||||||
If the bug was found in a development build, select "Development build"
|
If the bug was found in a development build, select "Development build"
|
||||||
and provide a link to the build in the field below.
|
and provide a link to the build in the field below.
|
||||||
options:
|
options:
|
||||||
- 5.2.0
|
- 6.0.0
|
||||||
- Development build
|
- Development build
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Build information
|
label: Build information
|
||||||
description: The build information from the Help -> Report an issue window.
|
description:
|
||||||
|
The build information from the Help -> Report an issue window.
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Description
|
label: Description
|
||||||
@@ -52,18 +53,17 @@ body:
|
|||||||
description: >
|
description: >
|
||||||
Attach any files needed to reproduce the bug here. **A save game is
|
Attach any files needed to reproduce the bug here. **A save game is
|
||||||
required.** We typically cannot help without a save game (the
|
required.** We typically cannot help without a save game (the
|
||||||
`.liberation` file found in
|
`.liberation` file found in `%USERPROFILE%/Saved
|
||||||
`%USERPROFILE%/Saved Games/DCS/Liberation/Saves`), so most bugs filed
|
Games/DCS/Liberation/Saves`), so most bugs filed without saved games
|
||||||
without saved games will be closed without investigation.
|
will be closed without investigation.
|
||||||
|
|
||||||
|
|
||||||
Other useful files to include are:
|
Other useful files to include are:
|
||||||
|
|
||||||
|
|
||||||
The Liberation log file. The log file is located at
|
The Liberation log file. The log file is located at `<Liberation install
|
||||||
`<Liberation install directory>/logs/liberation.log`. The log often
|
directory>/logs/liberation.log`. The log often includes data about
|
||||||
includes data about non-fatal errors that could be the root cause of the
|
non-fatal errors that could be the root cause of the problem.
|
||||||
problem.
|
|
||||||
|
|
||||||
|
|
||||||
The `liberation_nextturn.miz` or a track file. This should always be
|
The `liberation_nextturn.miz` or a track file. This should always be
|
||||||
@@ -73,11 +73,12 @@ body:
|
|||||||
|
|
||||||
The `state.json` file for the most recently completed turn, located at
|
The `state.json` file for the most recently completed turn, located at
|
||||||
`<Liberation install directory>/state.json`. This file is essential for
|
`<Liberation install directory>/state.json`. This file is essential for
|
||||||
investigating any issues with end-of-turn results processing.
|
investigating any issues with end-of-turn results processing. **If you
|
||||||
|
include this file, also include `last_turn.liberation`.**
|
||||||
|
|
||||||
|
|
||||||
You can attach files to the bug by dragging and dropping the file
|
You can attach files to the bug by dragging and dropping the file into
|
||||||
into this text box. GitHub will not allow uploads of all file types, so
|
this text box. GitHub will not allow uploads of all file types, so
|
||||||
attach a zip of the files if needed.
|
attach a zip of the files if needed.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
21
.github/ISSUE_TEMPLATE/new-game-bug.yml
vendored
21
.github/ISSUE_TEMPLATE/new-game-bug.yml
vendored
@@ -39,12 +39,13 @@ body:
|
|||||||
If the bug was found in a development build, select "Development build"
|
If the bug was found in a development build, select "Development build"
|
||||||
and provide a link to the build in the field below.
|
and provide a link to the build in the field below.
|
||||||
options:
|
options:
|
||||||
- 5.2.0
|
- 6.0.0
|
||||||
- Development build
|
- Development build
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Build information
|
label: Build information
|
||||||
description: The build information from the Help -> Report an issue window.
|
description:
|
||||||
|
The build information from the Help -> Report an issue window.
|
||||||
- type: input
|
- type: input
|
||||||
attributes:
|
attributes:
|
||||||
label: Campaign name
|
label: Campaign name
|
||||||
@@ -59,8 +60,8 @@ body:
|
|||||||
label: Blue faction
|
label: Blue faction
|
||||||
description: >
|
description: >
|
||||||
The name of the blue faction you selected. If the bug only occurs with a
|
The name of the blue faction you selected. If the bug only occurs with a
|
||||||
custom faction (or modifications to a stock faction), upload the
|
custom faction (or modifications to a stock faction), upload the faction
|
||||||
faction file as an attachment to the bug description field.
|
file as an attachment to the bug description field.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
@@ -68,8 +69,8 @@ body:
|
|||||||
label: Red faction
|
label: Red faction
|
||||||
description: >
|
description: >
|
||||||
The name of the red faction you selected. If the bug only occurs with a
|
The name of the red faction you selected. If the bug only occurs with a
|
||||||
custom faction (or modifications to a stock faction), upload the
|
custom faction (or modifications to a stock faction), upload the faction
|
||||||
faction file as an attachment to the bug description field.
|
file as an attachment to the bug description field.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
@@ -102,11 +103,11 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Log file
|
label: Log file
|
||||||
description: >
|
description: >
|
||||||
Attach the Liberation log file. The log file is located at
|
Attach the Liberation log file. The log file is located at `<Liberation
|
||||||
`<Liberation install directory>/logs/liberation.log`.
|
install directory>/logs/liberation.log`.
|
||||||
|
|
||||||
|
|
||||||
You can attach files to the bug by dragging and dropping the file
|
You can attach files to the bug by dragging and dropping the file into
|
||||||
into this text box.
|
this text box.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
1
.github/workflows/lint.yml
vendored
1
.github/workflows/lint.yml
vendored
@@ -11,6 +11,7 @@ jobs:
|
|||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v2
|
||||||
- uses: psf/black@stable
|
- uses: psf/black@stable
|
||||||
with:
|
with:
|
||||||
|
version: ~=22.12
|
||||||
src: "."
|
src: "."
|
||||||
options: "--check"
|
options: "--check"
|
||||||
|
|
||||||
|
|||||||
33
changelog.md
33
changelog.md
@@ -1,3 +1,36 @@
|
|||||||
|
# 6.1.1
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* **[Data]** Fixed unit ID for the KS-19 AAA. KS-19 would not previously generate correctly in missions. A new game is required for this fix to take effect.
|
||||||
|
* **[Flight Planning]** Automatic flight planning will no longer accidentally plan a recovery tanker instead of a theater refueling package. This fixes a potential crash during mission generation when opfor plans a refueling task at a sunk carrier. You'll need to skip the current turn to force opfor to replan their flights to get the fix.
|
||||||
|
* **[Mission Generation]** Using heliports (airports without any runways) will no longer cause mission generation to fail.
|
||||||
|
* **[Mission Generation]** Prevent helicopters from spawning into collisions at FARPs when more than one flight uses the same FARP.
|
||||||
|
|
||||||
|
# 6.1.0
|
||||||
|
|
||||||
|
Saves from 6.0.0 are compatible with 6.1.0
|
||||||
|
|
||||||
|
## Features/Improvements
|
||||||
|
|
||||||
|
* **[Engine]** Support for DCS 2.8.1.34437, including Blackshark 3.
|
||||||
|
* **[Factions]** Defaulted bluefor modern to use Georgian and Ukrainian liveries for Russian aircraft.
|
||||||
|
* **[Factions]** Added Peru.
|
||||||
|
* **[Flight Planning]** AEW&C and Refueling flights are now plannable on LHA carriers.
|
||||||
|
* **[Flight Planning]** Refueling flights planned on aircraft carriers will act as a recovery tanker for the carrier.
|
||||||
|
* **[Loadouts]** Adjusted F-15E loadouts.
|
||||||
|
* **[Mission Generation]** The previous turn will now be saved as last_turn.liberation when submitting mission results. This is often essential for debugging bug reports. **Include this file in the bug report whenever it is available.**
|
||||||
|
* **[Modding]** Added support for the HMS Ariadne, Achilles, and Castle class.
|
||||||
|
* **[Modding]** Added HMS Invincible to the game data as a helicopter carrier.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* **[Flight Planning]** Fixes CAS flights not having landing waypoints.
|
||||||
|
* **[Mission Generation]** Airbase and FOB capture is no longer blocked by grounded aircraft / helicopters.
|
||||||
|
* **[Squadrons]** Fixed the livery for the VF-33 F-14A squadron.
|
||||||
|
* **[Theaters]** Fixed Channel campaigns not having data for land/sea/obstacle boundaries, causing front lines to extend into forests and water. Requires a new campaign to get the fix.
|
||||||
|
* **[UI]** Fixed an issue where manual submit of mission results did not end the mission correctly.
|
||||||
|
|
||||||
# 6.0.0
|
# 6.0.0
|
||||||
|
|
||||||
Saves from 5.x are not compatible with 6.0.
|
Saves from 5.x are not compatible with 6.0.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from dcs.helicopters import (
|
|||||||
CH_47D,
|
CH_47D,
|
||||||
CH_53E,
|
CH_53E,
|
||||||
Ka_50,
|
Ka_50,
|
||||||
|
Ka_50_3,
|
||||||
Mi_24P,
|
Mi_24P,
|
||||||
Mi_24V,
|
Mi_24V,
|
||||||
Mi_26,
|
Mi_26,
|
||||||
@@ -237,6 +238,7 @@ CAS_CAPABLE = [
|
|||||||
OH_58D,
|
OH_58D,
|
||||||
SA342M,
|
SA342M,
|
||||||
SA342L,
|
SA342L,
|
||||||
|
Ka_50_3,
|
||||||
Ka_50,
|
Ka_50,
|
||||||
Mi_28N,
|
Mi_28N,
|
||||||
Mi_24P,
|
Mi_24P,
|
||||||
@@ -308,6 +310,7 @@ SEAD_CAPABLE = [
|
|||||||
# Aircraft used for DEAD tasks. Must be capable of the CAS DCS task.
|
# Aircraft used for DEAD tasks. Must be capable of the CAS DCS task.
|
||||||
DEAD_CAPABLE = SEAD_CAPABLE + [
|
DEAD_CAPABLE = SEAD_CAPABLE + [
|
||||||
AJS37,
|
AJS37,
|
||||||
|
F_15E,
|
||||||
F_14B,
|
F_14B,
|
||||||
F_14A_135_GR,
|
F_14A_135_GR,
|
||||||
JAS39Gripen_AG,
|
JAS39Gripen_AG,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class CasLayout(PatrollingLayout):
|
|||||||
yield self.target
|
yield self.target
|
||||||
yield self.patrol_end
|
yield self.patrol_end
|
||||||
yield from self.nav_from
|
yield from self.nav_from
|
||||||
yield self.departure
|
yield self.arrival
|
||||||
if self.divert is not None:
|
if self.divert is not None:
|
||||||
yield self.divert
|
yield self.divert
|
||||||
yield self.bullseye
|
yield self.bullseye
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ from __future__ import annotations
|
|||||||
from typing import Any, TYPE_CHECKING, Type
|
from typing import Any, TYPE_CHECKING, Type
|
||||||
|
|
||||||
from game.ato import FlightType
|
from game.ato import FlightType
|
||||||
|
from game.theater.controlpoint import NavalControlPoint
|
||||||
|
from game.theater.frontline import FrontLine
|
||||||
from .aewc import AewcFlightPlan
|
from .aewc import AewcFlightPlan
|
||||||
from .airassault import AirAssaultFlightPlan
|
from .airassault import AirAssaultFlightPlan
|
||||||
from .airlift import AirliftFlightPlan
|
from .airlift import AirliftFlightPlan
|
||||||
@@ -19,6 +21,7 @@ from .ocarunway import OcaRunwayFlightPlan
|
|||||||
from .packagerefueling import PackageRefuelingFlightPlan
|
from .packagerefueling import PackageRefuelingFlightPlan
|
||||||
from .planningerror import PlanningError
|
from .planningerror import PlanningError
|
||||||
from .sead import SeadFlightPlan
|
from .sead import SeadFlightPlan
|
||||||
|
from .shiprecoverytanker import RecoveryTankerFlightPlan
|
||||||
from .strike import StrikeFlightPlan
|
from .strike import StrikeFlightPlan
|
||||||
from .sweep import SweepFlightPlan
|
from .sweep import SweepFlightPlan
|
||||||
from .tarcap import TarCapFlightPlan
|
from .tarcap import TarCapFlightPlan
|
||||||
@@ -26,15 +29,19 @@ from .theaterrefueling import TheaterRefuelingFlightPlan
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game.ato import Flight
|
from game.ato import Flight
|
||||||
from game.theater import FrontLine
|
|
||||||
|
|
||||||
|
|
||||||
class FlightPlanBuilderTypes:
|
class FlightPlanBuilderTypes:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def for_flight(flight: Flight) -> Type[IBuilder[Any, Any]]:
|
def for_flight(flight: Flight) -> Type[IBuilder[Any, Any]]:
|
||||||
if flight.flight_type is FlightType.REFUELING:
|
if flight.flight_type is FlightType.REFUELING:
|
||||||
if flight.package.target.is_friendly(flight.squadron.player) or isinstance(
|
target = flight.package.target
|
||||||
flight.package.target, FrontLine
|
if target.is_friendly(flight.squadron.player) and isinstance(
|
||||||
|
target, NavalControlPoint
|
||||||
|
):
|
||||||
|
return RecoveryTankerFlightPlan.builder_type()
|
||||||
|
if target.is_friendly(flight.squadron.player) or isinstance(
|
||||||
|
target, FrontLine
|
||||||
):
|
):
|
||||||
return TheaterRefuelingFlightPlan.builder_type()
|
return TheaterRefuelingFlightPlan.builder_type()
|
||||||
return PackageRefuelingFlightPlan.builder_type()
|
return PackageRefuelingFlightPlan.builder_type()
|
||||||
|
|||||||
91
game/ato/flightplans/shiprecoverytanker.py
Normal file
91
game/ato/flightplans/shiprecoverytanker.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from datetime import timedelta
|
||||||
|
from typing import Iterator, Type
|
||||||
|
from game.ato.flightplans.standard import StandardFlightPlan, StandardLayout
|
||||||
|
from game.ato.flightplans.ibuilder import IBuilder
|
||||||
|
from game.ato.flightplans.standard import StandardLayout
|
||||||
|
from game.ato.flightplans.waypointbuilder import WaypointBuilder
|
||||||
|
from game.ato.flightwaypoint import FlightWaypoint
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class RecoveryTankerLayout(StandardLayout):
|
||||||
|
nav_to: list[FlightWaypoint]
|
||||||
|
recovery_ship: FlightWaypoint
|
||||||
|
nav_from: list[FlightWaypoint]
|
||||||
|
|
||||||
|
def iter_waypoints(self) -> Iterator[FlightWaypoint]:
|
||||||
|
yield self.departure
|
||||||
|
yield from self.nav_to
|
||||||
|
yield self.recovery_ship
|
||||||
|
yield from self.nav_from
|
||||||
|
yield self.arrival
|
||||||
|
if self.divert is not None:
|
||||||
|
yield self.divert
|
||||||
|
yield self.bullseye
|
||||||
|
|
||||||
|
|
||||||
|
class RecoveryTankerFlightPlan(StandardFlightPlan[RecoveryTankerLayout]):
|
||||||
|
@staticmethod
|
||||||
|
def builder_type() -> Type[Builder]:
|
||||||
|
return Builder
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tot_waypoint(self) -> FlightWaypoint:
|
||||||
|
return self.layout.recovery_ship
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mission_departure_time(self) -> timedelta:
|
||||||
|
return self.patrol_end_time
|
||||||
|
|
||||||
|
@property
|
||||||
|
def patrol_start_time(self) -> timedelta:
|
||||||
|
return self.package.time_over_target
|
||||||
|
|
||||||
|
@property
|
||||||
|
def patrol_end_time(self) -> timedelta:
|
||||||
|
return self.tot + timedelta(hours=2)
|
||||||
|
|
||||||
|
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
|
||||||
|
if waypoint == self.tot_waypoint:
|
||||||
|
return self.tot
|
||||||
|
return None
|
||||||
|
|
||||||
|
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
|
||||||
|
if waypoint == self.tot_waypoint:
|
||||||
|
return self.mission_departure_time
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class Builder(IBuilder[RecoveryTankerFlightPlan, RecoveryTankerLayout]):
|
||||||
|
def layout(self) -> RecoveryTankerLayout:
|
||||||
|
|
||||||
|
builder = WaypointBuilder(self.flight, self.coalition)
|
||||||
|
|
||||||
|
# TODO: Propagate the ship position to the Tanker's TOT,
|
||||||
|
# so that we minimize the tanker's need to catch up to the carrier.
|
||||||
|
recovery_ship = self.package.target.position
|
||||||
|
recovery_tanker = builder.recovery_tanker(recovery_ship)
|
||||||
|
|
||||||
|
# We don't have per aircraft cruise altitudes, so just reuse patrol altitude?
|
||||||
|
tanker_type = self.flight.unit_type
|
||||||
|
nav_cruise_altitude = tanker_type.preferred_patrol_altitude
|
||||||
|
|
||||||
|
return RecoveryTankerLayout(
|
||||||
|
departure=builder.takeoff(self.flight.departure),
|
||||||
|
nav_to=builder.nav_path(
|
||||||
|
self.flight.departure.position, recovery_ship, nav_cruise_altitude
|
||||||
|
),
|
||||||
|
nav_from=builder.nav_path(
|
||||||
|
recovery_ship, self.flight.arrival.position, nav_cruise_altitude
|
||||||
|
),
|
||||||
|
recovery_ship=recovery_tanker,
|
||||||
|
arrival=builder.land(self.flight.arrival),
|
||||||
|
divert=builder.divert(self.flight.divert),
|
||||||
|
bullseye=builder.bullseye(),
|
||||||
|
)
|
||||||
|
|
||||||
|
def build(self) -> RecoveryTankerFlightPlan:
|
||||||
|
return RecoveryTankerFlightPlan(self.flight, self.layout())
|
||||||
@@ -23,7 +23,7 @@ from game.theater import (
|
|||||||
TheaterGroundObject,
|
TheaterGroundObject,
|
||||||
TheaterUnit,
|
TheaterUnit,
|
||||||
)
|
)
|
||||||
from game.utils import Distance, meters, nautical_miles
|
from game.utils import Distance, feet, meters, nautical_miles
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game.coalition import Coalition
|
from game.coalition import Coalition
|
||||||
@@ -204,6 +204,19 @@ class WaypointBuilder:
|
|||||||
pretty_name="Refuel",
|
pretty_name="Refuel",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def recovery_tanker(self, position: Point) -> FlightWaypoint:
|
||||||
|
alt_type: AltitudeReference = "BARO"
|
||||||
|
|
||||||
|
return FlightWaypoint(
|
||||||
|
"RECOVERY",
|
||||||
|
FlightWaypointType.RECOVERY_TANKER,
|
||||||
|
position,
|
||||||
|
feet(6000),
|
||||||
|
alt_type,
|
||||||
|
description="Recovery tanker for aircraft carriers",
|
||||||
|
pretty_name="Recovery",
|
||||||
|
)
|
||||||
|
|
||||||
def split(self, position: Point) -> FlightWaypoint:
|
def split(self, position: Point) -> FlightWaypoint:
|
||||||
alt_type: AltitudeReference = "BARO"
|
alt_type: AltitudeReference = "BARO"
|
||||||
if self.is_helo:
|
if self.is_helo:
|
||||||
|
|||||||
@@ -49,3 +49,4 @@ class FlightWaypointType(IntEnum):
|
|||||||
REFUEL = 29 # Should look for nearby tanker to refuel from.
|
REFUEL = 29 # Should look for nearby tanker to refuel from.
|
||||||
CARGO_STOP = 30 # Stopover landing point using the LandingReFuAr waypoint type
|
CARGO_STOP = 30 # Stopover landing point using the LandingReFuAr waypoint type
|
||||||
INGRESS_AIR_ASSAULT = 31
|
INGRESS_AIR_ASSAULT = 31
|
||||||
|
RECOVERY_TANKER = 32
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import operator
|
|||||||
from collections.abc import Iterable, Iterator
|
from collections.abc import Iterable, Iterator
|
||||||
from typing import TYPE_CHECKING, TypeVar
|
from typing import TYPE_CHECKING, TypeVar
|
||||||
|
|
||||||
|
from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache
|
||||||
from game.theater import (
|
from game.theater import (
|
||||||
Airfield,
|
Airfield,
|
||||||
ControlPoint,
|
ControlPoint,
|
||||||
@@ -15,12 +16,11 @@ from game.theater import (
|
|||||||
)
|
)
|
||||||
from game.theater.theatergroundobject import (
|
from game.theater.theatergroundobject import (
|
||||||
BuildingGroundObject,
|
BuildingGroundObject,
|
||||||
|
IadsBuildingGroundObject,
|
||||||
IadsGroundObject,
|
IadsGroundObject,
|
||||||
NavalGroundObject,
|
NavalGroundObject,
|
||||||
IadsBuildingGroundObject,
|
|
||||||
)
|
)
|
||||||
from game.utils import meters, nautical_miles
|
from game.utils import meters, nautical_miles
|
||||||
from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game import Game
|
from game import Game
|
||||||
@@ -209,22 +209,20 @@ class ObjectiveFinder:
|
|||||||
raise RuntimeError("Found no friendly control points. You probably lost.")
|
raise RuntimeError("Found no friendly control points. You probably lost.")
|
||||||
return farthest
|
return farthest
|
||||||
|
|
||||||
def closest_friendly_control_point(self) -> ControlPoint:
|
def preferred_theater_refueling_control_point(self) -> ControlPoint | None:
|
||||||
"""Finds the friendly control point that is closest to any threats."""
|
"""Finds the friendly control point that is closest to any threats."""
|
||||||
threat_zones = self.game.threat_zone_for(not self.is_player)
|
threat_zones = self.game.threat_zone_for(not self.is_player)
|
||||||
|
|
||||||
closest = None
|
closest = None
|
||||||
min_distance = meters(math.inf)
|
min_distance = meters(math.inf)
|
||||||
for cp in self.friendly_control_points():
|
for cp in self.friendly_control_points():
|
||||||
if isinstance(cp, OffMapSpawn):
|
if isinstance(cp, OffMapSpawn) or cp.is_fleet:
|
||||||
continue
|
continue
|
||||||
distance = threat_zones.distance_to_threat(cp.position)
|
distance = threat_zones.distance_to_threat(cp.position)
|
||||||
if distance < min_distance:
|
if distance < min_distance:
|
||||||
closest = cp
|
closest = cp
|
||||||
min_distance = distance
|
min_distance = distance
|
||||||
|
|
||||||
if closest is None:
|
|
||||||
raise RuntimeError("Found no friendly control points. You probably lost.")
|
|
||||||
return closest
|
return closest
|
||||||
|
|
||||||
def enemy_control_points(self) -> Iterator[ControlPoint]:
|
def enemy_control_points(self) -> Iterator[ControlPoint]:
|
||||||
|
|||||||
@@ -153,6 +153,11 @@ class TheaterState(WorldState["TheaterState"]):
|
|||||||
barcap_duration = coalition.doctrine.cap_duration.total_seconds()
|
barcap_duration = coalition.doctrine.cap_duration.total_seconds()
|
||||||
barcap_rounds = math.ceil(mission_duration / barcap_duration)
|
barcap_rounds = math.ceil(mission_duration / barcap_duration)
|
||||||
|
|
||||||
|
refueling_targets: list[MissionTarget] = []
|
||||||
|
theater_refuling_point = finder.preferred_theater_refueling_control_point()
|
||||||
|
if theater_refuling_point is not None:
|
||||||
|
refueling_targets.append(theater_refuling_point)
|
||||||
|
|
||||||
return TheaterState(
|
return TheaterState(
|
||||||
context=context,
|
context=context,
|
||||||
barcaps_needed={
|
barcaps_needed={
|
||||||
@@ -162,7 +167,7 @@ class TheaterState(WorldState["TheaterState"]):
|
|||||||
front_line_stances={f: None for f in finder.front_lines()},
|
front_line_stances={f: None for f in finder.front_lines()},
|
||||||
vulnerable_front_lines=list(finder.front_lines()),
|
vulnerable_front_lines=list(finder.front_lines()),
|
||||||
aewc_targets=[finder.farthest_friendly_control_point()],
|
aewc_targets=[finder.farthest_friendly_control_point()],
|
||||||
refueling_targets=[finder.closest_friendly_control_point()],
|
refueling_targets=refueling_targets,
|
||||||
enemy_air_defenses=list(finder.enemy_air_defenses()),
|
enemy_air_defenses=list(finder.enemy_air_defenses()),
|
||||||
threatening_air_defenses=[],
|
threatening_air_defenses=[],
|
||||||
detecting_air_defenses=[],
|
detecting_air_defenses=[],
|
||||||
|
|||||||
@@ -332,6 +332,8 @@ class Game:
|
|||||||
from .server import EventStream
|
from .server import EventStream
|
||||||
from .sim import GameUpdateEvents
|
from .sim import GameUpdateEvents
|
||||||
|
|
||||||
|
persistency.save_last_turn_state(self)
|
||||||
|
|
||||||
events = GameUpdateEvents()
|
events = GameUpdateEvents()
|
||||||
|
|
||||||
logging.info("Pass turn")
|
logging.info("Pass turn")
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from dcs.unitgroup import FlyingGroup
|
|||||||
|
|
||||||
from game.ato import Flight, FlightType
|
from game.ato import Flight, FlightType
|
||||||
from game.ato.flightplans.aewc import AewcFlightPlan
|
from game.ato.flightplans.aewc import AewcFlightPlan
|
||||||
|
from game.ato.flightplans.shiprecoverytanker import RecoveryTankerFlightPlan
|
||||||
from game.ato.flightplans.theaterrefueling import TheaterRefuelingFlightPlan
|
from game.ato.flightplans.theaterrefueling import TheaterRefuelingFlightPlan
|
||||||
|
|
||||||
|
|
||||||
@@ -246,7 +247,10 @@ class AircraftBehavior:
|
|||||||
def configure_refueling(self, group: FlyingGroup[Any], flight: Flight) -> None:
|
def configure_refueling(self, group: FlyingGroup[Any], flight: Flight) -> None:
|
||||||
group.task = Refueling.name
|
group.task = Refueling.name
|
||||||
|
|
||||||
if not isinstance(flight.flight_plan, TheaterRefuelingFlightPlan):
|
if not (
|
||||||
|
isinstance(flight.flight_plan, TheaterRefuelingFlightPlan)
|
||||||
|
or isinstance(flight.flight_plan, RecoveryTankerFlightPlan)
|
||||||
|
):
|
||||||
logging.error(
|
logging.error(
|
||||||
f"Cannot configure racetrack refueling tasks for {flight} because it "
|
f"Cannot configure racetrack refueling tasks for {flight} because it "
|
||||||
"does not have an racetrack refueling flight plan."
|
"does not have an racetrack refueling flight plan."
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ from game.settings import Settings
|
|||||||
from game.theater.controlpoint import (
|
from game.theater.controlpoint import (
|
||||||
Airfield,
|
Airfield,
|
||||||
ControlPoint,
|
ControlPoint,
|
||||||
|
Fob,
|
||||||
)
|
)
|
||||||
from game.unitmap import UnitMap
|
from game.unitmap import UnitMap
|
||||||
from .aircraftpainter import AircraftPainter
|
from .aircraftpainter import AircraftPainter
|
||||||
@@ -177,6 +178,15 @@ class AircraftGenerator:
|
|||||||
self.mission_data,
|
self.mission_data,
|
||||||
dynamic_runways,
|
dynamic_runways,
|
||||||
self.use_client,
|
self.use_client,
|
||||||
|
self.unit_map,
|
||||||
).configure()
|
).configure()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
wpt = group.waypoint("LANDING")
|
||||||
|
if flight.is_helo and isinstance(flight.arrival, Fob) and wpt:
|
||||||
|
hpad = self.helipads[flight.arrival].units.pop(0)
|
||||||
|
wpt.helipad_id = hpad.id
|
||||||
|
wpt.link_unit = hpad.id
|
||||||
|
self.helipads[flight.arrival].units.append(hpad)
|
||||||
|
|
||||||
return group
|
return group
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from dcs.unit import Skill
|
|||||||
from dcs.unitgroup import FlyingGroup
|
from dcs.unitgroup import FlyingGroup
|
||||||
|
|
||||||
from game.ato import Flight, FlightType
|
from game.ato import Flight, FlightType
|
||||||
|
from game.ato.flightplans.shiprecoverytanker import RecoveryTankerFlightPlan
|
||||||
from game.callsigns import callsign_for_support_unit
|
from game.callsigns import callsign_for_support_unit
|
||||||
from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum
|
from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum
|
||||||
from game.missiongenerator.missiondata import MissionData, AwacsInfo, TankerInfo
|
from game.missiongenerator.missiondata import MissionData, AwacsInfo, TankerInfo
|
||||||
@@ -19,6 +20,7 @@ from game.radio.radios import RadioFrequency, RadioRegistry
|
|||||||
from game.radio.tacan import TacanBand, TacanRegistry, TacanUsage
|
from game.radio.tacan import TacanBand, TacanRegistry, TacanUsage
|
||||||
from game.runways import RunwayData
|
from game.runways import RunwayData
|
||||||
from game.squadrons import Pilot
|
from game.squadrons import Pilot
|
||||||
|
from game.unitmap import UnitMap
|
||||||
from .aircraftbehavior import AircraftBehavior
|
from .aircraftbehavior import AircraftBehavior
|
||||||
from .aircraftpainter import AircraftPainter
|
from .aircraftpainter import AircraftPainter
|
||||||
from .flightdata import FlightData
|
from .flightdata import FlightData
|
||||||
@@ -44,6 +46,7 @@ class FlightGroupConfigurator:
|
|||||||
mission_data: MissionData,
|
mission_data: MissionData,
|
||||||
dynamic_runways: dict[str, RunwayData],
|
dynamic_runways: dict[str, RunwayData],
|
||||||
use_client: bool,
|
use_client: bool,
|
||||||
|
unit_map: UnitMap,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.flight = flight
|
self.flight = flight
|
||||||
self.group = group
|
self.group = group
|
||||||
@@ -56,6 +59,7 @@ class FlightGroupConfigurator:
|
|||||||
self.mission_data = mission_data
|
self.mission_data = mission_data
|
||||||
self.dynamic_runways = dynamic_runways
|
self.dynamic_runways = dynamic_runways
|
||||||
self.use_client = use_client
|
self.use_client = use_client
|
||||||
|
self.unit_map = unit_map
|
||||||
|
|
||||||
def configure(self) -> FlightData:
|
def configure(self) -> FlightData:
|
||||||
AircraftBehavior(self.flight.flight_type).apply_to(self.flight, self.group)
|
AircraftBehavior(self.flight.flight_type).apply_to(self.flight, self.group)
|
||||||
@@ -97,6 +101,7 @@ class FlightGroupConfigurator:
|
|||||||
self.time,
|
self.time,
|
||||||
self.game.settings,
|
self.game.settings,
|
||||||
self.mission_data,
|
self.mission_data,
|
||||||
|
self.unit_map,
|
||||||
).create_waypoints()
|
).create_waypoints()
|
||||||
|
|
||||||
return FlightData(
|
return FlightData(
|
||||||
@@ -156,7 +161,9 @@ class FlightGroupConfigurator:
|
|||||||
blue=self.flight.departure.captured,
|
blue=self.flight.departure.captured,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif isinstance(self.flight.flight_plan, TheaterRefuelingFlightPlan):
|
elif isinstance(
|
||||||
|
self.flight.flight_plan, TheaterRefuelingFlightPlan
|
||||||
|
) or isinstance(self.flight.flight_plan, RecoveryTankerFlightPlan):
|
||||||
tacan = self.tacan_registry.alloc_for_band(TacanBand.Y, TacanUsage.AirToAir)
|
tacan = self.tacan_registry.alloc_for_band(TacanBand.Y, TacanUsage.AirToAir)
|
||||||
self.mission_data.tankers.append(
|
self.mission_data.tankers.append(
|
||||||
TankerInfo(
|
TankerInfo(
|
||||||
|
|||||||
@@ -230,16 +230,22 @@ class FlightGroupSpawner:
|
|||||||
def _generate_at_cp_helipad(self, name: str, cp: ControlPoint) -> FlyingGroup[Any]:
|
def _generate_at_cp_helipad(self, name: str, cp: ControlPoint) -> FlyingGroup[Any]:
|
||||||
try:
|
try:
|
||||||
helipad = self.helipads[cp]
|
helipad = self.helipads[cp]
|
||||||
except IndexError as ex:
|
except IndexError:
|
||||||
raise NoParkingSlotError()
|
raise NoParkingSlotError()
|
||||||
|
|
||||||
group = self._generate_at_group(name, helipad)
|
group = self._generate_at_group(name, helipad)
|
||||||
|
|
||||||
if self.start_type is not StartType.COLD:
|
if self.start_type is StartType.WARM:
|
||||||
group.points[0].type = "TakeOffParkingHot"
|
group.points[0].type = "TakeOffParkingHot"
|
||||||
|
hpad = helipad.units[0]
|
||||||
for i in range(self.flight.count):
|
for i in range(self.flight.count):
|
||||||
group.units[i].position = helipad.units[i].position
|
group.units[i].position = hpad.position
|
||||||
group.units[i].heading = helipad.units[i].heading
|
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
|
||||||
return group
|
return group
|
||||||
|
|
||||||
def dcs_start_type(self) -> DcsStartType:
|
def dcs_start_type(self) -> DcsStartType:
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from game.ato import Flight, FlightWaypoint
|
|||||||
from game.ato.flightwaypointtype import FlightWaypointType
|
from game.ato.flightwaypointtype import FlightWaypointType
|
||||||
from game.missiongenerator.missiondata import MissionData
|
from game.missiongenerator.missiondata import MissionData
|
||||||
from game.theater import MissionTarget, TheaterUnit
|
from game.theater import MissionTarget, TheaterUnit
|
||||||
|
from game.unitmap import UnitMap
|
||||||
|
|
||||||
TARGET_WAYPOINTS = (
|
TARGET_WAYPOINTS = (
|
||||||
FlightWaypointType.TARGET_GROUP_LOC,
|
FlightWaypointType.TARGET_GROUP_LOC,
|
||||||
@@ -29,6 +30,7 @@ class PydcsWaypointBuilder:
|
|||||||
mission: Mission,
|
mission: Mission,
|
||||||
elapsed_mission_time: timedelta,
|
elapsed_mission_time: timedelta,
|
||||||
mission_data: MissionData,
|
mission_data: MissionData,
|
||||||
|
unit_map: UnitMap,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.waypoint = waypoint
|
self.waypoint = waypoint
|
||||||
self.group = group
|
self.group = group
|
||||||
@@ -37,6 +39,7 @@ class PydcsWaypointBuilder:
|
|||||||
self.mission = mission
|
self.mission = mission
|
||||||
self.elapsed_mission_time = elapsed_mission_time
|
self.elapsed_mission_time = elapsed_mission_time
|
||||||
self.mission_data = mission_data
|
self.mission_data = mission_data
|
||||||
|
self.unit_map = unit_map
|
||||||
|
|
||||||
def build(self) -> MovingPoint:
|
def build(self) -> MovingPoint:
|
||||||
waypoint = self.group.add_waypoint(
|
waypoint = self.group.add_waypoint(
|
||||||
|
|||||||
60
game/missiongenerator/aircraft/waypoints/recoverytanker.py
Normal file
60
game/missiongenerator/aircraft/waypoints/recoverytanker.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
from dcs.point import MovingPoint
|
||||||
|
from dcs.task import ActivateBeaconCommand, RecoveryTanker
|
||||||
|
|
||||||
|
from game.ato import FlightType
|
||||||
|
from game.utils import feet, knots
|
||||||
|
from .pydcswaypointbuilder import PydcsWaypointBuilder
|
||||||
|
|
||||||
|
|
||||||
|
class RecoveryTankerBuilder(PydcsWaypointBuilder):
|
||||||
|
def add_tasks(self, waypoint: MovingPoint) -> None:
|
||||||
|
|
||||||
|
assert self.flight.flight_type == FlightType.REFUELING
|
||||||
|
group_id = self._get_carrier_group_id()
|
||||||
|
speed = knots(250).meters_per_second
|
||||||
|
altitude = feet(6000).meters
|
||||||
|
|
||||||
|
# Last waypoint has index of 1.
|
||||||
|
# Give the tanker a end condition of the last carrier waypoint.
|
||||||
|
# If the carrier ever gets more than one waypoint this approach needs to change.
|
||||||
|
last_waypoint = 2
|
||||||
|
recovery_tanker = RecoveryTanker(group_id, speed, altitude, last_waypoint)
|
||||||
|
|
||||||
|
waypoint.add_task(recovery_tanker)
|
||||||
|
|
||||||
|
self.configure_tanker_tacan(waypoint)
|
||||||
|
|
||||||
|
def _get_carrier_group_id(self) -> int:
|
||||||
|
name = self.package.target.name
|
||||||
|
carrier_position = self.package.target.position
|
||||||
|
theater_objects = self.unit_map.theater_objects
|
||||||
|
for key, value in theater_objects.items():
|
||||||
|
# Check name and position in case there are multiple of same carrier.
|
||||||
|
if name in key and value.theater_unit.position == carrier_position:
|
||||||
|
return value.dcs_group_id
|
||||||
|
raise RuntimeError(
|
||||||
|
f"Could not find a carrier in the mission matching {name} at "
|
||||||
|
f"({carrier_position.x}, {carrier_position.y})"
|
||||||
|
)
|
||||||
|
|
||||||
|
def configure_tanker_tacan(self, waypoint: MovingPoint) -> None:
|
||||||
|
|
||||||
|
if self.flight.unit_type.dcs_unit_type.tacan:
|
||||||
|
tanker_info = self.mission_data.tankers[-1]
|
||||||
|
tacan = tanker_info.tacan
|
||||||
|
tacan_callsign = {
|
||||||
|
"Texaco": "TEX",
|
||||||
|
"Arco": "ARC",
|
||||||
|
"Shell": "SHL",
|
||||||
|
}.get(tanker_info.callsign)
|
||||||
|
|
||||||
|
waypoint.add_task(
|
||||||
|
ActivateBeaconCommand(
|
||||||
|
tacan.number,
|
||||||
|
tacan.band.value,
|
||||||
|
tacan_callsign,
|
||||||
|
bearing=True,
|
||||||
|
unit_id=self.group.units[0].id,
|
||||||
|
aa=True,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -17,8 +17,12 @@ from game.ato.flightstate import InFlight, WaitingForStart
|
|||||||
from game.ato.flightwaypointtype import FlightWaypointType
|
from game.ato.flightwaypointtype import FlightWaypointType
|
||||||
from game.ato.starttype import StartType
|
from game.ato.starttype import StartType
|
||||||
from game.missiongenerator.aircraft.waypoints.cargostop import CargoStopBuilder
|
from game.missiongenerator.aircraft.waypoints.cargostop import CargoStopBuilder
|
||||||
|
from game.missiongenerator.aircraft.waypoints.recoverytanker import (
|
||||||
|
RecoveryTankerBuilder,
|
||||||
|
)
|
||||||
from game.missiongenerator.missiondata import MissionData
|
from game.missiongenerator.missiondata import MissionData
|
||||||
from game.settings import Settings
|
from game.settings import Settings
|
||||||
|
from game.unitmap import UnitMap
|
||||||
from game.utils import pairwise
|
from game.utils import pairwise
|
||||||
from .baiingress import BaiIngressBuilder
|
from .baiingress import BaiIngressBuilder
|
||||||
from .landingzone import LandingZoneBuilder
|
from .landingzone import LandingZoneBuilder
|
||||||
@@ -50,6 +54,7 @@ class WaypointGenerator:
|
|||||||
time: datetime,
|
time: datetime,
|
||||||
settings: Settings,
|
settings: Settings,
|
||||||
mission_data: MissionData,
|
mission_data: MissionData,
|
||||||
|
unit_map: UnitMap,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.flight = flight
|
self.flight = flight
|
||||||
self.group = group
|
self.group = group
|
||||||
@@ -58,6 +63,7 @@ class WaypointGenerator:
|
|||||||
self.time = time
|
self.time = time
|
||||||
self.settings = settings
|
self.settings = settings
|
||||||
self.mission_data = mission_data
|
self.mission_data = mission_data
|
||||||
|
self.unit_map = unit_map
|
||||||
|
|
||||||
def create_waypoints(self) -> tuple[timedelta, list[FlightWaypoint]]:
|
def create_waypoints(self) -> tuple[timedelta, list[FlightWaypoint]]:
|
||||||
for waypoint in self.flight.points:
|
for waypoint in self.flight.points:
|
||||||
@@ -135,6 +141,7 @@ class WaypointGenerator:
|
|||||||
FlightWaypointType.PICKUP_ZONE: LandingZoneBuilder,
|
FlightWaypointType.PICKUP_ZONE: LandingZoneBuilder,
|
||||||
FlightWaypointType.DROPOFF_ZONE: LandingZoneBuilder,
|
FlightWaypointType.DROPOFF_ZONE: LandingZoneBuilder,
|
||||||
FlightWaypointType.REFUEL: RefuelPointBuilder,
|
FlightWaypointType.REFUEL: RefuelPointBuilder,
|
||||||
|
FlightWaypointType.RECOVERY_TANKER: RecoveryTankerBuilder,
|
||||||
FlightWaypointType.CARGO_STOP: CargoStopBuilder,
|
FlightWaypointType.CARGO_STOP: CargoStopBuilder,
|
||||||
}
|
}
|
||||||
builder = builders.get(waypoint.waypoint_type, DefaultWaypointBuilder)
|
builder = builders.get(waypoint.waypoint_type, DefaultWaypointBuilder)
|
||||||
@@ -145,6 +152,7 @@ class WaypointGenerator:
|
|||||||
self.mission,
|
self.mission,
|
||||||
self.elapsed_mission_time,
|
self.elapsed_mission_time,
|
||||||
self.mission_data,
|
self.mission_data,
|
||||||
|
self.unit_map,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _estimate_min_fuel_for(self, waypoints: list[FlightWaypoint]) -> None:
|
def _estimate_min_fuel_for(self, waypoints: list[FlightWaypoint]) -> None:
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class GroundObjectGenerator:
|
|||||||
self.add_trigger_zone_for_scenery(unit)
|
self.add_trigger_zone_for_scenery(unit)
|
||||||
if (
|
if (
|
||||||
self.game.settings.plugin_option("skynetiads")
|
self.game.settings.plugin_option("skynetiads")
|
||||||
|
and self.game.theater.iads_network.advanced_iads
|
||||||
and isinstance(group, IadsGroundGroup)
|
and isinstance(group, IadsGroundGroup)
|
||||||
and group.iads_role.participate
|
and group.iads_role.participate
|
||||||
):
|
):
|
||||||
@@ -147,7 +148,7 @@ class GroundObjectGenerator:
|
|||||||
vehicle_unit.position = unit.position
|
vehicle_unit.position = unit.position
|
||||||
vehicle_unit.heading = unit.position.heading.degrees
|
vehicle_unit.heading = unit.position.heading.degrees
|
||||||
vehicle_group.add_unit(vehicle_unit)
|
vehicle_group.add_unit(vehicle_unit)
|
||||||
self._register_theater_unit(unit, vehicle_group.units[-1])
|
self._register_theater_unit(vehicle_group.id, unit, vehicle_group.units[-1])
|
||||||
if vehicle_group is None:
|
if vehicle_group is None:
|
||||||
raise RuntimeError(f"Error creating VehicleGroup for {group_name}")
|
raise RuntimeError(f"Error creating VehicleGroup for {group_name}")
|
||||||
return vehicle_group
|
return vehicle_group
|
||||||
@@ -180,7 +181,7 @@ class GroundObjectGenerator:
|
|||||||
ship_unit.position = unit.position
|
ship_unit.position = unit.position
|
||||||
ship_unit.heading = unit.position.heading.degrees
|
ship_unit.heading = unit.position.heading.degrees
|
||||||
ship_group.add_unit(ship_unit)
|
ship_group.add_unit(ship_unit)
|
||||||
self._register_theater_unit(unit, ship_group.units[-1])
|
self._register_theater_unit(ship_group.id, unit, ship_group.units[-1])
|
||||||
if ship_group is None:
|
if ship_group is None:
|
||||||
raise RuntimeError(f"Error creating ShipGroup for {group_name}")
|
raise RuntimeError(f"Error creating ShipGroup for {group_name}")
|
||||||
return ship_group
|
return ship_group
|
||||||
@@ -194,7 +195,7 @@ class GroundObjectGenerator:
|
|||||||
heading=unit.position.heading.degrees,
|
heading=unit.position.heading.degrees,
|
||||||
dead=not unit.alive,
|
dead=not unit.alive,
|
||||||
)
|
)
|
||||||
self._register_theater_unit(unit, static_group.units[0])
|
self._register_theater_unit(static_group.id, unit, static_group.units[0])
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def enable_eplrs(group: VehicleGroup, unit_type: Type[VehicleType]) -> None:
|
def enable_eplrs(group: VehicleGroup, unit_type: Type[VehicleType]) -> None:
|
||||||
@@ -209,10 +210,11 @@ class GroundObjectGenerator:
|
|||||||
|
|
||||||
def _register_theater_unit(
|
def _register_theater_unit(
|
||||||
self,
|
self,
|
||||||
|
dcs_group_id: int,
|
||||||
theater_unit: TheaterUnit,
|
theater_unit: TheaterUnit,
|
||||||
dcs_unit: Unit,
|
dcs_unit: Unit,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.unit_map.add_theater_unit_mapping(theater_unit, dcs_unit)
|
self.unit_map.add_theater_unit_mapping(dcs_group_id, theater_unit, dcs_unit)
|
||||||
|
|
||||||
def add_trigger_zone_for_scenery(self, scenery: SceneryUnit) -> None:
|
def add_trigger_zone_for_scenery(self, scenery: SceneryUnit) -> None:
|
||||||
# Align the trigger zones to the faction color on the DCS briefing/F10 map.
|
# Align the trigger zones to the faction color on the DCS briefing/F10 map.
|
||||||
@@ -291,13 +293,13 @@ class GroundObjectGenerator:
|
|||||||
self.m.triggerrules.triggers.append(t)
|
self.m.triggerrules.triggers.append(t)
|
||||||
|
|
||||||
def generate_iads_command_unit(self, unit: SceneryUnit) -> None:
|
def generate_iads_command_unit(self, unit: SceneryUnit) -> None:
|
||||||
# Creates a static Infantry Unit next to a scenery object. This is needed
|
# Creates a static Unit (tyre with red flag) next to a scenery object. This is
|
||||||
# because skynet can not use map objects as Comms, Power or Command and needs a
|
# needed because skynet can not use map objects as Comms, Power or Command and
|
||||||
# "real" unit to function correctly
|
# needs a "real" unit to function correctly
|
||||||
self.m.static_group(
|
self.m.static_group(
|
||||||
country=self.country,
|
country=self.country,
|
||||||
name=unit.unit_name,
|
name=unit.unit_name,
|
||||||
_type=dcs.vehicles.Infantry.Soldier_M4,
|
_type=dcs.statics.Fortification.Black_Tyre_RF,
|
||||||
position=unit.position,
|
position=unit.position,
|
||||||
heading=unit.position.heading.degrees,
|
heading=unit.position.heading.degrees,
|
||||||
dead=not unit.alive, # Also spawn as dead!
|
dead=not unit.alive, # Also spawn as dead!
|
||||||
|
|||||||
@@ -159,7 +159,9 @@ class TriggerGenerator:
|
|||||||
flag = self.get_capture_zone_flag()
|
flag = self.get_capture_zone_flag()
|
||||||
capture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
|
capture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
|
||||||
capture_trigger.add_condition(
|
capture_trigger.add_condition(
|
||||||
AllOfCoalitionOutsideZone(defending_coalition, trigger_zone.id)
|
AllOfCoalitionOutsideZone(
|
||||||
|
defending_coalition, trigger_zone.id, unit_type="GROUND"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
capture_trigger.add_condition(
|
capture_trigger.add_condition(
|
||||||
PartOfCoalitionInZone(
|
PartOfCoalitionInZone(
|
||||||
@@ -176,7 +178,9 @@ class TriggerGenerator:
|
|||||||
|
|
||||||
recapture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
|
recapture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
|
||||||
recapture_trigger.add_condition(
|
recapture_trigger.add_condition(
|
||||||
AllOfCoalitionOutsideZone(attacking_coalition, trigger_zone.id)
|
AllOfCoalitionOutsideZone(
|
||||||
|
attacking_coalition, trigger_zone.id, unit_type="GROUND"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
recapture_trigger.add_condition(
|
recapture_trigger.add_condition(
|
||||||
PartOfCoalitionInZone(
|
PartOfCoalitionInZone(
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ def save_dir() -> Path:
|
|||||||
return Path(base_path()) / "Liberation" / "Saves"
|
return Path(base_path()) / "Liberation" / "Saves"
|
||||||
|
|
||||||
|
|
||||||
def _temporary_save_file() -> str:
|
def _temporary_save_file() -> Path:
|
||||||
return str(save_dir() / "tmpsave.liberation")
|
return save_dir() / "tmpsave.liberation"
|
||||||
|
|
||||||
|
|
||||||
def _autosave_path() -> str:
|
def _autosave_path() -> str:
|
||||||
@@ -54,16 +54,18 @@ def load_game(path: str) -> Optional[Game]:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def save_game(game: Game) -> bool:
|
def save_game(game: Game, destination: Path | None = None) -> None:
|
||||||
|
if destination is None:
|
||||||
|
destination = Path(game.savepath)
|
||||||
|
|
||||||
|
temp_save_file = _temporary_save_file()
|
||||||
with logged_duration("Saving game"):
|
with logged_duration("Saving game"):
|
||||||
try:
|
try:
|
||||||
with open(_temporary_save_file(), "wb") as f:
|
with temp_save_file.open("wb") as f:
|
||||||
pickle.dump(game, f)
|
pickle.dump(game, f)
|
||||||
shutil.copy(_temporary_save_file(), game.savepath)
|
shutil.copy(temp_save_file, destination)
|
||||||
return True
|
|
||||||
except Exception:
|
except Exception:
|
||||||
logging.exception("Could not save game")
|
logging.exception("Could not save game")
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def autosave(game: Game) -> bool:
|
def autosave(game: Game) -> bool:
|
||||||
@@ -79,3 +81,7 @@ def autosave(game: Game) -> bool:
|
|||||||
except Exception:
|
except Exception:
|
||||||
logging.exception("Could not save game")
|
logging.exception("Could not save game")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def save_last_turn_state(game: Game) -> None:
|
||||||
|
save_game(game, save_dir() / "last_turn.liberation")
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from datetime import timedelta
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, TYPE_CHECKING
|
from typing import Optional, TYPE_CHECKING
|
||||||
|
|
||||||
|
from game import persistency
|
||||||
from game.debriefing import Debriefing
|
from game.debriefing import Debriefing
|
||||||
from game.missiongenerator import MissionGenerator
|
from game.missiongenerator import MissionGenerator
|
||||||
from game.unitmap import UnitMap
|
from game.unitmap import UnitMap
|
||||||
@@ -73,6 +74,7 @@ class MissionSimulation:
|
|||||||
"was generated."
|
"was generated."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
persistency.save_last_turn_state(self.game)
|
||||||
MissionResultsProcessor(self.game).commit(debriefing, events)
|
MissionResultsProcessor(self.game).commit(debriefing, events)
|
||||||
|
|
||||||
def finish(self) -> None:
|
def finish(self) -> None:
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ from dcs.ships import (
|
|||||||
CVN_75,
|
CVN_75,
|
||||||
CV_1143_5,
|
CV_1143_5,
|
||||||
Forrestal,
|
Forrestal,
|
||||||
|
Hms_invincible,
|
||||||
KUZNECOW,
|
KUZNECOW,
|
||||||
LHA_Tarawa,
|
LHA_Tarawa,
|
||||||
Stennis,
|
Stennis,
|
||||||
@@ -877,6 +878,11 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
|
|||||||
) -> RunwayData:
|
) -> RunwayData:
|
||||||
...
|
...
|
||||||
|
|
||||||
|
def stub_runway_data(self) -> RunwayData:
|
||||||
|
return RunwayData(
|
||||||
|
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def airdrome_id_for_landing(self) -> Optional[int]:
|
def airdrome_id_for_landing(self) -> Optional[int]:
|
||||||
return None
|
return None
|
||||||
@@ -1133,6 +1139,14 @@ class Airfield(ControlPoint):
|
|||||||
conditions: Conditions,
|
conditions: Conditions,
|
||||||
dynamic_runways: Dict[str, RunwayData],
|
dynamic_runways: Dict[str, RunwayData],
|
||||||
) -> RunwayData:
|
) -> RunwayData:
|
||||||
|
if not self.airport.runways:
|
||||||
|
# Some airfields are heliports and don't have any runways. This isn't really
|
||||||
|
# the best fix, since we should still try to generate partial data for TACAN
|
||||||
|
# beacons, but it'll do for a bug fix, and the proper fix probably involves
|
||||||
|
# making heliports their own CP type.
|
||||||
|
# https://github.com/dcs-liberation/dcs_liberation/issues/2710
|
||||||
|
return self.stub_runway_data()
|
||||||
|
|
||||||
assigner = RunwayAssigner(conditions)
|
assigner = RunwayAssigner(conditions)
|
||||||
return assigner.get_preferred_runway(theater, self.airport)
|
return assigner.get_preferred_runway(theater, self.airport)
|
||||||
|
|
||||||
@@ -1176,6 +1190,8 @@ class NavalControlPoint(ControlPoint, ABC):
|
|||||||
|
|
||||||
if self.is_friendly(for_player):
|
if self.is_friendly(for_player):
|
||||||
yield from [
|
yield from [
|
||||||
|
FlightType.AEWC,
|
||||||
|
FlightType.REFUELING,
|
||||||
# TODO: FlightType.INTERCEPTION
|
# TODO: FlightType.INTERCEPTION
|
||||||
# TODO: Buddy tanking for the A-4?
|
# TODO: Buddy tanking for the A-4?
|
||||||
# TODO: Rescue chopper?
|
# TODO: Rescue chopper?
|
||||||
@@ -1202,9 +1218,10 @@ class NavalControlPoint(ControlPoint, ABC):
|
|||||||
for u in group.units:
|
for u in group.units:
|
||||||
if u.alive and u.type in [
|
if u.alive and u.type in [
|
||||||
Forrestal,
|
Forrestal,
|
||||||
Stennis,
|
Hms_invincible,
|
||||||
LHA_Tarawa,
|
|
||||||
KUZNECOW,
|
KUZNECOW,
|
||||||
|
LHA_Tarawa,
|
||||||
|
Stennis,
|
||||||
Type_071,
|
Type_071,
|
||||||
]:
|
]:
|
||||||
return True
|
return True
|
||||||
@@ -1265,13 +1282,10 @@ class Carrier(NavalControlPoint):
|
|||||||
return SymbolSet.SEA_SURFACE, SeaSurfaceEntity.CARRIER
|
return SymbolSet.SEA_SURFACE, SeaSurfaceEntity.CARRIER
|
||||||
|
|
||||||
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
|
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
|
||||||
from game.ato import FlightType
|
|
||||||
|
|
||||||
yield from super().mission_types(for_player)
|
yield from super().mission_types(for_player)
|
||||||
if self.is_friendly(for_player):
|
if self.is_friendly(for_player):
|
||||||
yield from [
|
yield from [
|
||||||
FlightType.AEWC,
|
# Nothing yet.
|
||||||
FlightType.REFUELING,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def capture(self, game: Game, events: GameUpdateEvents, for_player: bool) -> None:
|
def capture(self, game: Game, events: GameUpdateEvents, for_player: bool) -> None:
|
||||||
@@ -1372,9 +1386,7 @@ class OffMapSpawn(ControlPoint):
|
|||||||
dynamic_runways: Dict[str, RunwayData],
|
dynamic_runways: Dict[str, RunwayData],
|
||||||
) -> RunwayData:
|
) -> RunwayData:
|
||||||
logging.warning("TODO: Off map spawns have no runways.")
|
logging.warning("TODO: Off map spawns have no runways.")
|
||||||
return RunwayData(
|
return self.stub_runway_data()
|
||||||
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def runway_status(self) -> RunwayStatus:
|
def runway_status(self) -> RunwayStatus:
|
||||||
@@ -1416,9 +1428,7 @@ class Fob(ControlPoint):
|
|||||||
dynamic_runways: Dict[str, RunwayData],
|
dynamic_runways: Dict[str, RunwayData],
|
||||||
) -> RunwayData:
|
) -> RunwayData:
|
||||||
logging.warning("TODO: FOBs have no runways.")
|
logging.warning("TODO: FOBs have no runways.")
|
||||||
return RunwayData(
|
return self.stub_runway_data()
|
||||||
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def runway_status(self) -> RunwayStatus:
|
def runway_status(self) -> RunwayStatus:
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ class FrontLineUnit:
|
|||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class TheaterUnitMapping:
|
class TheaterUnitMapping:
|
||||||
|
dcs_group_id: int
|
||||||
theater_unit: TheaterUnit
|
theater_unit: TheaterUnit
|
||||||
dcs_unit: Unit
|
dcs_unit: Unit
|
||||||
|
|
||||||
@@ -104,14 +105,16 @@ class UnitMap:
|
|||||||
return self.front_line_units.get(name, None)
|
return self.front_line_units.get(name, None)
|
||||||
|
|
||||||
def add_theater_unit_mapping(
|
def add_theater_unit_mapping(
|
||||||
self, theater_unit: TheaterUnit, dcs_unit: Unit
|
self, dcs_group_id: int, theater_unit: TheaterUnit, dcs_unit: Unit
|
||||||
) -> None:
|
) -> None:
|
||||||
# Deaths for units at TGOs are recorded in the corresponding GroundUnit within
|
# Deaths for units at TGOs are recorded in the corresponding GroundUnit within
|
||||||
# the GroundGroup, so we have to match the dcs unit with the liberation unit
|
# the GroundGroup, so we have to match the dcs unit with the liberation unit
|
||||||
name = str(dcs_unit.name)
|
name = str(dcs_unit.name)
|
||||||
if name in self.theater_objects:
|
if name in self.theater_objects:
|
||||||
raise RuntimeError(f"Duplicate TGO unit: {name}")
|
raise RuntimeError(f"Duplicate TGO unit: {name}")
|
||||||
self.theater_objects[name] = TheaterUnitMapping(theater_unit, dcs_unit)
|
self.theater_objects[name] = TheaterUnitMapping(
|
||||||
|
dcs_group_id, theater_unit, dcs_unit
|
||||||
|
)
|
||||||
|
|
||||||
def theater_units(self, name: str) -> Optional[TheaterUnitMapping]:
|
def theater_units(self, name: str) -> Optional[TheaterUnitMapping]:
|
||||||
return self.theater_objects.get(name, None)
|
return self.theater_objects.get(name, None)
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ from pathlib import Path
|
|||||||
|
|
||||||
|
|
||||||
MAJOR_VERSION = 6
|
MAJOR_VERSION = 6
|
||||||
MINOR_VERSION = 0
|
MINOR_VERSION = 1
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 1
|
||||||
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))
|
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -238,5 +238,5 @@ class QWaitingForMissionResultWindow(QDialog):
|
|||||||
# Stop the current waiting thread as we manually submit the results
|
# Stop the current waiting thread as we manually submit the results
|
||||||
self.wait_thread.stop()
|
self.wait_thread.stop()
|
||||||
self.on_debriefing_update(
|
self.on_debriefing_update(
|
||||||
self.sim_controller.debrief_current_state(Path(file[0], force_end=True))
|
self.sim_controller.debrief_current_state(Path(file[0]), force_end=True)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ asgiref==3.5.2
|
|||||||
atomicwrites==1.4.1
|
atomicwrites==1.4.1
|
||||||
attrs==21.4.0
|
attrs==21.4.0
|
||||||
black==22.6.0
|
black==22.6.0
|
||||||
certifi==2022.6.15
|
certifi==2022.12.7
|
||||||
cfgv==3.3.1
|
cfgv==3.3.1
|
||||||
click==8.1.3
|
click==8.1.3
|
||||||
colorama==0.4.5
|
colorama==0.4.5
|
||||||
@@ -32,7 +32,7 @@ pluggy==1.0.0
|
|||||||
pre-commit==2.19.0
|
pre-commit==2.19.0
|
||||||
py==1.11.0
|
py==1.11.0
|
||||||
pydantic==1.9.1
|
pydantic==1.9.1
|
||||||
-e git+https://github.com/pydcs/dcs@f12d70ea844076f95c74ffab92ec3dc9fdee32e4#egg=pydcs
|
-e git+https://github.com/pydcs/dcs@9c7b47b6c2b4870bf563bf880315dac019f6df1f#egg=pydcs
|
||||||
pyinstaller==5.2
|
pyinstaller==5.2
|
||||||
pyinstaller-hooks-contrib==2022.8
|
pyinstaller-hooks-contrib==2022.8
|
||||||
pyparsing==3.0.9
|
pyparsing==3.0.9
|
||||||
|
|||||||
@@ -1,101 +1,101 @@
|
|||||||
---
|
---
|
||||||
name: Nevada - Exercise Vegas Nerve
|
name: Nevada - Exercise Vegas Nerve
|
||||||
theater: Nevada
|
theater: Nevada
|
||||||
authors: Starfire
|
authors: Starfire
|
||||||
recommended_player_faction: USA 2005
|
recommended_player_faction: USA 2005
|
||||||
recommended_enemy_faction: Redfor (China) 2010
|
recommended_enemy_faction: Redfor (China) 2010
|
||||||
description: <p>Welcome to Vegas Nerve, an asymmetrical Red Flag Exercise scenario. You are starting off in control of the two Tonopah airports, and will push south from there. For the duration of this exercise, Creech AFB has been cleared of all fixed wing aircraft and will function as a FARP for rotor ops. OPFOR has a substantial resource advantage and an extensive IADS. Reducing that resource advantage while degrading their IADS will be vital to a successful completion of this exercise. Good luck, Commander.</p>
|
description: <p>Welcome to Vegas Nerve, an asymmetrical Red Flag Exercise scenario. You are starting off in control of the two Tonopah airports, and will push south from there. For the duration of this exercise, Creech AFB has been cleared of all fixed wing aircraft and will function as a FARP for rotor ops. OPFOR has a substantial resource advantage and an extensive IADS. Reducing that resource advantage while degrading their IADS will be vital to a successful completion of this exercise. Good luck, Commander.</p>
|
||||||
miz: exercise_vegas_nerve.miz
|
miz: exercise_vegas_nerve.miz
|
||||||
performance: 1
|
performance: 1
|
||||||
recommended_start_date: 2011-02-24
|
recommended_start_date: 2011-02-24
|
||||||
version: "10.5"
|
version: "10.5"
|
||||||
squadrons:
|
squadrons:
|
||||||
# Tonopah Airport
|
# Tonopah Airport
|
||||||
17:
|
17:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
secondary: air-to-air
|
secondary: air-to-air
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15C Eagle
|
- F-15C Eagle
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-14B Tomcat
|
- F-14B Tomcat
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-3A
|
- E-3A
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker MPRS
|
- KC-135 Stratotanker MPRS
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- C-130
|
- C-130
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15E Strike Eagle
|
- F-15E Strike Eagle
|
||||||
# Tonopah Test Range
|
# Tonopah Test Range
|
||||||
18:
|
18:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-10C Thunderbolt II (Suite 7)
|
- A-10C Thunderbolt II (Suite 7)
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-64D Apache Longbow
|
- AH-64D Apache Longbow
|
||||||
- primary: DEAD
|
- primary: DEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F/A-18C Hornet (Lot 20)
|
- F/A-18C Hornet (Lot 20)
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AV-8B Harrier II Night Attack
|
- AV-8B Harrier II Night Attack
|
||||||
- primary: Air Assault
|
- primary: Air Assault
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- UH-1H Iroquois
|
- UH-1H Iroquois
|
||||||
# Groom Lake
|
# Groom Lake
|
||||||
2:
|
2:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: air-to-air
|
secondary: air-to-air
|
||||||
aircraft:
|
aircraft:
|
||||||
- J-11A Flanker-L
|
- J-11A Flanker-L
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-34 Fullback
|
- Su-34 Fullback
|
||||||
# Creech
|
# Creech
|
||||||
Creech FARP:
|
Creech FARP:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Ka-50 Hokum
|
- Ka-50 Hokum
|
||||||
# Nellis AFB
|
# Nellis AFB
|
||||||
4:
|
4:
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- FC-1 Fierce Dragon
|
- FC-1 Fierce Dragon
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- H-6J Badger
|
- H-6J Badger
|
||||||
# Boulder City Airport
|
# Boulder City Airport
|
||||||
6:
|
6:
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- KJ-2000
|
- KJ-2000
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
@@ -1,110 +1,110 @@
|
|||||||
---
|
---
|
||||||
name: Falklands - Operation Grabthar's Hammer
|
name: Falklands - Operation Grabthar's Hammer
|
||||||
theater: Falklands
|
theater: Falklands
|
||||||
authors: Starfire
|
authors: Starfire
|
||||||
recommended_player_faction: USA 2005
|
recommended_player_faction: USA 2005
|
||||||
recommended_enemy_faction: Russia 1990
|
recommended_enemy_faction: Russia 1990
|
||||||
description:
|
description:
|
||||||
<p>An Argentinean extremist group has contracted the Sons of Warvan (SoW), an
|
<p>An Argentinean extremist group has contracted the Sons of Warvan (SoW), an
|
||||||
unusually well-equipped PMC with close ties to the Russian government, to
|
unusually well-equipped PMC with close ties to the Russian government, to
|
||||||
construct a beryllium bomb at the secret Omega 13 production facility in Ushaia
|
construct a beryllium bomb at the secret Omega 13 production facility in Ushaia
|
||||||
for use in its ongoing conflict with Chile. United States military forces have
|
for use in its ongoing conflict with Chile. United States military forces have
|
||||||
established a foothold at San Julian. While the SoW are distracted up north, it
|
established a foothold at San Julian. While the SoW are distracted up north, it
|
||||||
is up to the Marines to launch an assault upon Ushaia from an LHA in order to
|
is up to the Marines to launch an assault upon Ushaia from an LHA in order to
|
||||||
disable the bomb production facility. Fortunately, Ushaia is lightly defended as
|
disable the bomb production facility. Fortunately, Ushaia is lightly defended as
|
||||||
the SoW are trying to avoid unwanted attention.</p>
|
the SoW are trying to avoid unwanted attention.</p>
|
||||||
miz: grabthars_hammer.miz
|
miz: grabthars_hammer.miz
|
||||||
performance: 2
|
performance: 2
|
||||||
recommended_start_date: 2000-07-13
|
recommended_start_date: 2000-07-13
|
||||||
version: "10.5"
|
version: "10.5"
|
||||||
squadrons:
|
squadrons:
|
||||||
#Mount Pleasant
|
#Mount Pleasant
|
||||||
2:
|
2:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
secondary: air-to-air
|
secondary: air-to-air
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15C Eagle
|
- F-15C Eagle
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15E Strike Eagle
|
- F-15E Strike Eagle
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-10C Thunderbolt II (Suite 7)
|
- A-10C Thunderbolt II (Suite 7)
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- B-1B Lancer
|
- B-1B Lancer
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
#San Julian
|
#San Julian
|
||||||
11:
|
11:
|
||||||
- primary: DEAD
|
- primary: DEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
#El Calafate
|
#El Calafate
|
||||||
14:
|
14:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-25T Frogfoot
|
- Su-25T Frogfoot
|
||||||
#Rio Gallegros
|
#Rio Gallegros
|
||||||
5:
|
5:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-27 Flanker-B
|
- Su-27 Flanker-B
|
||||||
#Punta Arenas
|
#Punta Arenas
|
||||||
9:
|
9:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-24M Fencer-D
|
- Su-24M Fencer-D
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Tu-22M3 Backfire-C
|
- Tu-22M3 Backfire-C
|
||||||
#Ushuaia
|
#Ushuaia
|
||||||
7:
|
7:
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
#Ushuaia Helo Port
|
#Ushuaia Helo Port
|
||||||
8:
|
8:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
#Blue CV
|
#Blue CV
|
||||||
Blue-CV:
|
Blue-CV:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-14B Tomcat
|
- F-14B Tomcat
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F/A-18C Hornet (Lot 20)
|
- F/A-18C Hornet (Lot 20)
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-2C Hawkeye
|
- E-2C Hawkeye
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- S-3B Tanker
|
- S-3B Tanker
|
||||||
# Blue LHA
|
# Blue LHA
|
||||||
Blue-LHA:
|
Blue-LHA:
|
||||||
- primary: DEAD
|
- primary: DEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AV-8B Harrier II Night Attack
|
- AV-8B Harrier II Night Attack
|
||||||
- primary: Air Assault
|
- primary: Air Assault
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- UH-1H Iroquois
|
- UH-1H Iroquois
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-64D Apache Longbow
|
- AH-64D Apache Longbow
|
||||||
|
|||||||
@@ -1,111 +1,111 @@
|
|||||||
---
|
---
|
||||||
name: Syria - Operation Peace Spring
|
name: Syria - Operation Peace Spring
|
||||||
theater: Syria
|
theater: Syria
|
||||||
authors: Starfire
|
authors: Starfire
|
||||||
recommended_player_faction: Bluefor Modern
|
recommended_player_faction: Bluefor Modern
|
||||||
recommended_enemy_faction: Iraq 1991
|
recommended_enemy_faction: Iraq 1991
|
||||||
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction (and has preset squadrons included), they only have two jets available (F-4 and F-16).</p>
|
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction (and has preset squadrons included), they only have two jets available (F-4 and F-16).</p>
|
||||||
miz: operation_peace_spring.miz
|
miz: operation_peace_spring.miz
|
||||||
performance: 1
|
performance: 1
|
||||||
recommended_start_date: 2019-12-23
|
recommended_start_date: 2019-12-23
|
||||||
version: "10.5"
|
version: "10.5"
|
||||||
squadrons:
|
squadrons:
|
||||||
# Ramat David
|
# Ramat David
|
||||||
30:
|
30:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: air-to-air
|
secondary: air-to-air
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15C Eagle
|
- F-15C Eagle
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-10C Thunderbolt II (Suite 7)
|
- A-10C Thunderbolt II (Suite 7)
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-64D Apache Longbow
|
- AH-64D Apache Longbow
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F/A-18C Hornet (Lot 20)
|
- F/A-18C Hornet (Lot 20)
|
||||||
- primary: DEAD
|
- primary: DEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AV-8B Harrier II Night Attack
|
- AV-8B Harrier II Night Attack
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15E Strike Eagle
|
- F-15E Strike Eagle
|
||||||
- primary: Air Assault
|
- primary: Air Assault
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- UH-1H Iroquois
|
- UH-1H Iroquois
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-3A
|
- E-3A
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker MPRS
|
- KC-135 Stratotanker MPRS
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- C-130
|
- C-130
|
||||||
# Damascus
|
# Damascus
|
||||||
7:
|
7:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-4E Phantom II
|
- F-4E Phantom II
|
||||||
- MiG-21bis Fishbed-N
|
- MiG-21bis Fishbed-N
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-1W SuperCobra
|
- AH-1W SuperCobra
|
||||||
- Su-25 Frogfoot
|
- Su-25 Frogfoot
|
||||||
# Tiyas
|
# Tiyas
|
||||||
39:
|
39:
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
- Su-24M Fencer-D
|
- Su-24M Fencer-D
|
||||||
# Abu Al Duhur
|
# Abu Al Duhur
|
||||||
# 1:
|
# 1:
|
||||||
# Gaziantep
|
# Gaziantep
|
||||||
11:
|
11:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- OH-58D Kiowa Warrior
|
- OH-58D Kiowa Warrior
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
# Incirlik
|
# Incirlik
|
||||||
16:
|
16:
|
||||||
- primary: TARCAP
|
- primary: TARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
- MiG-29A Fulcrum-A
|
- MiG-29A Fulcrum-A
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-4E Phantom II
|
- F-4E Phantom II
|
||||||
- H-6J Badger
|
- H-6J Badger
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-3A
|
- E-3A
|
||||||
- A-50
|
- A-50
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
- IL-78M
|
- IL-78M
|
||||||
- primary: Transport
|
- primary: Transport
|
||||||
aircraft:
|
aircraft:
|
||||||
- C-130
|
- C-130
|
||||||
- IL-76MD
|
- IL-76MD
|
||||||
|
|
||||||
@@ -1,104 +1,104 @@
|
|||||||
---
|
---
|
||||||
name: Caucasus - Operation Vectron's Claw
|
name: Caucasus - Operation Vectron's Claw
|
||||||
theater: Caucasus
|
theater: Caucasus
|
||||||
authors: Starfire
|
authors: Starfire
|
||||||
recommended_player_faction: USA 2005
|
recommended_player_faction: USA 2005
|
||||||
recommended_enemy_faction: Russia 1990
|
recommended_enemy_faction: Russia 1990
|
||||||
description: <p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut off from friendly forces by Russian troops backing the separatist state. The UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and troops at the Zugdidi Sector HQ will have to make a run for the coast, supported by offshore US naval aircraft. The contingent is aware that their best shot at survival is to swiftly retake Sukhumi before Russian forces have a chance to dig in, so that friendly ground forces can land and reinforce them.</p><p><strong>Note:</strong> Ground unit purchase will not be available past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi with at least one surviving ground unit to capture it. Two Hueys are available at Zugdidi for some close air support. The player can either play the first leg of the scenario as an evacuation with a couple of light vehicles (e.g. Humvees) set on breakthrough (modifying waypoints in the mission editor so they are not charging head-on into enemy ground forces is suggested), or purchase heavier ground units if they wish to experience a more traditional frontline ground war. Once Sukhumi has been captured, squadrons based in Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn point.</p>
|
description: <p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut off from friendly forces by Russian troops backing the separatist state. The UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and troops at the Zugdidi Sector HQ will have to make a run for the coast, supported by offshore US naval aircraft. The contingent is aware that their best shot at survival is to swiftly retake Sukhumi before Russian forces have a chance to dig in, so that friendly ground forces can land and reinforce them.</p><p><strong>Note:</strong> Ground unit purchase will not be available past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi with at least one surviving ground unit to capture it. Two Hueys are available at Zugdidi for some close air support. The player can either play the first leg of the scenario as an evacuation with a couple of light vehicles (e.g. Humvees) set on breakthrough (modifying waypoints in the mission editor so they are not charging head-on into enemy ground forces is suggested), or purchase heavier ground units if they wish to experience a more traditional frontline ground war. Once Sukhumi has been captured, squadrons based in Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn point.</p>
|
||||||
miz: operation_vectrons_claw.miz
|
miz: operation_vectrons_claw.miz
|
||||||
performance: 1
|
performance: 1
|
||||||
recommended_start_date: 2008-08-08
|
recommended_start_date: 2008-08-08
|
||||||
version: "10.5"
|
version: "10.5"
|
||||||
squadrons:
|
squadrons:
|
||||||
Blue CV-1:
|
Blue CV-1:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-14B Tomcat
|
- F-14B Tomcat
|
||||||
- primary: SEAD
|
- primary: SEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F/A-18C Hornet (Lot 20)
|
- F/A-18C Hornet (Lot 20)
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-2C Hawkeye
|
- E-2C Hawkeye
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- S-3B Tanker
|
- S-3B Tanker
|
||||||
Blue LHA:
|
Blue LHA:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AV-8B Harrier II Night Attack
|
- AV-8B Harrier II Night Attack
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- AH-64D Apache Longbow
|
- AH-64D Apache Longbow
|
||||||
From Incirlik:
|
From Incirlik:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: air-to-air
|
secondary: air-to-air
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15C Eagle
|
- F-15C Eagle
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-10C Thunderbolt II (Suite 7)
|
- A-10C Thunderbolt II (Suite 7)
|
||||||
- primary: DEAD
|
- primary: DEAD
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-16CM Fighting Falcon (Block 50)
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
- primary: Strike
|
- primary: Strike
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- F-15E Strike Eagle
|
- F-15E Strike Eagle
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- E-3A
|
- E-3A
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- KC-135 Stratotanker
|
- KC-135 Stratotanker
|
||||||
#FARPs
|
#FARPs
|
||||||
UNOMIG Sector HQ:
|
UNOMIG Sector HQ:
|
||||||
- primary: Air Assault
|
- primary: Air Assault
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- UH-1H Iroquois
|
- UH-1H Iroquois
|
||||||
Dzhugba:
|
Dzhugba:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Mi-24P Hind-F
|
- Mi-24P Hind-F
|
||||||
#Sukhumi-Babushara
|
#Sukhumi-Babushara
|
||||||
20:
|
20:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- MiG-29S Fulcrum-C
|
- MiG-29S Fulcrum-C
|
||||||
#Sochi-Adler
|
#Sochi-Adler
|
||||||
18:
|
18:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-24M Fencer-D
|
- Su-24M Fencer-D
|
||||||
#Anapa-Vityazevo
|
#Anapa-Vityazevo
|
||||||
12:
|
12:
|
||||||
- primary: CAS
|
- primary: CAS
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
aircraft:
|
aircraft:
|
||||||
- Su-25T Frogfoot
|
- Su-25T Frogfoot
|
||||||
- primary: AEW&C
|
- primary: AEW&C
|
||||||
aircraft:
|
aircraft:
|
||||||
- A-50
|
- A-50
|
||||||
- primary: Refueling
|
- primary: Refueling
|
||||||
aircraft:
|
aircraft:
|
||||||
- IL-78M
|
- IL-78M
|
||||||
Red CV:
|
Red CV:
|
||||||
- primary: BARCAP
|
- primary: BARCAP
|
||||||
secondary: any
|
secondary: any
|
||||||
aircraft:
|
aircraft:
|
||||||
- SU-33 Flanker-D
|
- SU-33 Flanker-D
|
||||||
#I am aware there is no Russian LHA. This is just for campaign inversion.
|
#I am aware there is no Russian LHA. This is just for campaign inversion.
|
||||||
Red LHA:
|
Red LHA:
|
||||||
- primary: BAI
|
- primary: BAI
|
||||||
secondary: air-to-ground
|
secondary: air-to-ground
|
||||||
|
|
||||||
Binary file not shown.
@@ -2,36 +2,36 @@ local unitPayloads = {
|
|||||||
["name"] = "F-15E",
|
["name"] = "F-15E",
|
||||||
["payloads"] = {
|
["payloads"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["displayName"] = "Liberation CAS",
|
["displayName"] = "CAS",
|
||||||
["name"] = "Liberation CAS",
|
["name"] = "CAS",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
|
|
||||||
["num"] = 18,
|
|
||||||
},
|
|
||||||
[2] = {
|
|
||||||
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
|
|
||||||
["num"] = 2,
|
|
||||||
},
|
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[4] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
["num"] = 17,
|
["num"] = 6,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
["num"] = 19,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[7] = {
|
[7] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
["num"] = 10,
|
["num"] = 9,
|
||||||
},
|
},
|
||||||
[8] = {
|
[8] = {
|
||||||
["CLSID"] = "{CBU_105}",
|
["CLSID"] = "{CBU_105}",
|
||||||
@@ -39,47 +39,23 @@ local unitPayloads = {
|
|||||||
},
|
},
|
||||||
[9] = {
|
[9] = {
|
||||||
["CLSID"] = "{CBU_105}",
|
["CLSID"] = "{CBU_105}",
|
||||||
["num"] = 9,
|
["num"] = 12,
|
||||||
},
|
},
|
||||||
[10] = {
|
[10] = {
|
||||||
["CLSID"] = "{CBU_105}",
|
|
||||||
["num"] = 8,
|
|
||||||
},
|
|
||||||
[11] = {
|
|
||||||
["CLSID"] = "{CBU_105}",
|
|
||||||
["num"] = 7,
|
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{CBU_105}",
|
|
||||||
["num"] = 12,
|
|
||||||
},
|
|
||||||
[13] = {
|
|
||||||
["CLSID"] = "{CBU_105}",
|
["CLSID"] = "{CBU_105}",
|
||||||
["num"] = 13,
|
["num"] = 13,
|
||||||
},
|
},
|
||||||
[14] = {
|
[11] = {
|
||||||
["CLSID"] = "{Mk82AIR}",
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 6,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
[15] = {
|
[12] = {
|
||||||
["CLSID"] = "{Mk82AIR}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 5,
|
["num"] = 19,
|
||||||
},
|
},
|
||||||
[16] = {
|
[13] = {
|
||||||
["CLSID"] = "{Mk82AIR}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 4,
|
["num"] = 17,
|
||||||
},
|
|
||||||
[17] = {
|
|
||||||
["CLSID"] = "{Mk82AIR}",
|
|
||||||
["num"] = 14,
|
|
||||||
},
|
|
||||||
[18] = {
|
|
||||||
["CLSID"] = "{Mk82AIR}",
|
|
||||||
["num"] = 15,
|
|
||||||
},
|
|
||||||
[19] = {
|
|
||||||
["CLSID"] = "{Mk82AIR}",
|
|
||||||
["num"] = 16,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
@@ -90,54 +66,46 @@ local unitPayloads = {
|
|||||||
["name"] = "STRIKE",
|
["name"] = "STRIKE",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 4,
|
|
||||||
},
|
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-38}",
|
||||||
["num"] = 6,
|
["num"] = 11,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-31}",
|
||||||
["num"] = 7,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-38}",
|
||||||
["num"] = 9,
|
["num"] = 13,
|
||||||
},
|
},
|
||||||
[7] = {
|
[7] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 10,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
[8] = {
|
[8] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-38}",
|
||||||
["num"] = 11,
|
["num"] = 12,
|
||||||
},
|
},
|
||||||
[9] = {
|
[9] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 13,
|
|
||||||
},
|
|
||||||
[10] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 14,
|
|
||||||
},
|
|
||||||
[11] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 16,
|
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
|
||||||
["num"] = 19,
|
["num"] = 19,
|
||||||
},
|
},
|
||||||
[13] = {
|
[10] = {
|
||||||
|
["CLSID"] = "{GBU-31}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[11] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 17,
|
["num"] = 17,
|
||||||
},
|
},
|
||||||
@@ -150,32 +118,44 @@ local unitPayloads = {
|
|||||||
["name"] = "CAP",
|
["name"] = "CAP",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
|
||||||
["num"] = 10,
|
|
||||||
},
|
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 19,
|
["num"] = 11,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 17,
|
["num"] = 17,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 18,
|
["num"] = 13,
|
||||||
},
|
},
|
||||||
[7] = {
|
[7] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 19,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 2,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
@@ -186,48 +166,44 @@ local unitPayloads = {
|
|||||||
["name"] = "ANTISHIP",
|
["name"] = "ANTISHIP",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 9,
|
|
||||||
},
|
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
|
||||||
["num"] = 10,
|
|
||||||
},
|
|
||||||
[5] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 11,
|
["num"] = 11,
|
||||||
},
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 19,
|
|
||||||
},
|
|
||||||
[7] = {
|
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
|
||||||
["num"] = 17,
|
|
||||||
},
|
|
||||||
[8] = {
|
|
||||||
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
|
|
||||||
["num"] = 18,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
|
||||||
|
["num"] = 13,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 19,
|
||||||
|
},
|
||||||
[9] = {
|
[9] = {
|
||||||
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
|
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
|
||||||
["num"] = 2,
|
["num"] = 9,
|
||||||
},
|
},
|
||||||
[10] = {
|
[10] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 12,
|
["num"] = 17,
|
||||||
},
|
|
||||||
[11] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 8,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
@@ -235,117 +211,169 @@ local unitPayloads = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["name"] = "SEAD",
|
["name"] = "DEAD",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 9,
|
|
||||||
},
|
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
["num"] = 10,
|
["num"] = 6,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 11,
|
|
||||||
},
|
|
||||||
[6] = {
|
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
|
||||||
["num"] = 19,
|
|
||||||
},
|
|
||||||
[7] = {
|
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 17,
|
["num"] = 17,
|
||||||
},
|
},
|
||||||
[8] = {
|
[6] = {
|
||||||
["CLSID"] = "{9BCC2A2B-5708-4860-B1F1-053A18442067}",
|
["CLSID"] = "{GBU-38}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 18,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
[9] = {
|
[8] = {
|
||||||
["CLSID"] = "{9BCC2A2B-5708-4860-B1F1-053A18442067}",
|
|
||||||
["num"] = 2,
|
|
||||||
},
|
|
||||||
[10] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-38}",
|
||||||
["num"] = 12,
|
["num"] = 12,
|
||||||
},
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 19,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
[11] = {
|
[11] = {
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 8,
|
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
["CLSID"] = "{GBU-38}",
|
||||||
["num"] = 13,
|
["num"] = 13,
|
||||||
},
|
},
|
||||||
[13] = {
|
|
||||||
["CLSID"] = "{GBU-38}",
|
|
||||||
["num"] = 7,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 32,
|
[1] = 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["name"] = "Liberation OCA/Runway",
|
["name"] = "OCA/Runway",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[3] = {
|
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
|
||||||
["num"] = 4,
|
|
||||||
},
|
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
["CLSID"] = "{GBU-31}",
|
||||||
["num"] = 6,
|
["num"] = 11,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
["CLSID"] = "{GBU-31}",
|
||||||
["num"] = 7,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
["CLSID"] = "{GBU-31}",
|
||||||
["num"] = 9,
|
["num"] = 10,
|
||||||
},
|
},
|
||||||
[7] = {
|
[7] = {
|
||||||
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
["num"] = 10,
|
["num"] = 18,
|
||||||
},
|
},
|
||||||
[8] = {
|
[8] = {
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 11,
|
["num"] = 17,
|
||||||
},
|
},
|
||||||
[9] = {
|
[9] = {
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
["num"] = 13,
|
|
||||||
},
|
|
||||||
[10] = {
|
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
|
||||||
["num"] = 14,
|
|
||||||
},
|
|
||||||
[11] = {
|
|
||||||
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
|
||||||
["num"] = 16,
|
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
|
||||||
["num"] = 19,
|
["num"] = 19,
|
||||||
},
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{GBU-31}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[11] = {
|
||||||
|
["CLSID"] = "{GBU-31}",
|
||||||
|
["num"] = 13,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["name"] = "OCA/Aircraft",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 10,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 13,
|
||||||
|
},
|
||||||
|
[11] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 14,
|
||||||
|
},
|
||||||
|
[12] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 16,
|
||||||
|
},
|
||||||
[13] = {
|
[13] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 18,
|
||||||
|
},
|
||||||
|
[14] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 19,
|
||||||
|
},
|
||||||
|
[15] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 17,
|
["num"] = 17,
|
||||||
},
|
},
|
||||||
|
|||||||
107
resources/customized_payloads/Ka-50_3.lua
Normal file
107
resources/customized_payloads/Ka-50_3.lua
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
local unitPayloads = {
|
||||||
|
["name"] = "Ka-50_3",
|
||||||
|
["payloads"] = {
|
||||||
|
[1] = {
|
||||||
|
["name"] = "Liberation CAS",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 31,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["displayName"] = "Liberation BAI",
|
||||||
|
["name"] = "Liberation BAI",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 31,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["displayName"] = "Liberation OCA/Aircraft",
|
||||||
|
["name"] = "Liberation OCA/Aircraft",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{9S846_2xIGLA}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "B_8V20A_OFP2",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "B_8V20A_OFP2",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "B_8V20A_OFP2",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "B_8V20A_OFP2",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 31,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
},
|
||||||
|
["unitType"] = "Ka-50_3",
|
||||||
|
}
|
||||||
|
return unitPayloads
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
"F/A-18C Hornet (Lot 20)",
|
"F/A-18C Hornet (Lot 20)",
|
||||||
"JF-17 Thunder",
|
"JF-17 Thunder",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"Mirage 2000C",
|
"Mirage 2000C",
|
||||||
"Mirage-F1B",
|
"Mirage-F1B",
|
||||||
"Mirage-F1BE",
|
"Mirage-F1BE",
|
||||||
@@ -35,6 +36,7 @@
|
|||||||
"Mirage-F1M-EE",
|
"Mirage-F1M-EE",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
"Mi-8MTV2 Hip",
|
"Mi-8MTV2 Hip",
|
||||||
|
"MiG-29S Fulcrum-C",
|
||||||
"SA 342L Gazelle",
|
"SA 342L Gazelle",
|
||||||
"SA 342M Gazelle",
|
"SA 342M Gazelle",
|
||||||
"Su-25T Frogfoot",
|
"Su-25T Frogfoot",
|
||||||
@@ -109,5 +111,13 @@
|
|||||||
],
|
],
|
||||||
"has_jtac": true,
|
"has_jtac": true,
|
||||||
"jtac_unit": "MQ-9 Reaper",
|
"jtac_unit": "MQ-9 Reaper",
|
||||||
"unrestricted_satnav": true
|
"unrestricted_satnav": true,
|
||||||
|
"liveries_overrides": {
|
||||||
|
"Ka-50 Hokum": ["georgia camo"],
|
||||||
|
"Mi-8MTV2 Hip": ["Ukraine"],
|
||||||
|
"Mi-24P Hind-F": ["Ukrainian Army Aviation"],
|
||||||
|
"MiG-29S Fulcrum-C": ["Air Force Ukraine Standard"],
|
||||||
|
"Su-25T Frogfoot": ["af standard 101"],
|
||||||
|
"Su-27 Flanker-B": ["Air Force Ukraine Standard"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
62
resources/factions/peru_1995.json
Normal file
62
resources/factions/peru_1995.json
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"country": "Peru",
|
||||||
|
"name": "Peru 1995",
|
||||||
|
"authors": "Dillie",
|
||||||
|
"description": "<p>Peru during the 1995 Cenepa War.</p>",
|
||||||
|
"locales": [
|
||||||
|
"es_ES"
|
||||||
|
],
|
||||||
|
"aircrafts": [
|
||||||
|
"Mirage 2000C",
|
||||||
|
"Mi-24V Hind-E",
|
||||||
|
"Mi-8MTV2 Hip",
|
||||||
|
"MB-339A",
|
||||||
|
"Su-22M4 Fitter-K"
|
||||||
|
],
|
||||||
|
"frontline_units": [
|
||||||
|
"T-55A",
|
||||||
|
"M113",
|
||||||
|
"BRDM-2",
|
||||||
|
"BTR-80",
|
||||||
|
"M1043 HMMWV (M2 HMG)",
|
||||||
|
"ZSU-23-4 Shilka"
|
||||||
|
],
|
||||||
|
"artillery_units": [
|
||||||
|
"BM-21 Grad",
|
||||||
|
"M109A6 Paladin"
|
||||||
|
],
|
||||||
|
"logistics_units": [
|
||||||
|
"Truck Ural-4320T"
|
||||||
|
],
|
||||||
|
"infantry_units": [
|
||||||
|
"Infantry AK-74",
|
||||||
|
"Infantry RPG",
|
||||||
|
"Infantry M249",
|
||||||
|
"MANPADS SA-18 Igla \"Grouse\""
|
||||||
|
],
|
||||||
|
"missiles": [],
|
||||||
|
"preset_groups": [
|
||||||
|
"SA-3/S-125"
|
||||||
|
],
|
||||||
|
"naval_units": [],
|
||||||
|
"air_defense_units": [
|
||||||
|
"AAA ZU-23 Emplacement",
|
||||||
|
"Bofors 40 mm Gun",
|
||||||
|
"SAM P19 \"Flat Face\" SR (SA-2/3)",
|
||||||
|
"ZSU-23-4 Shilka"
|
||||||
|
],
|
||||||
|
"carrier_names": [],
|
||||||
|
"helicopter_carrier_names": [],
|
||||||
|
"cruiser": [],
|
||||||
|
"requirements": {},
|
||||||
|
"has_jtac": false,
|
||||||
|
"doctrine": "modern",
|
||||||
|
"liveries_overrides": {
|
||||||
|
"Mirage 2000C": [
|
||||||
|
"Peru052"
|
||||||
|
],
|
||||||
|
"MB-339A": [
|
||||||
|
"MB339AP 'PERU'"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
],
|
],
|
||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"L-39ZA Albatros",
|
"L-39ZA Albatros",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"J-15 Flanker X-2",
|
"J-15 Flanker X-2",
|
||||||
"J-7B",
|
"J-7B",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"L-39ZA Albatros",
|
"L-39ZA Albatros",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
"J-11A Flanker-L",
|
"J-11A Flanker-L",
|
||||||
"JF-17 Thunder",
|
"JF-17 Thunder",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"L-39ZA Albatros",
|
"L-39ZA Albatros",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"IL-76MD",
|
"IL-76MD",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
"Mi-8MTV2 Hip",
|
"Mi-8MTV2 Hip",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"IL-76MD",
|
"IL-76MD",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"L-39ZA Albatros",
|
"L-39ZA Albatros",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"IL-76MD",
|
"IL-76MD",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"L-39ZA Albatros",
|
"L-39ZA Albatros",
|
||||||
"Mi-24V Hind-E",
|
"Mi-24V Hind-E",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
|
|||||||
@@ -48,11 +48,15 @@
|
|||||||
"Rapier"
|
"Rapier"
|
||||||
],
|
],
|
||||||
"naval_units": [
|
"naval_units": [
|
||||||
"FFG Oliver Hazard Perry",
|
|
||||||
"DDG Arleigh Burke IIa",
|
|
||||||
"CG Ticonderoga",
|
"CG Ticonderoga",
|
||||||
"LHA-1 Tarawa",
|
"CVN-74 John C. Stennis",
|
||||||
"CVN-74 John C. Stennis"
|
"Castle Class",
|
||||||
|
"DDG Arleigh Burke IIa",
|
||||||
|
"FFG Oliver Hazard Perry",
|
||||||
|
"HMS Achilles (F12)",
|
||||||
|
"HMS Andromeda (F57)",
|
||||||
|
"HMS Ariadne (F72)",
|
||||||
|
"HMS Invincible (R05)"
|
||||||
],
|
],
|
||||||
"missiles": [],
|
"missiles": [],
|
||||||
"air_defense_units": [
|
"air_defense_units": [
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
"F-16CM Fighting Falcon (Block 50)",
|
"F-16CM Fighting Falcon (Block 50)",
|
||||||
"F/A-18C Hornet (Lot 20)",
|
"F/A-18C Hornet (Lot 20)",
|
||||||
"Ka-50 Hokum",
|
"Ka-50 Hokum",
|
||||||
|
"Ka-50 Hokum (Blackshark 3)",
|
||||||
"MB-339A",
|
"MB-339A",
|
||||||
"Mi-24P Hind-F",
|
"Mi-24P Hind-F",
|
||||||
"SH-60B Seahawk",
|
"SH-60B Seahawk",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ female_pilot_percentage: 0
|
|||||||
country: USA
|
country: USA
|
||||||
role: Strike Fighter
|
role: Strike Fighter
|
||||||
aircraft: F-14A Tomcat (Block 135-GR Late)
|
aircraft: F-14A Tomcat (Block 135-GR Late)
|
||||||
livery: VF-33 Starfighters 201
|
livery: VF-33 Starfighters AB201(Dale Snodgrass)
|
||||||
mission_types:
|
mission_types:
|
||||||
- BAI
|
- BAI
|
||||||
- BARCAP
|
- BARCAP
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
name: Escuadrón Aéreo 412
|
||||||
|
nickname: Halcones
|
||||||
|
country: Peru
|
||||||
|
role: Fighter
|
||||||
|
aircraft: Mirage 2000C
|
||||||
|
livery: Peru052
|
||||||
|
mission_types:
|
||||||
|
- BARCAP
|
||||||
|
- Escort
|
||||||
|
- Intercept
|
||||||
|
- Fighter sweep
|
||||||
|
- TARCAP
|
||||||
|
- BAI
|
||||||
|
- CAS
|
||||||
|
- OCA/Aircraft
|
||||||
|
- OCA/Runway
|
||||||
|
- Strike
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 15 KiB |
BIN
resources/ui/units/aircrafts/banners/Ka-50_3_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/banners/Ka-50_3_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 276 KiB |
BIN
resources/ui/units/aircrafts/icons/Ka-50_3_24.jpg
Normal file
BIN
resources/ui/units/aircrafts/icons/Ka-50_3_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
26
resources/units/aircraft/Ka-50_3.yaml
Normal file
26
resources/units/aircraft/Ka-50_3.yaml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
class: Helicopter
|
||||||
|
always_keeps_gun: true
|
||||||
|
carrier_capable: true
|
||||||
|
description:
|
||||||
|
"The Ka-50 Black Shark (NATO reporting name: Hokum) is a unique and deadly
|
||||||
|
single-seat, Russian attack helicopter that has seen combat in the Northern
|
||||||
|
Caucasus. It combines a high performance dual rotor system with a deadly
|
||||||
|
weapons payload of guided missiles, rockets, bombs, and a 30mm cannon. The
|
||||||
|
Ka-50 is also unique in that it has an ejection seat."
|
||||||
|
introduced: 1995
|
||||||
|
lha_capable: true
|
||||||
|
cabin_size: 0 # Can not transport troops
|
||||||
|
can_carry_crates: true
|
||||||
|
manufacturer: Kamov
|
||||||
|
origin: USSR/Russia
|
||||||
|
price: 20
|
||||||
|
role: Attack
|
||||||
|
variants:
|
||||||
|
Ka-50 Hokum (Blackshark 3): {}
|
||||||
|
radios:
|
||||||
|
intra_flight: R-800L1
|
||||||
|
inter_flight: R-800L1
|
||||||
|
# The R-800L1 doesn't have preset channels, and the other radio is for
|
||||||
|
# communications with FAC and ground units, which don't currently have
|
||||||
|
# radios assigned, so no channels to configure.
|
||||||
|
kneeboard_units: "metric"
|
||||||
4
resources/units/ships/CastleClass_01.yaml
Normal file
4
resources/units/ships/CastleClass_01.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class: Boat
|
||||||
|
price: 0
|
||||||
|
variants:
|
||||||
|
Castle Class: null
|
||||||
4
resources/units/ships/hms_invincible.yaml
Normal file
4
resources/units/ships/hms_invincible.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class: HelicopterCarrier
|
||||||
|
price: 0
|
||||||
|
variants:
|
||||||
|
HMS Invincible (R05): null
|
||||||
4
resources/units/ships/leander-gun-achilles.yaml
Normal file
4
resources/units/ships/leander-gun-achilles.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class: Frigate
|
||||||
|
price: 0
|
||||||
|
variants:
|
||||||
|
HMS Achilles (F12): null
|
||||||
4
resources/units/ships/leander-gun-andromeda.yaml
Normal file
4
resources/units/ships/leander-gun-andromeda.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class: Frigate
|
||||||
|
price: 0
|
||||||
|
variants:
|
||||||
|
HMS Andromeda (F57): null
|
||||||
4
resources/units/ships/leander-gun-ariadne.yaml
Normal file
4
resources/units/ships/leander-gun-ariadne.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
class: Frigate
|
||||||
|
price: 0
|
||||||
|
variants:
|
||||||
|
HMS Ariadne (F72): null
|
||||||
Reference in New Issue
Block a user