Compare commits

..

17 Commits

Author SHA1 Message Date
Dan Albert
4da4956df8 Fix waypoint drag and drop.
The fix for https://github.com/dcs-liberation/dcs_liberation/issues/3037
wasn't complete. It seems this `- 1` was here to work around the UI
wrongly having two takeoff points... Now that we fixed that, this also
needs to go.

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

(cherry picked from commit 02c9fe93c5)
2023-06-27 23:50:29 -07:00
Starfire13
618159c1fa Add F-15E Suite 4+ squadrons.
(cherry picked from commit 427df21da5)
2023-06-27 18:49:57 -07:00
Dan Albert
d8c662e7f8 Test SupplyRoute.
(cherry picked from commit f1e9abd157)
2023-06-27 18:49:57 -07:00
Dan Albert
12c41b57c9 Add test for SplitLines.
(cherry picked from commit eeacc79cb6)
2023-06-27 18:49:57 -07:00
Dan Albert
85a27845bc Make loadout/properties tab scrollable.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/3044.

(cherry picked from commit d54d906593)
2023-06-26 23:06:23 -07:00
Dan Albert
e3f6347e16 Fix off-by-one error in livery selector.
(cherry picked from commit cc2dfa5d35)
2023-06-26 22:02:53 -07:00
Dan Albert
fffe1b6e94 Fix UI waypoint numbering.
The flight plan used to not include a waypoint for departure, so a few
places would create one for the sake of the UI, or were built to assume
there was a missing waypoint that was okay to ignore. At some point we
added them to the flight plan, but never updated the UI, so the waypoint
list in the flight dialog started counting from 1 instead of 0, and the
openapi endpoint wrongly reported two departure waypoints to the front-
end.

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

(cherry picked from commit f7b0dfc3a5)
2023-06-26 22:02:53 -07:00
Dan Albert
5a7a730e23 Undo addition of "(AI)" F-15E variant.
This interacts badly with the built-in squadrons:
https://github.com/dcs-liberation/dcs_liberation/issues/3033. Better to
split the display name and "ID" (which is effectively how the key here
is treated), but that's a more invasive change than I'd like to tackle
in this release.

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

(cherry picked from commit 4e90c724bf)
2023-06-26 22:02:53 -07:00
Starfire13
576f777320 Update Starfire's campaigns.
* Added Razbam Strike Eagle options.

(cherry picked from commit fc90b6f2df)
2023-06-26 22:02:53 -07:00
Starfire13
87f7fe5307 Fix F-15E Suite 4+ loadouts for the DCS AI.
DCS AI cannot yet use LGBs.

A2G loadouts for anti-unit have been switched to CBU-97s, which appear
to be the most effective weapon type.
A2G loadouts against static targets (OCA/aircraft, OCA/runway, strike)
have been change to Mk82s and Mk84s.

(cherry picked from commit 266c453c99)
2023-06-26 22:02:53 -07:00
Dan Albert
e1434378a8 Add radio config for the new F-15E.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/3028.

(cherry picked from commit 658a86dff5)
2023-06-26 22:02:53 -07:00
Dan Albert
e03b0d99d8 Razbam F-15E banner and icon.
Just reusing the old one.

https://github.com/dcs-liberation/dcs_liberation/issues/3028
(cherry picked from commit d31644c46a)
2023-06-26 22:02:53 -07:00
Dan Albert
e4eb3dec1b Add Razbam F-15E to factions with the old F-15E.
https://github.com/dcs-liberation/dcs_liberation/issues/3028
(cherry picked from commit f27c9f5a3d)
2023-06-26 22:02:53 -07:00
Dan Albert
b365016496 Add YAML file for Razbam Strike Eagle.
The old DCS AI F-15E is sticking around because the two have very
different weapon sets for now, so it's probably better to use the AI-
only one for squadrons that don't expect players.

I've avoided renaming the old one (we probably should name it "... (AI)"
for clarity) because the rename will break save compat. I have added a
_new_ name that new campaigns can use though.

https://github.com/dcs-liberation/dcs_liberation/issues/3028
(cherry picked from commit f805febd43)
2023-06-26 22:02:53 -07:00
Dan Albert
c359b3f7fc Update pydcs (Strike Eagle).
https://github.com/dcs-liberation/dcs_liberation/issues/3028
(cherry picked from commit dca02fea31)
2023-06-26 22:02:53 -07:00
Starfire13
302613069e Add loadouts for Razbam F-15E Strike Eagle.
(cherry picked from commit f97cd5d28f)
2023-06-26 22:02:53 -07:00
Dan Albert
5a22b62e3b Update version to 8.1.0. 2023-06-26 22:02:53 -07:00
39 changed files with 955 additions and 47 deletions

View File

@@ -1,3 +1,17 @@
# 8.1.0
Saves from 8.0.0 are compatible with 8.1.0
## Features/Improvements
* **[Engine]** Support for DCS 2.8.6.41363, including F-15E support.
* **[UI]** Flight loadout/properties tab is now scrollable.
## Fixes
* **[Campaign]** Fixed liveries for premade squadrons all being off-by-one.
* **[UI]** Fixed numbering of waypoints in the map and flight dialog (first waypoint is now 0 rather than 1).
# 8.0.0
Saves from 7.x are not compatible with 8.0.

View File

@@ -0,0 +1,16 @@
import SplitLines from "./SplitLines";
import { screen } from "@testing-library/dom";
import { render } from "@testing-library/react";
describe("SplitLines", () => {
it("joins items with line break tags", () => {
render(
<div data-testid={"container"}>
<SplitLines items={["foo", "bar", "baz"]} />
</div>
);
const container = screen.getByTestId("container");
expect(container).toContainHTML("foo<br />bar<br />baz<br />");
});
});

View File

@@ -0,0 +1,159 @@
import { renderWithProviders } from "../../testutils";
import SupplyRoute, { RouteColor } from "./SupplyRoute";
import { screen } from "@testing-library/react";
import { PropsWithChildren } from "react";
const mockPolyline = jest.fn();
jest.mock("react-leaflet", () => ({
Polyline: (props: PropsWithChildren<any>) => {
mockPolyline(props);
return <>{props.children}</>;
},
Tooltip: (props: PropsWithChildren<any>) => {
return <p data-testid="tooltip">{props.children}</p>;
},
}));
describe("SupplyRoute", () => {
it("is red when inactive and owned by opfor", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: false,
is_sea: false,
blue: false,
active_transports: [],
}}
/>
);
expect(mockPolyline).toHaveBeenCalledWith(
expect.objectContaining({
color: RouteColor.Red,
})
);
});
it("is blue when inactive and owned by bluefor", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: false,
is_sea: false,
blue: true,
active_transports: [],
}}
/>
);
expect(mockPolyline).toHaveBeenCalledWith(
expect.objectContaining({
color: RouteColor.Blue,
})
);
});
it("is orange when contested", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: true,
is_sea: false,
blue: false,
active_transports: [],
}}
/>
);
expect(mockPolyline).toHaveBeenCalledWith(
expect.objectContaining({
color: RouteColor.Contested,
})
);
});
it("is highlighted when the route has active transports", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: false,
is_sea: false,
blue: false,
active_transports: ["foo"],
}}
/>
);
expect(mockPolyline).toHaveBeenCalledTimes(2);
expect(mockPolyline).toHaveBeenCalledWith(
expect.objectContaining({
color: RouteColor.Highlight,
})
);
});
it("is drawn in the right place", () => {
const points = [
{ lat: 0, lng: 0 },
{ lat: 1, lng: 1 },
];
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: points,
front_active: false,
is_sea: false,
blue: false,
active_transports: ["foo"],
}}
/>
);
expect(mockPolyline).toHaveBeenCalledTimes(2);
expect(mockPolyline).toHaveBeenCalledWith(
expect.objectContaining({
positions: points,
})
);
});
it("has a tooltip describing an inactive supply route", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: false,
is_sea: false,
blue: false,
active_transports: [],
}}
/>
);
const tooltip = screen.getByTestId("tooltip");
expect(tooltip).toHaveTextContent("This supply route is inactive.");
});
it("has a tooltip describing active supply routes", () => {
renderWithProviders(
<SupplyRoute
route={{
id: "",
points: [],
front_active: false,
is_sea: false,
blue: false,
active_transports: ["foo", "bar"],
}}
/>
);
const tooltip = screen.getByTestId("tooltip");
expect(tooltip).toContainHTML("foo<br />bar");
});
});

View File

@@ -4,6 +4,13 @@ import { Polyline as LPolyline } from "leaflet";
import { useEffect, useRef } from "react";
import { Polyline, Tooltip } from "react-leaflet";
export enum RouteColor {
Blue = "#2d3e50",
Contested = "#c85050",
Highlight = "#ffffff",
Red = "#8c1414",
}
interface SupplyRouteProps {
route: SupplyRouteModel;
}
@@ -26,18 +33,22 @@ function ActiveSupplyRouteHighlight(props: SupplyRouteProps) {
}
return (
<Polyline positions={props.route.points} color={"#ffffff"} weight={2} />
<Polyline
positions={props.route.points}
color={RouteColor.Highlight}
weight={2}
/>
);
}
function colorFor(route: SupplyRouteModel) {
if (route.front_active) {
return "#c85050";
return RouteColor.Contested;
}
if (route.blue) {
return "#2d3e50";
return RouteColor.Blue;
}
return "#8c1414";
return RouteColor.Red;
}
export default function SupplyRoute(props: SupplyRouteProps) {

View File

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

View File

@@ -6,30 +6,16 @@ from starlette.responses import Response
from game import Game
from game.ato import Flight
from game.ato.flightwaypoint import FlightWaypoint
from game.ato.flightwaypointtype import FlightWaypointType
from game.server import GameContext
from game.server.leaflet import LeafletPoint
from game.server.waypoints.models import FlightWaypointJs
from game.sim import GameUpdateEvents
from game.utils import meters
router: APIRouter = APIRouter(prefix="/waypoints")
def waypoints_for_flight(flight: Flight) -> list[FlightWaypointJs]:
departure = FlightWaypointJs.for_waypoint(
FlightWaypoint(
"TAKEOFF",
FlightWaypointType.TAKEOFF,
flight.departure.position,
meters(0),
"RADIO",
),
flight,
0,
)
return [departure] + [
return [
FlightWaypointJs.for_waypoint(w, flight, i)
for i, w in enumerate(flight.flight_plan.waypoints, 1)
]
@@ -64,7 +50,7 @@ def set_position(
if waypoint_idx == 0:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
waypoint = flight.flight_plan.waypoints[waypoint_idx - 1]
waypoint = flight.flight_plan.waypoints[waypoint_idx]
waypoint.position = Point.from_latlng(
LatLng(position.lat, position.lng), game.theater.terrain
)

View File

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

View File

@@ -202,6 +202,7 @@ def load_aircraft_icons():
AIRCRAFT_ICONS[f1] = AIRCRAFT_ICONS["Mirage-F1C-200"]
AIRCRAFT_ICONS["Mirage-F1M-CE"] = AIRCRAFT_ICONS["Mirage-F1CE"]
AIRCRAFT_ICONS["MB-339A"] = AIRCRAFT_ICONS["MB-339A PAN"]
AIRCRAFT_ICONS["F-15ESE"] = AIRCRAFT_ICONS["F-15E"]
def load_vehicle_icons():

View File

@@ -24,7 +24,8 @@ class LiverySelector(QComboBox):
for idx, livery in enumerate(
squadron.aircraft.dcs_unit_type.iter_liveries_for_country(
dcs.countries.get_by_name(squadron.country)
)
),
1, # First entry is "Default".
):
self.addItem(livery.name, livery)
if squadron.livery == livery.id:

View File

@@ -26,6 +26,8 @@ def aircraft_banner_for(unit_type: AircraftType) -> Path:
name = "Mirage-F1C-200"
elif unit_type.dcs_id in {"Mirage-F1CE", "Mirage-F1M-CE"}:
name = "Mirage-F1C"
elif unit_type.dcs_id == "F-15ESE":
name = "F-15E"
else:
name = unit_type.dcs_id
return AIRCRAFT_BANNERS_BASE / f"{name}.jpg"

View File

@@ -4,6 +4,8 @@ from PySide6.QtWidgets import (
QFrame,
QLabel,
QVBoxLayout,
QScrollArea,
QWidget,
)
from game import Game
@@ -35,6 +37,16 @@ class QFlightPayloadTab(QFrame):
layout = QVBoxLayout()
scroll_content = QWidget()
scrolling_layout = QVBoxLayout()
scroll_content.setLayout(scrolling_layout)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
scroll.setWidget(scroll_content)
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
layout.addWidget(scroll)
# Docs Link
docsText = QLabel(
'<a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Custom-Loadouts"><span style="color:#FFFFFF;">How to create your own default loadout</span></a>'
@@ -42,12 +54,12 @@ class QFlightPayloadTab(QFrame):
docsText.setAlignment(Qt.AlignCenter)
docsText.setOpenExternalLinks(True)
layout.addLayout(PropertyEditor(self.flight))
scrolling_layout.addLayout(PropertyEditor(self.flight))
self.loadout_selector = DcsLoadoutSelector(flight)
self.loadout_selector.currentIndexChanged.connect(self.on_new_loadout)
layout.addWidget(self.loadout_selector)
layout.addWidget(self.payload_editor)
layout.addWidget(docsText)
scrolling_layout.addWidget(self.loadout_selector)
scrolling_layout.addWidget(self.payload_editor)
scrolling_layout.addWidget(docsText)
self.setLayout(layout)

View File

@@ -64,7 +64,23 @@ class QFlightWaypointList(QTableView):
self.model.setHorizontalHeaderLabels(HEADER_LABELS)
waypoints = self.flight.flight_plan.waypoints
for row, waypoint in enumerate(waypoints):
# Why [1:]? Qt starts indexing at 1 rather than 0, whereas DCS numbers
# waypoints starting with 0, and for whatever reason Qt crashes whenever I
# set the vertical labels manually.
#
# Starting with the second waypoint is a bit of a hack, but it's also the
# historical behavior anyway. This view used to have waypoints starting at 1
# and just didn't show the departure waypoint because the departure waypoint
# wasn't actually part of the flight plan tracked by Liberation. That
# changed at some point, so now we need to skip it manually to preserve that
# behavior.
#
# It really ought to show the departure waypoint and start indexing at 0,
# but since this all pending a move to React anyway, it's not worth fighting
# the Qt crashes for now.
#
# https://github.com/dcs-liberation/dcs_liberation/issues/3037
for row, waypoint in enumerate(waypoints[1:]):
self._add_waypoint_row(row, self.flight, waypoint)
self.selectionModel().setCurrentIndex(
self.model.index(current_index, 0), QItemSelectionModel.Select

View File

@@ -32,7 +32,7 @@ platformdirs==2.6.2
pluggy==1.0.0
pre-commit==2.21.0
pydantic==1.10.7
git+https://github.com/pydcs/dcs@60f5121d89f23a062a0494803f8105361cdf36e8#egg=pydcs
git+https://github.com/pydcs/dcs@e006f0df6db933fa34b2d5cb04db41653537503e#egg=pydcs
pyinstaller==5.12.0
pyinstaller-hooks-contrib==2022.14
pyproj==3.4.1

View File

@@ -16,11 +16,11 @@ squadrons:
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 20
size: 24
- primary: TARCAP
secondary: any
aircraft:
- F-15C Eagle
- F-15E Strike Eagle (Suite 4+)
size: 20
- primary: Strike
secondary: air-to-ground
@@ -41,7 +41,7 @@ squadrons:
secondary: any
aircraft:
- Mirage 2000C
size: 16
size: 12
# Kedem
12:
- primary: Transport

View File

@@ -12,10 +12,10 @@ version: "10.9"
squadrons:
# Tonopah Airport
17:
- primary: BARCAP
secondary: air-to-air
- primary: TARCAP
secondary: any
aircraft:
- F-15C Eagle
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: Strike
secondary: air-to-ground

View File

@@ -42,9 +42,9 @@ squadrons:
#San Julian
11:
- primary: BAI
secondary: air-to-ground
secondary: any
aircraft:
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
size: 8
- primary: Air Assault
secondary: any

View File

@@ -43,10 +43,10 @@ squadrons:
aircraft:
- AV-8B Harrier II Night Attack
size: 8
- primary: BARCAP
secondary: air-to-air
- primary: TARCAP
secondary: any
aircraft:
- F-15C Eagle
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: CAS
secondary: air-to-ground

View File

@@ -66,6 +66,11 @@ squadrons:
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 16
- primary: BAI
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: BAI
secondary: air-to-ground
aircraft:

View File

@@ -0,0 +1,560 @@
local unitPayloads = {
["name"] = "F-15ESE",
["payloads"] = {
[1] = {
["displayName"] = "Liberation Strike",
["name"] = "Liberation Strike",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{CFT_R_MK84LD_x_2}",
["num"] = 12,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 8,
["settings"] = {
["GUI_fuze_type"] = 1,
["arm_delay_ctrl_FMU139CB_LD"] = 1,
["function_delay_ctrl_FMU139CB_LD"] = 0,
},
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{CFT_L_MK84LD_x_2}",
["num"] = 4,
},
[10] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[11] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 32,
},
},
[2] = {
["name"] = "Liberation BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[3] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[4] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[5] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{CFT_L_CBU_97_x_6}",
["num"] = 4,
},
[7] = {
["CLSID"] = "{CFT_R_CBU_97_x_6}",
["num"] = 12,
},
[8] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
},
["tasks"] = {
[1] = 32,
},
},
[3] = {
["name"] = "Liberation BARCAP",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 10,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 5,
},
[11] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[12] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
[13] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[4] = {
["displayName"] = "Liberation Escort",
["name"] = "Liberation Escort",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 10,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 5,
},
[11] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[12] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
[13] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[5] = {
["displayName"] = "Liberation OCA/Runway",
["name"] = "Liberation OCA/Runway",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{CFT_R_MK84LD_x_2}",
["num"] = 12,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 8,
["settings"] = {
["GUI_fuze_type"] = 1,
["arm_delay_ctrl_FMU139CB_LD"] = 1,
["function_delay_ctrl_FMU139CB_LD"] = 0,
},
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{CFT_L_MK84LD_x_2}",
["num"] = 4,
},
[10] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[11] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 32,
},
},
[6] = {
["displayName"] = "Liberation OCA/Aircraft",
["name"] = "Liberation OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{CFT_R_MK82LD_x_6}",
["num"] = 12,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 8,
["settings"] = {
["GUI_fuze_type"] = 1,
["arm_delay_ctrl_FMU139CB_LD"] = 1,
["function_delay_ctrl_FMU139CB_LD"] = 0,
},
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{CFT_L_MK82LD_x_6}",
["num"] = 4,
},
[10] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[11] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 32,
},
},
[7] = {
["displayName"] = "Liberation Fighter Sweep",
["name"] = "Liberation Fighter Sweep",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 10,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 5,
},
[11] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[12] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
[13] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[8] = {
["displayName"] = "Liberation DEAD",
["name"] = "Liberation DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[6] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[7] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[8] = {
["CLSID"] = "{CFT_L_CBU_97_x_6}",
["num"] = 4,
},
[9] = {
["CLSID"] = "{CFT_R_CBU_97_x_6}",
["num"] = 12,
},
},
["tasks"] = {
[1] = 32,
},
},
[9] = {
["displayName"] = "Liberation TARCAP",
["name"] = "Liberation TARCAP",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 14,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 11,
},
[5] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 10,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 6,
},
[10] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 5,
},
[11] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[12] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 2,
},
[13] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[10] = {
["displayName"] = "Liberation CAS",
["name"] = "Liberation CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 15,
},
[2] = {
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 13,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{CFT_R_CBU_97_x_6}",
["num"] = 12,
},
[6] = {
["CLSID"] = "{F-15E_AAQ-13_LANTIRN}",
["num"] = 9,
},
[7] = {
["CLSID"] = "{F15E_EXTTANK}",
["num"] = 8,
},
[8] = {
["CLSID"] = "{F-15E_AAQ-14_LANTIRN}",
["num"] = 7,
},
[9] = {
["CLSID"] = "{CFT_L_CBU_97_x_6}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 32,
},
},
},
["tasks"] = {
},
["unitType"] = "F-15ESE",
}
return unitPayloads

View File

@@ -3,8 +3,8 @@ country: Combined Joint Task Forces Blue
name: NATO Desert Storm
authors: Hawkmoon
description:
<p>A faction to recreate the actual unit lineup during Desert Storm as
closely as possible</p>
<p>A faction to recreate the actual unit lineup during Desert Storm as closely
as possible</p>
aircrafts:
- A-10A Thunderbolt II
- AH-64A Apache
@@ -18,6 +18,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F-4E Phantom II
- F/A-18C Hornet (Lot 20)

View File

@@ -3,8 +3,8 @@ country: Combined Joint Task Forces Blue
name: NATO OIF
authors: Fuzzle
description:
<p>A more modern NATO mixed faction reflecting the units involved in
Operation Iraqi Freedom.</p>
<p>A more modern NATO mixed faction reflecting the units involved in Operation
Iraqi Freedom.</p>
aircrafts:
- A-10C Thunderbolt II (Suite 3)
- AH-64D Apache Longbow
@@ -19,6 +19,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F-22A Raptor
- F/A-18C Hornet (Lot 20)

View File

@@ -24,6 +24,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F-22A Raptor
- F-5E Tiger II

View File

@@ -13,6 +13,7 @@ aircrafts:
- C-130J-30 Super Hercules
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F-4E Phantom II
- UH-1H Iroquois

View File

@@ -13,6 +13,7 @@ aircrafts:
- C-130J-30 Super Hercules
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F/A-18C Hornet (Lot 20)
- Mirage 2000C

View File

@@ -20,6 +20,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F/A-18C Hornet (Lot 20)
- Ka-50 Hokum

View File

@@ -20,6 +20,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F/A-18C Hornet (Lot 20)
- S-3B Viking

View File

@@ -22,6 +22,7 @@ aircrafts:
- F-14B Tomcat
- F-15C Eagle
- F-15E Strike Eagle
- F-15E Strike Eagle (Suite 4+)
- F-16CM Fighting Falcon (Block 50)
- F-22A Raptor
- F/A-18C Hornet (Lot 20)

View File

@@ -0,0 +1,8 @@
---
name: 17th Weapons Squadron
nickname: Hooters
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 17th WS AF90 Low Vis Clean

View File

@@ -0,0 +1,8 @@
---
name: 333rd Fighter Squadron
nickname: Lancers
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 333rd Rocketeers FS AF87-199 333 FGS

View File

@@ -0,0 +1,8 @@
---
name: 334th Fighter Squadron
nickname: Eagles
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 334th Eagles FS AF89 Aim High

View File

@@ -0,0 +1,8 @@
---
name: 335th Fighter Squadron
nickname: Chiefs
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 335th Chiefs FS AF89 Low Vis Combat

View File

@@ -0,0 +1,8 @@
---
name: 336th Fighter Squadron
nickname: Rocketeers
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 336th Rocketeers FS AF88 Low Vis Combat

View File

@@ -0,0 +1,8 @@
---
name: 389th Fighter Squadron
nickname: Thunderbolts
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 389th Thunderbolts FS AF90 Low Vis Combat

View File

@@ -0,0 +1,8 @@
---
name: 391st Fighter Squadron
nickname: Bold Tigers
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 391st Bold Tigers FS AF90-241 High Vis Combat

View File

@@ -0,0 +1,8 @@
---
name: 492th Fighter Squadron
nickname: Madhatters
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 492nd Madhatters FS AF91-315 Vader

View File

@@ -0,0 +1,8 @@
---
name: 494th Fighter Squadron
nickname: Panthers
female_pilot_percentage: 7
country: USA
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: USAF 494th Panthers FS 91-603 75th D-Day Anniversary

View File

@@ -0,0 +1,8 @@
---
name: 69th Squadron
nickname: Hammers
female_pilot_percentage: 7
country: Israel
role: Strike Fighter
aircraft: F-15E Strike Eagle (Suite 4+)
livery: IDF RA'AM, 69 Hammer Sqn

View File

@@ -1,7 +1,8 @@
description:
The F-15 has often been labeled as the greatest U.S. fighter aircraft
from the 1970s until the early 21st century. The F-15E is a multirole fighter and
exceeds in CAS operations. It served worldwide without suffering any confirmed losses.
The F-15 has often been labeled as the greatest U.S. fighter aircraft from the
1970s until the early 21st century. The F-15E is a multirole fighter and
exceeds in CAS operations. It served worldwide without suffering any confirmed
losses.
introduced: 1988
manufacturer: McDonnell Douglas
origin: USA

View File

@@ -0,0 +1,36 @@
description:
The F-15 has often been labeled as the greatest U.S. fighter aircraft from the
1970s until the early 21st century. The F-15E is a multirole fighter and
exceeds in CAS operations. It served worldwide without suffering any confirmed
losses.
introduced: 1988
manufacturer: McDonnell Douglas
origin: USA
price: 24
role: Multirole Strike Fighter
max_range: 300
variants:
F-15E Strike Eagle (Suite 4+): {}
radios:
intra_flight: AN/ARC-210
inter_flight: AN/ARC-164
channels:
type: common
# Radio 1 is the UHF AN/ARC-164, and Radio 2 is the V/UHF AN/ARC-210. We
# only ever allocate UHF for inter-flight, so we'd prefer to use radio 2 for
# intra-flight, but as is often the case the flight's frequency will be
# assigned to radio 1 channel 1 no matter what we do.
intra_flight_radio_index: 1
inter_flight_radio_index: 2
tasks:
BAI: 760
BARCAP: 240
CAS: 760
DEAD: 260
Escort: 240
Fighter sweep: 240
Intercept: 240
OCA/Aircraft: 760
OCA/Runway: 630
Strike: 640
TARCAP: 240