Compare commits

...

44 Commits

Author SHA1 Message Date
Raffson
801e9efe8c Fix heli spawn/landing at FOB/FARP
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2719.

(cherry picked from commit 34de855b8f889b72406c101d0cea385988e24bf9)
(cherry picked from commit b41ef0ab13)
2023-02-05 14:41:47 -08:00
Dan Albert
5708fe625b Don't generate runway data for heliports.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2710.

(cherry picked from commit c33a0d5deb)
2023-02-05 14:41:47 -08:00
Dan Albert
1dda0c9497 Pin version of black used in GHA.
Black rolls out style changes every year, and using "stable" means that
the check run on PRs might start formatting differently than we do
locally, or require a reformat of the codebase to make a PR submittable.

Pin to the version that we've been using. We should update to 23 at some
point, but we want to do that deliberately.

(cherry picked from commit 937bacacb7)
2023-02-05 12:15:50 -08:00
Dan Albert
56d7641251 Fix line endings.
(cherry-picked from commit e8824e5d03)
2023-02-05 12:15:50 -08:00
Dan Albert
938d6b4bdf Fix invalid tanker planning.
All three refueling missions share a common task type and differentiate
their behavior based on the type and allegiance of the package target.
This means that if the theater commander identifies a carrier as the
best location for a theater refueling task, a recovery tanker will be
planned by mistake.

If this happens on a sunken carrier, mission generation will fail
because a recovery tanker cannot be generated for a sunken carrier.

Fix the crash and the misplanned theater tanker by preventing the
commander from choosing fleet control points as refueling targets.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2693.

(cherry picked from commit eea98b01f6)
2023-01-28 14:05:57 -08:00
Dan Albert
5caf07f476 Fix unit ID of the KS-19.
It seems like this unit has never worked because of the unit ID
mismatch.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2701.

(cherry picked from commit 0df268f331)
2023-01-28 12:10:38 -08:00
Dan Albert
d1d4fde6a3 Update game version to 6.1.1. 2023-01-28 12:10:38 -08:00
RndName
440fe2e019 Only check for ground units in capture trigger zone
requires pydcs update: https://github.com/pydcs/dcs/pull/279

(cherry picked from commit f9903f1e19)
2022-12-21 13:26:42 -08:00
RndName
c82bc1c211 Change iads command unit type
(cherry picked from commit 4a4935f165)
2022-12-21 13:26:42 -08:00
RndName
f855d2956c Only add skynet iads command unit when advanced iads is in use
(cherry picked from commit 09f92cc5e4)
2022-12-21 13:26:42 -08:00
Dan Albert
24aebf5ff6 Update pydcs.
Includes UnitType parameter of AllOfCoalition in/out zone condition.

(cherry picked from commit 887e5997c2)
2022-12-21 13:26:42 -08:00
Dan Albert
8004dccdb2 Update changelog for Blackshark 3.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2657.

(cherry picked from commit f88a50dd07)
2022-12-21 12:43:05 -08:00
Dan Albert
7e7cb4f0bc Add icons and banners for BS3.
https://github.com/dcs-liberation/dcs_liberation/issues/2657
(cherry picked from commit 3f12a5ae3d)
2022-12-21 12:43:05 -08:00
Dan Albert
801e3afb98 Add BS3 loadouts.
https://github.com/dcs-liberation/dcs_liberation/issues/2657
(cherry picked from commit f2946817bf)
2022-12-21 12:43:05 -08:00
Dan Albert
48ea33611d Add BS3 to factions that have BS2.
https://github.com/dcs-liberation/dcs_liberation/issues/2657
(cherry picked from commit 935a9b0631)
2022-12-21 12:43:05 -08:00
Dan Albert
7b588c5437 Add blackshark 3 yaml.
There are no significant notable changes from Blackshark 2, so this is
the same YAML.

https://github.com/dcs-liberation/dcs_liberation/issues/2657
(cherry picked from commit c0dc411102)
2022-12-21 12:43:05 -08:00
Dan Albert
e85b1a3195 Add Blackshark 3 to the mission planning DB.
https://github.com/dcs-liberation/dcs_liberation/issues/2657
(cherry picked from commit 55037626a4)
2022-12-21 12:43:05 -08:00
Dan Albert
8132b9a080 Fix type-only import that needs to be real.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2660.

(cherry picked from commit fc3e72bacf)
2022-12-21 12:43:05 -08:00
Dan Albert
8e0cf2284b Update changelog for pydcs update.
(cherry picked from commit 66523301aa)
2022-12-21 12:43:05 -08:00
Dan Albert
87405ba58a Expand gitattributes to cover common files.
Specifically adding this so that yaml changes stop being uploaded as
CRLF, but the rest is likely useful too.

(cherry picked from commit 54546aaefb)
2022-12-21 12:43:05 -08:00
Dan Albert
0952cf4c75 Update bug templates to 6.0.0.
We're not fixing 5.x bugs any more.

(cherry picked from commit ded5fc8b1d)
2022-12-21 12:43:05 -08:00
SnappyComebacks
5bf5b41f2d Add Recovery Tankers (#2661)
Add support for recovery tankers at aircraft carriers.

Cherry picked from 9a81121ac1 and
0fd0f0e7c0
2022-12-21 05:17:02 +00:00
Dan Albert
715c60583a Save the last turn for bug reports.
We often get save games uploaded with bug reports that are already in a
broken state with nothing we can do about it. This saves that turn to
`last_turn.liberation` so users are less likely to have clobbered the
useful data before filing the report.

(cherry picked from commit 22503d4e95)
2022-12-20 14:09:25 -08:00
Dan Albert
5dcd1e9360 Fix the channel's landmap.
Caused by a bad rename when I did the migration. The landmap in 6.0.0
was actually a GIF...

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2612.

(cherry picked from commit de9236e93a)
2022-12-20 13:06:15 -08:00
SnappyComebacks
ef7978e887 Update F-15E loadouts.
(cherry picked from commit a245ba80c3)
2022-12-14 22:00:06 -07:00
Dan Albert
8cfb1790b2 Add new British navy units to the UK faction.
I haven't removed the old US navy stuff from this faction, since all the
new UK ships are frigates, and removing the US stuff would deprive the
faction of cruisers and destroyers, which might break generation (I'm
not familiar enough with the new system to say for sure).

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2571.

(cherry picked from commit 9a1860fc5e)
2022-12-13 00:14:48 -08:00
Dan Albert
41203b9bed Add HMS Invincible as a valid runway.
(cherry picked from commit f3f5ab70ea)
2022-12-13 00:14:48 -08:00
ColonelAkirNakesh
50fb1f5d97 Add HMS Invincible.
(cherry picked from commit 7f916d55e7)
2022-12-13 00:14:48 -08:00
Dan Albert
e041fa3c70 Fix changelog formatting.
(cherry picked from commit 6ce7638fdc)
2022-12-12 23:43:09 -08:00
Dan Albert
f358c1c0b2 Add missing changelog note.
(cherry picked from commit 43ea019091)
2022-12-12 21:33:12 -08:00
ColonelAkirNakesh
a18dbe0a72 Add support for Leander class HMS Andromeda.
https://github.com/dcs-liberation/dcs_liberation/issues/2571
(cherry picked from commit 7673ca5481)
2022-12-12 19:30:26 -08:00
ColonelAkirNakesh
00e7a1fe55 Add support for Leander class HMS Ariadne.
https://github.com/dcs-liberation/dcs_liberation/issues/2571
(cherry picked from commit 774a37a7d2)
2022-12-12 19:30:26 -08:00
ColonelAkirNakesh
b664a8cac5 Add support for Castle Class.
https://github.com/dcs-liberation/dcs_liberation/issues/2571
(cherry picked from commit 905094f63f)
2022-12-12 19:30:26 -08:00
ColonelAkirNakesh
2c4678aa48 Add support for Leander class HMS Achilles.
https://github.com/dcs-liberation/dcs_liberation/issues/2571
(cherry picked from commit fd5b7ba49d)
2022-12-12 19:30:26 -08:00
Dan Albert
eafc70a5e5 Fix livery for VF-33 F-14A squadron.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2610.

(cherry picked from commit 6025cad716)
2022-12-12 19:30:26 -08:00
Dan Albert
7fb1d25887 Add changelog notes that were missed in PRs.
(cherry picked from commit 28859a8a9c)
2022-12-12 19:30:26 -08:00
Dan Albert
d9491c47b8 Fix encoding issues with the Peru faction.
Not really sure what's going on here, but presumably it's UTF-16 and
UTF-8 fighting.

(cherry picked from commit 9365aea724)
2022-12-12 19:30:26 -08:00
DillieKoe
2c26f366a8 Add Peru faction.
A new Peru faction with a mirage squadon

(cherry picked from commit 304fd7ea80)
2022-12-12 19:30:26 -08:00
ColonelAkirNakesh
c30636b4d2 Override liveries for Russian aircraft in bluefor faction.
(cherry picked from commit 5e345263a7)
2022-12-12 18:47:44 -08:00
dependabot[bot]
a3a91c5771 Bump certifi from 2022.6.15 to 2022.12.7
Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.6.15 to 2022.12.7.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.06.15...2022.12.07)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 445ee25bbf)
2022-12-12 17:50:19 -08:00
Dan Albert
3d64619481 Fix CAS not having landing waypoints.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2611.

(cherry picked from commit 20937815f8)
2022-12-03 17:01:26 -08:00
RndName
3b97f7a2ba Fix manual debrief submit not ending mission
cherry-pick from 3863b8ef40
2022-11-30 13:29:40 +01:00
SnappyComebacks
6779ee96be Add F-15E to DEAD_CAPABLE in AI flight planner.
(cherry picked from commit 1b828b95b3)
2022-11-27 22:16:30 -07:00
Dan Albert
d9134650dc Branch for 6.1. 2022-11-27 21:07:47 -08:00
59 changed files with 1314 additions and 675 deletions

76
.gitattributes vendored
View File

@@ -14,3 +14,79 @@
*.pyo binary export-ignore
*.pyd binary
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

View File

@@ -31,12 +31,13 @@ body:
If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below.
options:
- 5.2.0
- 6.0.0
- Development build
- type: textarea
attributes:
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
attributes:
label: Description
@@ -52,18 +53,17 @@ body:
description: >
Attach any files needed to reproduce the bug here. **A save game is
required.** We typically cannot help without a save game (the
`.liberation` file found in
`%USERPROFILE%/Saved Games/DCS/Liberation/Saves`), so most bugs filed
without saved games will be closed without investigation.
`.liberation` file found in `%USERPROFILE%/Saved
Games/DCS/Liberation/Saves`), so most bugs filed without saved games
will be closed without investigation.
Other useful files to include are:
The Liberation log file. The log file is located at
`<Liberation install directory>/logs/liberation.log`. The log often
includes data about non-fatal errors that could be the root cause of the
problem.
The Liberation log file. The log file is located at `<Liberation install
directory>/logs/liberation.log`. The log often includes data about
non-fatal errors that could be the root cause of the problem.
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
`<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
into this text box. GitHub will not allow uploads of all file types, so
You can attach files to the bug by dragging and dropping the file into
this text box. GitHub will not allow uploads of all file types, so
attach a zip of the files if needed.
validations:
required: true

View File

@@ -39,12 +39,13 @@ body:
If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below.
options:
- 5.2.0
- 6.0.0
- Development build
- type: textarea
attributes:
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
attributes:
label: Campaign name
@@ -59,8 +60,8 @@ body:
label: Blue faction
description: >
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
faction file as an attachment to the bug description field.
custom faction (or modifications to a stock faction), upload the faction
file as an attachment to the bug description field.
validations:
required: true
- type: input
@@ -68,8 +69,8 @@ body:
label: Red faction
description: >
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
faction file as an attachment to the bug description field.
custom faction (or modifications to a stock faction), upload the faction
file as an attachment to the bug description field.
validations:
required: true
- type: textarea
@@ -102,11 +103,11 @@ body:
attributes:
label: Log file
description: >
Attach the Liberation log file. The log file is located at
`<Liberation install directory>/logs/liberation.log`.
Attach the Liberation log file. The log file is located at `<Liberation
install directory>/logs/liberation.log`.
You can attach files to the bug by dragging and dropping the file
into this text box.
You can attach files to the bug by dragging and dropping the file into
this text box.
validations:
required: true

View File

@@ -11,6 +11,7 @@ jobs:
- uses: actions/setup-python@v2
- uses: psf/black@stable
with:
version: ~=22.12
src: "."
options: "--check"

View File

@@ -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
Saves from 5.x are not compatible with 6.0.

View File

@@ -10,6 +10,7 @@ from dcs.helicopters import (
CH_47D,
CH_53E,
Ka_50,
Ka_50_3,
Mi_24P,
Mi_24V,
Mi_26,
@@ -237,6 +238,7 @@ CAS_CAPABLE = [
OH_58D,
SA342M,
SA342L,
Ka_50_3,
Ka_50,
Mi_28N,
Mi_24P,
@@ -308,6 +310,7 @@ SEAD_CAPABLE = [
# Aircraft used for DEAD tasks. Must be capable of the CAS DCS task.
DEAD_CAPABLE = SEAD_CAPABLE + [
AJS37,
F_15E,
F_14B,
F_14A_135_GR,
JAS39Gripen_AG,

View File

@@ -29,7 +29,7 @@ class CasLayout(PatrollingLayout):
yield self.target
yield self.patrol_end
yield from self.nav_from
yield self.departure
yield self.arrival
if self.divert is not None:
yield self.divert
yield self.bullseye

View File

@@ -3,6 +3,8 @@ from __future__ import annotations
from typing import Any, TYPE_CHECKING, Type
from game.ato import FlightType
from game.theater.controlpoint import NavalControlPoint
from game.theater.frontline import FrontLine
from .aewc import AewcFlightPlan
from .airassault import AirAssaultFlightPlan
from .airlift import AirliftFlightPlan
@@ -19,6 +21,7 @@ from .ocarunway import OcaRunwayFlightPlan
from .packagerefueling import PackageRefuelingFlightPlan
from .planningerror import PlanningError
from .sead import SeadFlightPlan
from .shiprecoverytanker import RecoveryTankerFlightPlan
from .strike import StrikeFlightPlan
from .sweep import SweepFlightPlan
from .tarcap import TarCapFlightPlan
@@ -26,15 +29,19 @@ from .theaterrefueling import TheaterRefuelingFlightPlan
if TYPE_CHECKING:
from game.ato import Flight
from game.theater import FrontLine
class FlightPlanBuilderTypes:
@staticmethod
def for_flight(flight: Flight) -> Type[IBuilder[Any, Any]]:
if flight.flight_type is FlightType.REFUELING:
if flight.package.target.is_friendly(flight.squadron.player) or isinstance(
flight.package.target, FrontLine
target = flight.package.target
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 PackageRefuelingFlightPlan.builder_type()

View 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())

View File

@@ -23,7 +23,7 @@ from game.theater import (
TheaterGroundObject,
TheaterUnit,
)
from game.utils import Distance, meters, nautical_miles
from game.utils import Distance, feet, meters, nautical_miles
if TYPE_CHECKING:
from game.coalition import Coalition
@@ -204,6 +204,19 @@ class WaypointBuilder:
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:
alt_type: AltitudeReference = "BARO"
if self.is_helo:

View File

@@ -49,3 +49,4 @@ class FlightWaypointType(IntEnum):
REFUEL = 29 # Should look for nearby tanker to refuel from.
CARGO_STOP = 30 # Stopover landing point using the LandingReFuAr waypoint type
INGRESS_AIR_ASSAULT = 31
RECOVERY_TANKER = 32

View File

@@ -5,6 +5,7 @@ import operator
from collections.abc import Iterable, Iterator
from typing import TYPE_CHECKING, TypeVar
from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache
from game.theater import (
Airfield,
ControlPoint,
@@ -15,12 +16,11 @@ from game.theater import (
)
from game.theater.theatergroundobject import (
BuildingGroundObject,
IadsBuildingGroundObject,
IadsGroundObject,
NavalGroundObject,
IadsBuildingGroundObject,
)
from game.utils import meters, nautical_miles
from game.ato.closestairfields import ClosestAirfields, ObjectiveDistanceCache
if TYPE_CHECKING:
from game import Game
@@ -209,22 +209,20 @@ class ObjectiveFinder:
raise RuntimeError("Found no friendly control points. You probably lost.")
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."""
threat_zones = self.game.threat_zone_for(not self.is_player)
closest = None
min_distance = meters(math.inf)
for cp in self.friendly_control_points():
if isinstance(cp, OffMapSpawn):
if isinstance(cp, OffMapSpawn) or cp.is_fleet:
continue
distance = threat_zones.distance_to_threat(cp.position)
if distance < min_distance:
closest = cp
min_distance = distance
if closest is None:
raise RuntimeError("Found no friendly control points. You probably lost.")
return closest
def enemy_control_points(self) -> Iterator[ControlPoint]:

View File

@@ -153,6 +153,11 @@ class TheaterState(WorldState["TheaterState"]):
barcap_duration = coalition.doctrine.cap_duration.total_seconds()
barcap_rounds = math.ceil(mission_duration / barcap_duration)
refueling_targets: list[MissionTarget] = []
theater_refuling_point = finder.preferred_theater_refueling_control_point()
if theater_refuling_point is not None:
refueling_targets.append(theater_refuling_point)
return TheaterState(
context=context,
barcaps_needed={
@@ -162,7 +167,7 @@ class TheaterState(WorldState["TheaterState"]):
front_line_stances={f: None for f in finder.front_lines()},
vulnerable_front_lines=list(finder.front_lines()),
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()),
threatening_air_defenses=[],
detecting_air_defenses=[],

View File

@@ -332,6 +332,8 @@ class Game:
from .server import EventStream
from .sim import GameUpdateEvents
persistency.save_last_turn_state(self)
events = GameUpdateEvents()
logging.info("Pass turn")

View File

@@ -24,6 +24,7 @@ from dcs.unitgroup import FlyingGroup
from game.ato import Flight, FlightType
from game.ato.flightplans.aewc import AewcFlightPlan
from game.ato.flightplans.shiprecoverytanker import RecoveryTankerFlightPlan
from game.ato.flightplans.theaterrefueling import TheaterRefuelingFlightPlan
@@ -246,7 +247,10 @@ class AircraftBehavior:
def configure_refueling(self, group: FlyingGroup[Any], flight: Flight) -> None:
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(
f"Cannot configure racetrack refueling tasks for {flight} because it "
"does not have an racetrack refueling flight plan."

View File

@@ -26,6 +26,7 @@ from game.settings import Settings
from game.theater.controlpoint import (
Airfield,
ControlPoint,
Fob,
)
from game.unitmap import UnitMap
from .aircraftpainter import AircraftPainter
@@ -177,6 +178,15 @@ class AircraftGenerator:
self.mission_data,
dynamic_runways,
self.use_client,
self.unit_map,
).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

View File

@@ -10,6 +10,7 @@ from dcs.unit import Skill
from dcs.unitgroup import FlyingGroup
from game.ato import Flight, FlightType
from game.ato.flightplans.shiprecoverytanker import RecoveryTankerFlightPlan
from game.callsigns import callsign_for_support_unit
from game.data.weapons import Pylon, WeaponType as WeaponTypeEnum
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.runways import RunwayData
from game.squadrons import Pilot
from game.unitmap import UnitMap
from .aircraftbehavior import AircraftBehavior
from .aircraftpainter import AircraftPainter
from .flightdata import FlightData
@@ -44,6 +46,7 @@ class FlightGroupConfigurator:
mission_data: MissionData,
dynamic_runways: dict[str, RunwayData],
use_client: bool,
unit_map: UnitMap,
) -> None:
self.flight = flight
self.group = group
@@ -56,6 +59,7 @@ class FlightGroupConfigurator:
self.mission_data = mission_data
self.dynamic_runways = dynamic_runways
self.use_client = use_client
self.unit_map = unit_map
def configure(self) -> FlightData:
AircraftBehavior(self.flight.flight_type).apply_to(self.flight, self.group)
@@ -97,6 +101,7 @@ class FlightGroupConfigurator:
self.time,
self.game.settings,
self.mission_data,
self.unit_map,
).create_waypoints()
return FlightData(
@@ -156,7 +161,9 @@ class FlightGroupConfigurator:
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)
self.mission_data.tankers.append(
TankerInfo(

View File

@@ -230,16 +230,22 @@ class FlightGroupSpawner:
def _generate_at_cp_helipad(self, name: str, cp: ControlPoint) -> FlyingGroup[Any]:
try:
helipad = self.helipads[cp]
except IndexError as ex:
except IndexError:
raise NoParkingSlotError()
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"
hpad = helipad.units[0]
for i in range(self.flight.count):
group.units[i].position = helipad.units[i].position
group.units[i].heading = helipad.units[i].heading
group.units[i].position = hpad.position
group.units[i].heading = hpad.heading
# pydcs has just `parking_id = None`, so mypy thinks str is invalid. Ought
# to fix pydcs, but that's not the kind of change we want to pull into the
# 6.1 branch, and frankly we should probably just improve pydcs's handling
# of FARPs instead.
group.units[i].parking_id = str(i + 1) # type: ignore
return group
def dcs_start_type(self) -> DcsStartType:

View File

@@ -12,6 +12,7 @@ from game.ato import Flight, FlightWaypoint
from game.ato.flightwaypointtype import FlightWaypointType
from game.missiongenerator.missiondata import MissionData
from game.theater import MissionTarget, TheaterUnit
from game.unitmap import UnitMap
TARGET_WAYPOINTS = (
FlightWaypointType.TARGET_GROUP_LOC,
@@ -29,6 +30,7 @@ class PydcsWaypointBuilder:
mission: Mission,
elapsed_mission_time: timedelta,
mission_data: MissionData,
unit_map: UnitMap,
) -> None:
self.waypoint = waypoint
self.group = group
@@ -37,6 +39,7 @@ class PydcsWaypointBuilder:
self.mission = mission
self.elapsed_mission_time = elapsed_mission_time
self.mission_data = mission_data
self.unit_map = unit_map
def build(self) -> MovingPoint:
waypoint = self.group.add_waypoint(

View 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,
)
)

View File

@@ -17,8 +17,12 @@ from game.ato.flightstate import InFlight, WaitingForStart
from game.ato.flightwaypointtype import FlightWaypointType
from game.ato.starttype import StartType
from game.missiongenerator.aircraft.waypoints.cargostop import CargoStopBuilder
from game.missiongenerator.aircraft.waypoints.recoverytanker import (
RecoveryTankerBuilder,
)
from game.missiongenerator.missiondata import MissionData
from game.settings import Settings
from game.unitmap import UnitMap
from game.utils import pairwise
from .baiingress import BaiIngressBuilder
from .landingzone import LandingZoneBuilder
@@ -50,6 +54,7 @@ class WaypointGenerator:
time: datetime,
settings: Settings,
mission_data: MissionData,
unit_map: UnitMap,
) -> None:
self.flight = flight
self.group = group
@@ -58,6 +63,7 @@ class WaypointGenerator:
self.time = time
self.settings = settings
self.mission_data = mission_data
self.unit_map = unit_map
def create_waypoints(self) -> tuple[timedelta, list[FlightWaypoint]]:
for waypoint in self.flight.points:
@@ -135,6 +141,7 @@ class WaypointGenerator:
FlightWaypointType.PICKUP_ZONE: LandingZoneBuilder,
FlightWaypointType.DROPOFF_ZONE: LandingZoneBuilder,
FlightWaypointType.REFUEL: RefuelPointBuilder,
FlightWaypointType.RECOVERY_TANKER: RecoveryTankerBuilder,
FlightWaypointType.CARGO_STOP: CargoStopBuilder,
}
builder = builders.get(waypoint.waypoint_type, DefaultWaypointBuilder)
@@ -145,6 +152,7 @@ class WaypointGenerator:
self.mission,
self.elapsed_mission_time,
self.mission_data,
self.unit_map,
)
def _estimate_min_fuel_for(self, waypoints: list[FlightWaypoint]) -> None:

View File

@@ -104,6 +104,7 @@ class GroundObjectGenerator:
self.add_trigger_zone_for_scenery(unit)
if (
self.game.settings.plugin_option("skynetiads")
and self.game.theater.iads_network.advanced_iads
and isinstance(group, IadsGroundGroup)
and group.iads_role.participate
):
@@ -147,7 +148,7 @@ class GroundObjectGenerator:
vehicle_unit.position = unit.position
vehicle_unit.heading = unit.position.heading.degrees
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:
raise RuntimeError(f"Error creating VehicleGroup for {group_name}")
return vehicle_group
@@ -180,7 +181,7 @@ class GroundObjectGenerator:
ship_unit.position = unit.position
ship_unit.heading = unit.position.heading.degrees
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:
raise RuntimeError(f"Error creating ShipGroup for {group_name}")
return ship_group
@@ -194,7 +195,7 @@ class GroundObjectGenerator:
heading=unit.position.heading.degrees,
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
def enable_eplrs(group: VehicleGroup, unit_type: Type[VehicleType]) -> None:
@@ -209,10 +210,11 @@ class GroundObjectGenerator:
def _register_theater_unit(
self,
dcs_group_id: int,
theater_unit: TheaterUnit,
dcs_unit: Unit,
) -> 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:
# 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)
def generate_iads_command_unit(self, unit: SceneryUnit) -> None:
# Creates a static Infantry Unit next to a scenery object. This is needed
# because skynet can not use map objects as Comms, Power or Command and needs a
# "real" unit to function correctly
# Creates a static Unit (tyre with red flag) next to a scenery object. This is
# needed because skynet can not use map objects as Comms, Power or Command and
# needs a "real" unit to function correctly
self.m.static_group(
country=self.country,
name=unit.unit_name,
_type=dcs.vehicles.Infantry.Soldier_M4,
_type=dcs.statics.Fortification.Black_Tyre_RF,
position=unit.position,
heading=unit.position.heading.degrees,
dead=not unit.alive, # Also spawn as dead!

View File

@@ -159,7 +159,9 @@ class TriggerGenerator:
flag = self.get_capture_zone_flag()
capture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
capture_trigger.add_condition(
AllOfCoalitionOutsideZone(defending_coalition, trigger_zone.id)
AllOfCoalitionOutsideZone(
defending_coalition, trigger_zone.id, unit_type="GROUND"
)
)
capture_trigger.add_condition(
PartOfCoalitionInZone(
@@ -176,7 +178,9 @@ class TriggerGenerator:
recapture_trigger = TriggerCondition(Event.NoEvent, "Capture Trigger")
recapture_trigger.add_condition(
AllOfCoalitionOutsideZone(attacking_coalition, trigger_zone.id)
AllOfCoalitionOutsideZone(
attacking_coalition, trigger_zone.id, unit_type="GROUND"
)
)
recapture_trigger.add_condition(
PartOfCoalitionInZone(

View File

@@ -31,8 +31,8 @@ def save_dir() -> Path:
return Path(base_path()) / "Liberation" / "Saves"
def _temporary_save_file() -> str:
return str(save_dir() / "tmpsave.liberation")
def _temporary_save_file() -> Path:
return save_dir() / "tmpsave.liberation"
def _autosave_path() -> str:
@@ -54,16 +54,18 @@ def load_game(path: str) -> Optional[Game]:
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"):
try:
with open(_temporary_save_file(), "wb") as f:
with temp_save_file.open("wb") as f:
pickle.dump(game, f)
shutil.copy(_temporary_save_file(), game.savepath)
return True
shutil.copy(temp_save_file, destination)
except Exception:
logging.exception("Could not save game")
return False
def autosave(game: Game) -> bool:
@@ -79,3 +81,7 @@ def autosave(game: Game) -> bool:
except Exception:
logging.exception("Could not save game")
return False
def save_last_turn_state(game: Game) -> None:
save_game(game, save_dir() / "last_turn.liberation")

View File

@@ -5,6 +5,7 @@ from datetime import timedelta
from pathlib import Path
from typing import Optional, TYPE_CHECKING
from game import persistency
from game.debriefing import Debriefing
from game.missiongenerator import MissionGenerator
from game.unitmap import UnitMap
@@ -73,6 +74,7 @@ class MissionSimulation:
"was generated."
)
persistency.save_last_turn_state(self.game)
MissionResultsProcessor(self.game).commit(debriefing, events)
def finish(self) -> None:

View File

@@ -33,6 +33,7 @@ from dcs.ships import (
CVN_75,
CV_1143_5,
Forrestal,
Hms_invincible,
KUZNECOW,
LHA_Tarawa,
Stennis,
@@ -877,6 +878,11 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
) -> RunwayData:
...
def stub_runway_data(self) -> RunwayData:
return RunwayData(
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
)
@property
def airdrome_id_for_landing(self) -> Optional[int]:
return None
@@ -1133,6 +1139,14 @@ class Airfield(ControlPoint):
conditions: Conditions,
dynamic_runways: Dict[str, 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)
return assigner.get_preferred_runway(theater, self.airport)
@@ -1176,6 +1190,8 @@ class NavalControlPoint(ControlPoint, ABC):
if self.is_friendly(for_player):
yield from [
FlightType.AEWC,
FlightType.REFUELING,
# TODO: FlightType.INTERCEPTION
# TODO: Buddy tanking for the A-4?
# TODO: Rescue chopper?
@@ -1202,9 +1218,10 @@ class NavalControlPoint(ControlPoint, ABC):
for u in group.units:
if u.alive and u.type in [
Forrestal,
Stennis,
LHA_Tarawa,
Hms_invincible,
KUZNECOW,
LHA_Tarawa,
Stennis,
Type_071,
]:
return True
@@ -1265,13 +1282,10 @@ class Carrier(NavalControlPoint):
return SymbolSet.SEA_SURFACE, SeaSurfaceEntity.CARRIER
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
from game.ato import FlightType
yield from super().mission_types(for_player)
if self.is_friendly(for_player):
yield from [
FlightType.AEWC,
FlightType.REFUELING,
# Nothing yet.
]
def capture(self, game: Game, events: GameUpdateEvents, for_player: bool) -> None:
@@ -1372,9 +1386,7 @@ class OffMapSpawn(ControlPoint):
dynamic_runways: Dict[str, RunwayData],
) -> RunwayData:
logging.warning("TODO: Off map spawns have no runways.")
return RunwayData(
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
)
return self.stub_runway_data()
@property
def runway_status(self) -> RunwayStatus:
@@ -1416,9 +1428,7 @@ class Fob(ControlPoint):
dynamic_runways: Dict[str, RunwayData],
) -> RunwayData:
logging.warning("TODO: FOBs have no runways.")
return RunwayData(
self.full_name, runway_heading=Heading.from_degrees(0), runway_name=""
)
return self.stub_runway_data()
@property
def runway_status(self) -> RunwayStatus:

View File

@@ -34,6 +34,7 @@ class FrontLineUnit:
@dataclass(frozen=True)
class TheaterUnitMapping:
dcs_group_id: int
theater_unit: TheaterUnit
dcs_unit: Unit
@@ -104,14 +105,16 @@ class UnitMap:
return self.front_line_units.get(name, None)
def add_theater_unit_mapping(
self, theater_unit: TheaterUnit, dcs_unit: Unit
self, dcs_group_id: int, theater_unit: TheaterUnit, dcs_unit: Unit
) -> None:
# 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
name = str(dcs_unit.name)
if name in self.theater_objects:
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]:
return self.theater_objects.get(name, None)

View File

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

View File

@@ -238,5 +238,5 @@ class QWaitingForMissionResultWindow(QDialog):
# Stop the current waiting thread as we manually submit the results
self.wait_thread.stop()
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)
)

View File

@@ -4,7 +4,7 @@ asgiref==3.5.2
atomicwrites==1.4.1
attrs==21.4.0
black==22.6.0
certifi==2022.6.15
certifi==2022.12.7
cfgv==3.3.1
click==8.1.3
colorama==0.4.5
@@ -32,7 +32,7 @@ pluggy==1.0.0
pre-commit==2.19.0
py==1.11.0
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-hooks-contrib==2022.8
pyparsing==3.0.9

View File

@@ -1,101 +1,101 @@
---
name: Nevada - Exercise Vegas Nerve
theater: Nevada
authors: Starfire
recommended_player_faction: USA 2005
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>
miz: exercise_vegas_nerve.miz
performance: 1
recommended_start_date: 2011-02-24
version: "10.5"
squadrons:
# Tonopah Airport
17:
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- primary: Refueling
aircraft:
- KC-135 Stratotanker MPRS
- primary: Transport
aircraft:
- C-130
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
# Tonopah Test Range
18:
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: DEAD
secondary: air-to-ground
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
# Groom Lake
2:
- primary: BARCAP
secondary: air-to-air
aircraft:
- J-11A Flanker-L
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-34 Fullback
# Creech
Creech FARP:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum
# Nellis AFB
4:
- primary: SEAD
secondary: any
aircraft:
- FC-1 Fierce Dragon
- primary: Strike
secondary: air-to-ground
aircraft:
- H-6J Badger
# Boulder City Airport
6:
- primary: AEW&C
aircraft:
- KJ-2000
- primary: Refueling
aircraft:
- IL-78M
- primary: Transport
aircraft:
---
name: Nevada - Exercise Vegas Nerve
theater: Nevada
authors: Starfire
recommended_player_faction: USA 2005
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>
miz: exercise_vegas_nerve.miz
performance: 1
recommended_start_date: 2011-02-24
version: "10.5"
squadrons:
# Tonopah Airport
17:
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- primary: Refueling
aircraft:
- KC-135 Stratotanker MPRS
- primary: Transport
aircraft:
- C-130
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
# Tonopah Test Range
18:
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: DEAD
secondary: air-to-ground
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
# Groom Lake
2:
- primary: BARCAP
secondary: air-to-air
aircraft:
- J-11A Flanker-L
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-34 Fullback
# Creech
Creech FARP:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum
# Nellis AFB
4:
- primary: SEAD
secondary: any
aircraft:
- FC-1 Fierce Dragon
- primary: Strike
secondary: air-to-ground
aircraft:
- H-6J Badger
# Boulder City Airport
6:
- primary: AEW&C
aircraft:
- KJ-2000
- primary: Refueling
aircraft:
- IL-78M
- primary: Transport
aircraft:
- IL-76MD

View File

@@ -1,110 +1,110 @@
---
name: Falklands - Operation Grabthar's Hammer
theater: Falklands
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 1990
description:
<p>An Argentinean extremist group has contracted the Sons of Warvan (SoW), an
unusually well-equipped PMC with close ties to the Russian government, to
construct a beryllium bomb at the secret Omega 13 production facility in Ushaia
for use in its ongoing conflict with Chile. United States military forces have
established a foothold at San Julian. While the SoW are distracted up north, it
is up to the Marines to launch an assault upon Ushaia from an LHA in order to
disable the bomb production facility. Fortunately, Ushaia is lightly defended as
the SoW are trying to avoid unwanted attention.</p>
miz: grabthars_hammer.miz
performance: 2
recommended_start_date: 2000-07-13
version: "10.5"
squadrons:
#Mount Pleasant
2:
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BAI
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
- primary: Refueling
aircraft:
- KC-135 Stratotanker
#San Julian
11:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
#El Calafate
14:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
#Rio Gallegros
5:
- primary: BARCAP
secondary: any
aircraft:
- Su-27 Flanker-B
#Punta Arenas
9:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
#Ushuaia
7:
- primary: Transport
aircraft:
- IL-76MD
#Ushuaia Helo Port
8:
- primary: BAI
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
#Blue CV
Blue-CV:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: AEW&C
aircraft:
- E-2C Hawkeye
- primary: Refueling
aircraft:
- S-3B Tanker
# Blue LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
---
name: Falklands - Operation Grabthar's Hammer
theater: Falklands
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 1990
description:
<p>An Argentinean extremist group has contracted the Sons of Warvan (SoW), an
unusually well-equipped PMC with close ties to the Russian government, to
construct a beryllium bomb at the secret Omega 13 production facility in Ushaia
for use in its ongoing conflict with Chile. United States military forces have
established a foothold at San Julian. While the SoW are distracted up north, it
is up to the Marines to launch an assault upon Ushaia from an LHA in order to
disable the bomb production facility. Fortunately, Ushaia is lightly defended as
the SoW are trying to avoid unwanted attention.</p>
miz: grabthars_hammer.miz
performance: 2
recommended_start_date: 2000-07-13
version: "10.5"
squadrons:
#Mount Pleasant
2:
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BAI
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
- primary: Refueling
aircraft:
- KC-135 Stratotanker
#San Julian
11:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
#El Calafate
14:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
#Rio Gallegros
5:
- primary: BARCAP
secondary: any
aircraft:
- Su-27 Flanker-B
#Punta Arenas
9:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
#Ushuaia
7:
- primary: Transport
aircraft:
- IL-76MD
#Ushuaia Helo Port
8:
- primary: BAI
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
#Blue CV
Blue-CV:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: AEW&C
aircraft:
- E-2C Hawkeye
- primary: Refueling
aircraft:
- S-3B Tanker
# Blue LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow

View File

@@ -1,111 +1,111 @@
---
name: Syria - Operation Peace Spring
theater: Syria
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Iraq 1991
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction (and has preset squadrons included), they only have two jets available (F-4 and F-16).</p>
miz: operation_peace_spring.miz
performance: 1
recommended_start_date: 2019-12-23
version: "10.5"
squadrons:
# Ramat David
30:
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- primary: Refueling
aircraft:
- KC-135 Stratotanker MPRS
- primary: Transport
aircraft:
- C-130
# Damascus
7:
- primary: BARCAP
secondary: any
aircraft:
- F-4E Phantom II
- MiG-21bis Fishbed-N
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
- Su-25 Frogfoot
# Tiyas
39:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- Su-24M Fencer-D
# Abu Al Duhur
# 1:
# Gaziantep
11:
- primary: CAS
secondary: air-to-ground
aircraft:
- OH-58D Kiowa Warrior
- Mi-24P Hind-F
# Incirlik
16:
- primary: TARCAP
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- MiG-29A Fulcrum-A
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- H-6J Badger
- primary: AEW&C
aircraft:
- E-3A
- A-50
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- IL-78M
- primary: Transport
aircraft:
- C-130
- IL-76MD
---
name: Syria - Operation Peace Spring
theater: Syria
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Iraq 1991
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction (and has preset squadrons included), they only have two jets available (F-4 and F-16).</p>
miz: operation_peace_spring.miz
performance: 1
recommended_start_date: 2019-12-23
version: "10.5"
squadrons:
# Ramat David
30:
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- primary: Refueling
aircraft:
- KC-135 Stratotanker MPRS
- primary: Transport
aircraft:
- C-130
# Damascus
7:
- primary: BARCAP
secondary: any
aircraft:
- F-4E Phantom II
- MiG-21bis Fishbed-N
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
- Su-25 Frogfoot
# Tiyas
39:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- Su-24M Fencer-D
# Abu Al Duhur
# 1:
# Gaziantep
11:
- primary: CAS
secondary: air-to-ground
aircraft:
- OH-58D Kiowa Warrior
- Mi-24P Hind-F
# Incirlik
16:
- primary: TARCAP
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- MiG-29A Fulcrum-A
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- H-6J Badger
- primary: AEW&C
aircraft:
- E-3A
- A-50
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- IL-78M
- primary: Transport
aircraft:
- C-130
- IL-76MD

View File

@@ -1,104 +1,104 @@
---
name: Caucasus - Operation Vectron's Claw
theater: Caucasus
authors: Starfire
recommended_player_faction: USA 2005
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>
miz: operation_vectrons_claw.miz
performance: 1
recommended_start_date: 2008-08-08
version: "10.5"
squadrons:
Blue CV-1:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: AEW&C
aircraft:
- E-2C Hawkeye
- primary: Refueling
aircraft:
- S-3B Tanker
Blue LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
From Incirlik:
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
#FARPs
UNOMIG Sector HQ:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
Dzhugba:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
#Sukhumi-Babushara
20:
- primary: BARCAP
secondary: any
aircraft:
- MiG-29S Fulcrum-C
#Sochi-Adler
18:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
#Anapa-Vityazevo
12:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
- primary: AEW&C
aircraft:
- A-50
- primary: Refueling
aircraft:
- IL-78M
Red CV:
- primary: BARCAP
secondary: any
aircraft:
- SU-33 Flanker-D
#I am aware there is no Russian LHA. This is just for campaign inversion.
Red LHA:
- primary: BAI
secondary: air-to-ground
---
name: Caucasus - Operation Vectron's Claw
theater: Caucasus
authors: Starfire
recommended_player_faction: USA 2005
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>
miz: operation_vectrons_claw.miz
performance: 1
recommended_start_date: 2008-08-08
version: "10.5"
squadrons:
Blue CV-1:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: AEW&C
aircraft:
- E-2C Hawkeye
- primary: Refueling
aircraft:
- S-3B Tanker
Blue LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
From Incirlik:
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: AEW&C
aircraft:
- E-3A
- primary: Refueling
aircraft:
- KC-135 Stratotanker
#FARPs
UNOMIG Sector HQ:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
Dzhugba:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
#Sukhumi-Babushara
20:
- primary: BARCAP
secondary: any
aircraft:
- MiG-29S Fulcrum-C
#Sochi-Adler
18:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
#Anapa-Vityazevo
12:
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
- primary: AEW&C
aircraft:
- A-50
- primary: Refueling
aircraft:
- IL-78M
Red CV:
- primary: BARCAP
secondary: any
aircraft:
- SU-33 Flanker-D
#I am aware there is no Russian LHA. This is just for campaign inversion.
Red LHA:
- primary: BAI
secondary: air-to-ground

Binary file not shown.

View File

@@ -2,36 +2,36 @@ local unitPayloads = {
["name"] = "F-15E",
["payloads"] = {
[1] = {
["displayName"] = "Liberation CAS",
["name"] = "Liberation CAS",
["displayName"] = "CAS",
["name"] = "CAS",
["pylons"] = {
[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}",
["num"] = 1,
},
[4] = {
[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"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 6,
},
[6] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 7,
},
[7] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 9,
},
[8] = {
["CLSID"] = "{CBU_105}",
@@ -39,47 +39,23 @@ local unitPayloads = {
},
[9] = {
["CLSID"] = "{CBU_105}",
["num"] = 9,
["num"] = 12,
},
[10] = {
["CLSID"] = "{CBU_105}",
["num"] = 8,
},
[11] = {
["CLSID"] = "{CBU_105}",
["num"] = 7,
},
[12] = {
["CLSID"] = "{CBU_105}",
["num"] = 12,
},
[13] = {
["CLSID"] = "{CBU_105}",
["num"] = 13,
},
[14] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 6,
[11] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 18,
},
[15] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 5,
[12] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
},
[16] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 4,
},
[17] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 14,
},
[18] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 15,
},
[19] = {
["CLSID"] = "{Mk82AIR}",
["num"] = 16,
[13] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
},
["tasks"] = {
@@ -90,54 +66,46 @@ local unitPayloads = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["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,
},
[3] = {
["CLSID"] = "{GBU-38}",
["num"] = 4,
},
[4] = {
["CLSID"] = "{GBU-38}",
["num"] = 6,
["num"] = 11,
},
[5] = {
["CLSID"] = "{GBU-38}",
["CLSID"] = "{GBU-31}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{GBU-38}",
["num"] = 9,
["num"] = 13,
},
[7] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
["num"] = 18,
},
[8] = {
["CLSID"] = "{GBU-38}",
["num"] = 11,
["num"] = 12,
},
[9] = {
["CLSID"] = "{GBU-38}",
["num"] = 13,
},
[10] = {
["CLSID"] = "{GBU-38}",
["num"] = 14,
},
[11] = {
["CLSID"] = "{GBU-38}",
["num"] = 16,
},
[12] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
},
[13] = {
[10] = {
["CLSID"] = "{GBU-31}",
["num"] = 9,
},
[11] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
@@ -150,32 +118,44 @@ local unitPayloads = {
["name"] = "CAP",
["pylons"] = {
[1] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["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,
},
[3] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
},
[4] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["num"] = 19,
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
[6] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 18,
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 13,
},
[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}",
["num"] = 2,
["num"] = 18,
},
},
["tasks"] = {
@@ -186,48 +166,44 @@ local unitPayloads = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["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,
},
[3] = {
["CLSID"] = "{GBU-38}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
},
[5] = {
["CLSID"] = "{GBU-38}",
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["num"] = 19,
},
[7] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
[8] = {
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 18,
},
[7] = {
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
["num"] = 13,
},
[8] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
},
[9] = {
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
["num"] = 2,
["CLSID"] = "{51F9AAE5-964F-4D21-83FB-502E3BFE5F8A}",
["num"] = 9,
},
[10] = {
["CLSID"] = "{GBU-38}",
["num"] = 12,
},
[11] = {
["CLSID"] = "{GBU-38}",
["num"] = 8,
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
},
["tasks"] = {
@@ -235,117 +211,169 @@ local unitPayloads = {
},
},
[5] = {
["name"] = "SEAD",
["name"] = "DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["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,
},
[3] = {
["CLSID"] = "{GBU-38}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 6,
},
[5] = {
["CLSID"] = "{GBU-38}",
["num"] = 11,
},
[6] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["num"] = 19,
},
[7] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
[8] = {
["CLSID"] = "{9BCC2A2B-5708-4860-B1F1-053A18442067}",
[6] = {
["CLSID"] = "{GBU-38}",
["num"] = 11,
},
[7] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 18,
},
[9] = {
["CLSID"] = "{9BCC2A2B-5708-4860-B1F1-053A18442067}",
["num"] = 2,
},
[10] = {
[8] = {
["CLSID"] = "{GBU-38}",
["num"] = 12,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
},
[10] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 9,
},
[11] = {
["CLSID"] = "{GBU-38}",
["num"] = 8,
},
[12] = {
["CLSID"] = "{GBU-38}",
["num"] = 13,
},
[13] = {
["CLSID"] = "{GBU-38}",
["num"] = 7,
},
},
["tasks"] = {
[1] = 32,
},
},
[6] = {
["name"] = "Liberation OCA/Runway",
["name"] = "OCA/Runway",
["pylons"] = {
[1] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["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,
},
[3] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 4,
},
[4] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 6,
["CLSID"] = "{GBU-31}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["CLSID"] = "{GBU-31}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 9,
["CLSID"] = "{GBU-31}",
["num"] = 10,
},
[7] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 10,
["num"] = 18,
},
[8] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 11,
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},
[9] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 13,
},
[10] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 14,
},
[11] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 16,
},
[12] = {
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["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] = {
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
["num"] = 18,
},
[14] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 19,
},
[15] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 17,
},

View 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

View File

@@ -24,6 +24,7 @@
"F/A-18C Hornet (Lot 20)",
"JF-17 Thunder",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"Mirage 2000C",
"Mirage-F1B",
"Mirage-F1BE",
@@ -35,6 +36,7 @@
"Mirage-F1M-EE",
"Mi-24P Hind-F",
"Mi-8MTV2 Hip",
"MiG-29S Fulcrum-C",
"SA 342L Gazelle",
"SA 342M Gazelle",
"Su-25T Frogfoot",
@@ -109,5 +111,13 @@
],
"has_jtac": true,
"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"]
}
}

View 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'"
]
}
}

View File

@@ -8,6 +8,7 @@
],
"aircrafts": [
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",

View File

@@ -10,6 +10,7 @@
"J-15 Flanker X-2",
"J-7B",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",

View File

@@ -11,6 +11,7 @@
"J-11A Flanker-L",
"JF-17 Thunder",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"IL-76MD",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"Mi-24V Hind-E",
"Mi-24P Hind-F",
"Mi-8MTV2 Hip",

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"IL-76MD",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"IL-76MD",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",

View File

@@ -48,11 +48,15 @@
"Rapier"
],
"naval_units": [
"FFG Oliver Hazard Perry",
"DDG Arleigh Burke IIa",
"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": [],
"air_defense_units": [

View File

@@ -24,6 +24,7 @@
"F-16CM Fighting Falcon (Block 50)",
"F/A-18C Hornet (Lot 20)",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"MB-339A",
"Mi-24P Hind-F",
"SH-60B Seahawk",

View File

@@ -5,7 +5,7 @@ female_pilot_percentage: 0
country: USA
role: Strike Fighter
aircraft: F-14A Tomcat (Block 135-GR Late)
livery: VF-33 Starfighters 201
livery: VF-33 Starfighters AB201(Dale Snodgrass)
mission_types:
- BAI
- BARCAP

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View 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"

View File

@@ -0,0 +1,4 @@
class: Boat
price: 0
variants:
Castle Class: null

View File

@@ -0,0 +1,4 @@
class: HelicopterCarrier
price: 0
variants:
HMS Invincible (R05): null

View File

@@ -0,0 +1,4 @@
class: Frigate
price: 0
variants:
HMS Achilles (F12): null

View File

@@ -0,0 +1,4 @@
class: Frigate
price: 0
variants:
HMS Andromeda (F57): null

View File

@@ -0,0 +1,4 @@
class: Frigate
price: 0
variants:
HMS Ariadne (F72): null