Merge branch 'pretense-generator' of https://github.com/MetalStormGhost/dcs-retribution into pretense-generator

This commit is contained in:
MetalStormGhost 2024-04-06 13:58:06 +03:00
commit 55b173ec10
92 changed files with 5759 additions and 4050 deletions

View File

@ -1,6 +1,8 @@
# Retribution v1.3.0
#### Note: Re-save your missions in DCS' Mission Editor to avoid possible crashes due to datalink (usually the case when F-16C blk50s are used) when hosting missions on a dedicated server.
## Features/Improvements
* **[Engine]** Support for DCS v2.9.3.51704
* **[Package Planning]** Option to "Auto-Create" package
* **[Modding]** Custom weapons injection system (definition in aircraft's yaml file)
* **[Payload Editor]** Ability to save/back-up payloads
@ -30,12 +32,15 @@
* **[COMMs]** Aircraft-specific callsigns will now also be used.
* **[COMMs]** Ability to set a specific callsign to a flight.
* **[Mission Generator]** Channel terrain fix on exclusion zones, sea zones and inclusion zones
* **[Options]** Cheat-option for accessing Air Wing Config Dialog after campaign start
* **[Options]** Cheat-option for accessing Air Wing Config Dialog after campaign start (re-initializes turn if applied, thus plan your mission ___after___ making changes)
* **[Options]** Option to enable unlimited fuel for AI (player and non-player flights)
* **[Mission Generator]** F-15E Strike targets are automatically added as Mission Set 1
* **[Mission Generator]** Set F-14's IP waypoint according to the flight-plan's ingress point
* **[Mission Generator]** Automatically de-spawn aircraft when arrival/divert is an off-map spawn
* **[Options]** Option to de-spawn AI flights in the air if their start-type was manually set to In-Flight
* **[Config]** Preference setting to use custom Liberation payloads instead of prioritizing Retribution's default
* **[Config]** Preference setting to configure the server-port on which Retribution's back-end will run
* **[Options]** Made AI jettisoning empty fuel tanks optional (disabled by default)
## Fixes
* **[Mission Generation]** Anti-ship strikes should use "group attack" in their attack-task
@ -49,6 +54,8 @@
* **[Capture Logic]** Release all parking slots when an airbase is captured
* **[Modding]** Swedish Military Assets Pack air defence presets are now correctly removed from the faction when the mod is disabled.
* **[Mission Generation]** Naval aircraft not always returning to carrier
* **[Mission Generation]** AI AirLift aircraft crashing into terrain due to insufficient waypoints
* **[Mission Generation]** Fix friendly AI shooting at fires on the front-line
# Retribution v1.2.1 (hotfix)

View File

@ -1,5 +1,6 @@
from __future__ import annotations
import random
from dataclasses import dataclass
from datetime import datetime
from typing import Iterator, TYPE_CHECKING, Type
@ -38,6 +39,7 @@ class AirAssaultLayout(FormationAttackLayout):
if self.pickup is not None:
yield self.pickup
yield from self.nav_to
yield self.join
yield self.ingress
if self.drop_off is not None:
yield self.drop_off
@ -131,19 +133,34 @@ class Builder(FormationAttackBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
self._generate_ctld_pickup(),
)
)
pickup.alt = heli_alt
pickup_position = pickup.position
ingress = builder.ingress(
FlightWaypointType.INGRESS_AIR_ASSAULT,
self.package.waypoints.ingress,
self.package.target,
)
assault_area = builder.assault_area(self.package.target)
heading = self.package.target.position.heading_between_point(pickup_position)
if self.flight.is_hercules:
assault_area.only_for_player = False
assault_area.alt = feet(1000)
# TODO: define CTLD dropoff zones in campaign miz?
drop_off_zone = MissionTarget(
"Dropoff zone",
self.package.target.position.point_from_heading(heading, 1200),
)
tgt = self.package.target
if isinstance(tgt, CTLD) and tgt.ctld_zones:
top3 = sorted(
tgt.ctld_zones, key=lambda x: ingress.position.distance_to_point(x[0])
)[:3]
pos, dist = random.choice(top3)
drop_pos = pos.random_point_within(dist)
else:
heading = tgt.position.heading_between_point(ingress.position)
drop_pos = tgt.position.point_from_heading(heading, 1200)
drop_off_zone = MissionTarget("Dropoff zone", drop_pos)
dz = builder.dropoff_zone(drop_off_zone) if self.flight.is_helo else None
if dz:
dz.alt = heli_alt
return AirAssaultLayout(
departure=builder.takeoff(self.flight.departure),
@ -154,11 +171,7 @@ class Builder(FormationAttackBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
altitude,
altitude_is_agl,
),
ingress=builder.ingress(
FlightWaypointType.INGRESS_AIR_ASSAULT,
self.package.waypoints.ingress,
self.package.target,
),
ingress=ingress,
drop_off=dz,
targets=[assault_area],
nav_from=builder.nav_path(
@ -171,8 +184,8 @@ class Builder(FormationAttackBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
divert=builder.divert(self.flight.divert),
bullseye=builder.bullseye(),
hold=None,
join=builder.join(pickup_position),
split=builder.split(self.package.waypoints.split),
join=builder.join(ingress.position),
split=builder.split(self.flight.arrival.position),
refuel=None,
)

View File

@ -1,5 +1,6 @@
from __future__ import annotations
import random
from collections.abc import Iterator
from dataclasses import dataclass
from datetime import datetime
@ -7,7 +8,7 @@ from typing import Optional
from typing import TYPE_CHECKING, Type
from game.theater.missiontarget import MissionTarget
from game.utils import feet
from game.utils import feet, Distance
from ._common_ctld import generate_random_ctld_point
from .ibuilder import IBuilder
from .planningerror import PlanningError
@ -23,13 +24,17 @@ if TYPE_CHECKING:
@dataclass
class AirliftLayout(StandardLayout):
pickup_ascent: FlightWaypoint | None
pickup_descent: FlightWaypoint | None
# There will not be a pickup waypoint when the pickup airfield is the departure
# airfield for cargo planes, as the cargo is pre-loaded. Helicopters will still pick
# up the cargo near the airfield.
pickup: FlightWaypoint | None
# pickup_zone will be used for player flights to create the CTLD stuff
ctld_pickup_zone: FlightWaypoint | None
drop_off_ascent: FlightWaypoint | None
nav_to_drop_off: list[FlightWaypoint]
drop_off_descent: FlightWaypoint | None
# There will not be a drop-off waypoint when the drop-off airfield and the arrival
# airfield is the same for a cargo plane, as planes will land to unload and we don't
# want a double landing. Helicopters will still drop their cargo near the airfield
@ -37,6 +42,8 @@ class AirliftLayout(StandardLayout):
drop_off: FlightWaypoint | None
# drop_off_zone will be used for player flights to create the CTLD stuff
ctld_drop_off_zone: FlightWaypoint | None
return_ascent: FlightWaypoint
return_descent: FlightWaypoint
def add_waypoint(
self, wpt: FlightWaypoint, next_wpt: Optional[FlightWaypoint]
@ -60,17 +67,27 @@ class AirliftLayout(StandardLayout):
def iter_waypoints(self) -> Iterator[FlightWaypoint]:
yield self.departure
if self.pickup_ascent is not None:
yield self.pickup_ascent
yield from self.nav_to
if self.pickup_descent is not None:
yield self.pickup_descent
if self.pickup is not None:
yield self.pickup
if self.ctld_pickup_zone is not None:
yield self.ctld_pickup_zone
if self.drop_off_ascent is not None:
yield self.drop_off_ascent
yield from self.nav_to_drop_off
if self.drop_off_descent is not None:
yield self.drop_off_descent
if self.drop_off is not None:
yield self.drop_off
yield self.return_ascent
if self.ctld_drop_off_zone is not None:
yield self.ctld_drop_off_zone
yield from self.nav_from
yield self.return_descent
yield self.arrival
if self.divert is not None:
yield self.divert
@ -121,15 +138,47 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]):
builder = WaypointBuilder(self.flight)
pickup_ascent = None
pickup_descent = None
pickup = None
drop_off_ascent = None
drop_off_descent = None
drop_off = None
pickup_zone = None
drop_off_zone = None
if cargo.origin != self.flight.departure:
pickup = builder.cargo_stop(cargo.origin)
pickup_ascent = self._create_ascent_or_descent(
builder,
self.flight.departure.position,
cargo.origin.position,
altitude,
altitude_is_agl,
)
pickup_descent = self._create_ascent_or_descent(
builder,
cargo.origin.position,
self.flight.departure.position,
altitude,
altitude_is_agl,
)
if cargo.next_stop != self.flight.arrival:
drop_off = builder.cargo_stop(cargo.next_stop)
drop_off_ascent = self._create_ascent_or_descent(
builder,
cargo.origin.position,
cargo.next_stop.position,
altitude,
altitude_is_agl,
)
drop_off_descent = self._create_ascent_or_descent(
builder,
cargo.next_stop.position,
cargo.origin.position,
altitude,
altitude_is_agl,
)
if self.flight.is_helo:
# Create CTLD Zones for Helo flights
@ -150,25 +199,50 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]):
altitude_is_agl,
)
return_ascent = self._create_ascent_or_descent(
builder,
cargo.next_stop.position
if cargo.next_stop != self.flight.arrival
else cargo.origin.position,
self.flight.arrival.position,
altitude,
altitude_is_agl,
)
return_descent = self._create_ascent_or_descent(
builder,
self.flight.arrival.position,
cargo.next_stop.position
if cargo.next_stop != self.flight.arrival
else cargo.origin.position,
altitude,
altitude_is_agl,
)
return AirliftLayout(
departure=builder.takeoff(self.flight.departure),
pickup_ascent=pickup_ascent,
nav_to=nav_to_pickup,
pickup_descent=pickup_descent,
pickup=pickup,
ctld_pickup_zone=pickup_zone,
drop_off_ascent=drop_off_ascent,
nav_to_drop_off=builder.nav_path(
cargo.origin.position,
cargo.next_stop.position,
altitude,
altitude_is_agl,
),
drop_off_descent=drop_off_descent,
drop_off=drop_off,
ctld_drop_off_zone=drop_off_zone,
return_ascent=return_ascent,
nav_from=builder.nav_path(
cargo.origin.position,
self.flight.arrival.position,
altitude,
altitude_is_agl,
),
return_descent=return_descent,
arrival=builder.land(self.flight.arrival),
divert=builder.divert(self.flight.divert),
bullseye=builder.bullseye(),
@ -188,3 +262,18 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]):
if cargo and cargo.transport and isinstance(cargo.transport.destination, CTLD):
return generate_random_ctld_point(cargo.transport.destination)
raise RuntimeError("Could not generate CTLD dropoff")
@staticmethod
def _create_ascent_or_descent(
builder: WaypointBuilder,
start: Point,
end: Point,
alt: Distance,
agl: bool,
) -> FlightWaypoint:
distance = start.distance_to_point(end)
rdistance = 1000 if agl else min(distance / 10, 20000)
heading = round(start.heading_between_point(end))
rheading = random.randint(heading - 30, heading + 30) % 360
pos = start.point_from_heading(float(rheading), rdistance)
return builder.nav(pos, alt, agl)

View File

@ -1,6 +1,5 @@
from __future__ import annotations
from datetime import timedelta, datetime
from typing import Type
from .airassault import AirAssaultLayout
@ -16,18 +15,6 @@ from ...utils import feet
class EscortFlightPlan(FormationAttackFlightPlan):
@property
def push_time(self) -> datetime:
hold2join_time = (
self.travel_time_between_waypoints(
self.layout.hold,
self.layout.join,
)
if self.layout.hold is not None
else timedelta(0)
)
return self.join_time - hold2join_time
@staticmethod
def builder_type() -> Type[Builder]:
return Builder
@ -44,16 +31,17 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
ingress.only_for_player = True
target.only_for_player = True
hold = None
if not self.primary_flight_is_air_assault:
if not self.flight.is_helo:
hold = builder.hold(self._hold_point())
elif self.package.primary_flight is not None:
fp = self.package.primary_flight.flight_plan
assert isinstance(fp.layout, AirAssaultLayout)
if fp.layout.pickup:
hold = builder.hold(fp.layout.pickup.position)
join = builder.join(self.package.waypoints.join)
split = builder.split(self.package.waypoints.split)
join_pos = (
self.package.waypoints.ingress
if self.flight.is_helo
else self.package.waypoints.join
)
join = builder.join(join_pos)
split = builder.split(self._get_split())
ingress_alt = self.doctrine.ingress_altitude
is_helo = builder.flight.is_helo
@ -70,10 +58,12 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
layout, AirliftLayout
)
if isinstance(layout, AirliftLayout):
join = builder.join(layout.departure.position)
else:
join = builder.join(layout.ingress.position)
if layout.pickup:
ascent = layout.pickup_ascent or layout.drop_off_ascent
assert ascent is not None
join = builder.join(ascent.position)
if layout.pickup and layout.drop_off_ascent:
join = builder.join(layout.drop_off_ascent.position)
elif layout.pickup:
join = builder.join(layout.pickup.position)
split = builder.split(layout.arrival.position)
if layout.drop_off:

View File

@ -71,15 +71,6 @@ class FlightPlan(ABC, Generic[LayoutT]):
"""A list of all waypoints in the flight plan, in order."""
return list(self.iter_waypoints())
def get_index_of_wpt_by_type(self, wpt_type: FlightWaypointType) -> int:
index = 0
for wpt in self.waypoints:
if wpt and not wpt.only_for_player:
index += 1
if wpt.waypoint_type == wpt_type:
return index
return -1
def iter_waypoints(self) -> Iterator[FlightWaypoint]:
"""Iterates over all waypoints in the flight plan, in order."""
yield from self.layout.iter_waypoints()
@ -113,6 +104,19 @@ class FlightPlan(ABC, Generic[LayoutT]):
#
# Plus, it's a loiter point so there's no reason to hurry.
factor = 0.75
elif (
self.flight.is_helo
and (
a.waypoint_type == FlightWaypointType.JOIN
or "INGRESS" in a.waypoint_type.name
or a.waypoint_type == FlightWaypointType.CUSTOM
)
and self.package.primary_flight
and not self.package.primary_flight.flight_plan.is_airassault
):
# Helicopter flights should be slowed down between JOIN & INGRESS
# to allow the escort to keep up while engaging targets along the way.
factor = 0.50
# TODO: Adjust if AGL.
# We don't have an exact heightmap, but we should probably be performing
# *some* adjustment for NTTR since the minimum altitude of the map is

View File

@ -17,7 +17,7 @@ if TYPE_CHECKING:
@dataclass
class FormationLayout(LoiterLayout, ABC):
join: Optional[FlightWaypoint]
join: FlightWaypoint
split: FlightWaypoint
refuel: Optional[FlightWaypoint]
@ -92,10 +92,15 @@ class FormationFlightPlan(LoiterFlightPlan, ABC):
@property
def push_time(self) -> datetime:
return self.join_time - self.travel_time_between_waypoints(
self.layout.hold,
self.layout.join,
hold2join_time = (
self.travel_time_between_waypoints(
self.layout.hold,
self.layout.join,
)
if self.layout.hold
else timedelta(0)
)
return self.join_time - hold2join_time
@property
def mission_begin_on_station_time(self) -> datetime | None:

View File

@ -142,8 +142,7 @@ class FormationAttackLayout(FormationLayout):
if self.hold:
yield self.hold
yield from self.nav_to
if self.join:
yield self.join
yield self.join
if self.lineup:
yield self.lineup
yield self.ingress
@ -187,11 +186,13 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
)
hold = None
join = None
if not self.primary_flight_is_air_assault:
if not self.flight.is_helo:
hold = builder.hold(self._hold_point())
join = builder.join(self.package.waypoints.join)
split = builder.split(self.package.waypoints.split)
join_pos = self.package.waypoints.join
if self.flight.is_helo:
join_pos = self.package.waypoints.ingress
join = builder.join(join_pos)
split = builder.split(self._get_split())
refuel = self._build_refuel(builder)
ingress = builder.ingress(
@ -255,6 +256,9 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
@property
def primary_flight_is_air_assault(self) -> bool:
if self.flight is self.package.primary_flight:
# Can't call self.package.primary_flight.flight_plan here
# because the flight-plan wasn't created yet.
# Calling the fligh_plan property would result in infinite recursion
return self.flight.flight_type == FlightType.AIR_ASSAULT
else:
assert self.package.primary_flight is not None
@ -296,3 +300,13 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
return HoldZoneGeometry(
target, origin, ip, join, self.coalition, self.theater
).find_best_hold_point()
def _get_split(self) -> Point:
assert self.package.waypoints is not None
assert self.package.primary_flight is not None
split_pos = (
self.package.primary_flight.arrival.position
if self.package.primary_flight.is_helo
else self.package.waypoints.split
)
return split_pos

View File

@ -15,7 +15,6 @@ from typing import (
from dcs.mapping import Point, Vector2
from game.ato.flightplans._common_ctld import generate_random_ctld_point
from game.ato.flightwaypoint import AltitudeReference, FlightWaypoint
from game.ato.flightwaypointtype import FlightWaypointType
from game.theater import (
@ -25,7 +24,6 @@ from game.theater import (
TheaterGroundObject,
TheaterUnit,
)
from game.theater.interfaces.CTLD import CTLD
from game.utils import Distance, meters, nautical_miles, feet
if TYPE_CHECKING:
@ -250,10 +248,14 @@ class WaypointBuilder:
else feet(1000)
)
heading = objective.position.heading_between_point(position)
return FlightWaypoint(
"INGRESS",
ingress_type,
position,
objective.position.point_from_heading(heading, nautical_miles(5).meters)
if self.is_helo
else position,
alt,
alt_type,
description=f"INGRESS on {objective.name}",
@ -635,14 +637,10 @@ class WaypointBuilder:
"""Creates a cargo stop waypoint.
This waypoint is used by AirLift as a landing and stopover waypoint
"""
if isinstance(control_point, CTLD) and control_point.ctld_zones:
pos = generate_random_ctld_point(control_point)
else:
pos = control_point.position
return FlightWaypoint(
"CARGOSTOP",
FlightWaypointType.CARGO_STOP,
pos,
control_point.position,
meters(0),
"RADIO",
description=f"Stop for cargo at {control_point.name}",

View File

@ -11,6 +11,7 @@ from dcs.unittype import FlyingType
from game.data.weapons import Pylon, Weapon, WeaponType
from game.dcs.aircrafttype import AircraftType
from .flighttype import FlightType
from ..persistency import prefer_liberation_payloads
if TYPE_CHECKING:
from .flight import Flight
@ -161,7 +162,10 @@ class Loadout:
# last - the first element in the tuple will be tried first, then the second,
# etc.
loadout_names = {
t: [f"Retribution {t.value}", f"Liberation {t.value}"] for t in FlightType
t: [f"Liberation {t.value}", f"Retribution {t.value}"]
if prefer_liberation_payloads()
else [f"Retribution {t.value}", f"Liberation {t.value}"]
for t in FlightType
}
legacy_names = {
FlightType.TARCAP: (

View File

@ -3,6 +3,7 @@ from enum import Enum, auto
from typing import Optional
from game.ato.flighttype import FlightType
from game.dcs.aircrafttype import AircraftType
from game.theater import MissionTarget
@ -33,6 +34,8 @@ class ProposedFlight:
#: field is None.
escort_type: Optional[EscortType] = field(default=None)
preferred_type: Optional[AircraftType] = field(default=None)
def __str__(self) -> str:
return f"{self.task} {self.num_aircraft} ship"

View File

@ -140,7 +140,7 @@ class ObjectiveFinder:
def vulnerable_control_points(self) -> Iterator[ControlPoint]:
"""Iterates over friendly CPs that are vulnerable to enemy CPs.
Vulnerability is defined as any enemy CP within threat range of of the
Vulnerability is defined as any enemy CP within threat range of the
CP.
"""
for cp in self.friendly_control_points():

View File

@ -49,7 +49,12 @@ class PackageBuilder:
pf = self.package.primary_flight
heli = pf.is_helo if pf else False
squadron = self.air_wing.best_squadron_for(
self.package.target, plan.task, plan.num_aircraft, heli, this_turn=True
self.package.target,
plan.task,
plan.num_aircraft,
heli,
this_turn=True,
preferred_type=plan.preferred_type,
)
if squadron is None:
return False

View File

@ -0,0 +1,15 @@
from collections.abc import Iterator
from game.commander.tasks.primitive.antiship import PlanAntiShip
from game.commander.theaterstate import TheaterState
from game.htn import CompoundTask, Method
class AttackShips(CompoundTask[TheaterState]):
def each_valid_method(self, state: TheaterState) -> Iterator[Method[TheaterState]]:
for ship in state.enemy_ships:
# Ammo depots are targeted based on the needs of the front line by
# ReduceEnemyFrontLineCapacity. No reason to target them before that front
# line is active.
if ship.has_live_radar_sam:
yield [PlanAntiShip(ship)]

View File

@ -6,6 +6,7 @@ from game.commander.tasks.compound.attackairinfrastructure import (
)
from game.commander.tasks.compound.attackbattlepositions import AttackBattlePositions
from game.commander.tasks.compound.attackbuildings import AttackBuildings
from game.commander.tasks.compound.attackships import AttackShips
from game.commander.tasks.compound.capturebases import CaptureBases
from game.commander.tasks.compound.defendbases import DefendBases
from game.commander.tasks.compound.degradeiads import DegradeIads
@ -25,10 +26,11 @@ class PlanNextAction(CompoundTask[TheaterState]):
def each_valid_method(self, state: TheaterState) -> Iterator[Method[TheaterState]]:
yield [TheaterSupport()]
yield [ProtectAirSpace()]
yield [CaptureBases()]
yield [DefendBases()]
yield [InterdictReinforcements()]
yield [DegradeIads()]
yield [AttackBattlePositions()]
yield [CaptureBases()]
yield [AttackAirInfrastructure(self.aircraft_cold_start)]
yield [AttackBuildings()]
yield [DegradeIads()]
yield [AttackShips()]

View File

@ -372,10 +372,10 @@ class Game:
persistency.autosave(self)
def check_win_loss(self) -> TurnState:
if not self.theater.player_points():
if not self.theater.player_points(state_check=True):
return TurnState.LOSS
if not self.theater.enemy_points():
if not self.theater.enemy_points(state_check=True):
return TurnState.WIN
return TurnState.CONTINUE

View File

@ -7,6 +7,8 @@ from typing import TYPE_CHECKING, Any
from dcs.countries import countries_by_name
from game.ato import FlightType
from game.ato.flightplans.formation import FormationLayout
from game.ato.flightplans.waypointbuilder import WaypointBuilder
from game.ato.packagewaypoints import PackageWaypoints
from game.data.doctrine import MODERN_DOCTRINE, COLDWAR_DOCTRINE, WWII_DOCTRINE
from game.theater import ParkingType, SeasonalConditions
@ -107,6 +109,10 @@ class Migrator:
try_set_attr(layout, "nav_from", [])
if f.flight_type == FlightType.CAS:
try_set_attr(layout, "ingress", None)
if isinstance(layout, FormationLayout):
if not layout.join and f.package.waypoints:
builder = WaypointBuilder(f, [])
layout.join = builder.join(f.package.waypoints.join)
def _update_flights(self) -> None:
to_remove = []

View File

@ -1,5 +1,5 @@
import logging
from typing import Any, Optional, Type
from typing import Any, Optional, Type, List
from dcs.task import (
AWACS,
@ -124,7 +124,8 @@ class AircraftBehavior:
unit.gun = 0
group.points[0].tasks.append(OptRTBOnBingoFuel(rtb_on_bingo))
group.points[0].tasks.append(OptJettisonEmptyTanks())
if flight.coalition.game.settings.ai_jettison_empty_tanks:
group.points[0].tasks.append(OptJettisonEmptyTanks())
# Do not restrict afterburner.
# https://forums.eagle.ru/forum/english/digital-combat-simulator/dcs-world-2-5/bugs-and-problems-ai/ai-ad/7121294-ai-stuck-at-high-aoa-after-making-sharp-turn-if-afterburner-is-restricted
@ -152,7 +153,7 @@ class AircraftBehavior:
self.configure_behavior(flight, group, rtb_winchester=ammo_type)
def configure_cas(self, group: FlyingGroup[Any], flight: Flight) -> None:
self.configure_task(flight, group, CAS, AFAC)
self.configure_task(flight, group, CAS, [AFAC, AntishipStrike])
self.configure_behavior(
flight,
group,
@ -170,7 +171,7 @@ class AircraftBehavior:
# Note that the only effect that the DCS task type has is in determining which
# waypoint actions the group may perform.
self.configure_task(flight, group, SEAD, CAS)
self.configure_task(flight, group, SEAD, [CAS, AFAC, AntishipStrike])
self.configure_behavior(
flight,
group,
@ -186,7 +187,7 @@ class AircraftBehavior:
# available aircraft, and F-14s are not able to be SEAD despite having TALDs.
# https://forums.eagle.ru/topic/272112-cannot-assign-f-14-to-sead/
self.configure_task(flight, group, SEAD, CAS)
self.configure_task(flight, group, SEAD, [CAS, AFAC, AntishipStrike])
self.configure_behavior(
flight,
group,
@ -200,7 +201,7 @@ class AircraftBehavior:
)
def configure_strike(self, group: FlyingGroup[Any], flight: Flight) -> None:
self.configure_task(flight, group, GroundAttack, PinpointStrike)
self.configure_task(flight, group, GroundAttack, [PinpointStrike, AFAC])
self.configure_behavior(
flight,
group,
@ -211,7 +212,7 @@ class AircraftBehavior:
)
def configure_anti_ship(self, group: FlyingGroup[Any], flight: Flight) -> None:
self.configure_task(flight, group, AntishipStrike, CAS)
self.configure_task(flight, group, AntishipStrike, [CAS, AFAC, SEAD])
self.configure_behavior(
flight,
group,
@ -233,7 +234,7 @@ class AircraftBehavior:
)
def configure_oca_strike(self, group: FlyingGroup[Any], flight: Flight) -> None:
self.configure_task(flight, group, CAS)
self.configure_task(flight, group, CAS, [AFAC, SEAD])
self.configure_behavior(
flight,
group,
@ -345,7 +346,7 @@ class AircraftBehavior:
flight: Flight,
group: FlyingGroup[Any],
preferred_task: Type[MainTask],
fallback_task: Optional[Type[MainTask]] = None,
fallback_tasks: Optional[List[Type[MainTask]]] = None,
) -> None:
ac_type = flight.unit_type.dcs_unit_type.id
@ -358,15 +359,22 @@ class AircraftBehavior:
if preferred_task in flight.unit_type.dcs_unit_type.tasks:
group.task = preferred_task.name
elif fallback_task and fallback_task in flight.unit_type.dcs_unit_type.tasks:
group.task = fallback_task.name
elif fallback_tasks:
for task in fallback_tasks:
if task in flight.unit_type.dcs_unit_type.tasks:
group.task = task.name
return
elif flight.unit_type.dcs_unit_type.task_default and preferred_task == Nothing:
group.task = flight.unit_type.dcs_unit_type.task_default.name
logging.warning(
f"{ac_type} is not capable of 'Nothing', using default task '{group.task}'"
)
else:
fallback_part = f" nor {fallback_task.name}" if fallback_task else ""
fallback_part = (
f" nor any of the following fall-back tasks: {[task.name for task in fallback_tasks]}"
if fallback_tasks
else ""
)
raise RuntimeError(
f"{ac_type} is neither capable of {preferred_task.name}"
f"{fallback_part}. Can't generate {flight.flight_type} flight."

View File

@ -243,6 +243,8 @@ class FlightGroupSpawner:
speed=speed.kph,
maintask=None,
group_size=self.flight.count,
callsign_name=self.flight.callsign.name if self.flight.callsign else None,
callsign_nr=self.flight.callsign.nr if self.flight.callsign else None,
)
group.points[0].alt_type = alt_type

View File

@ -15,9 +15,9 @@ class AntiShipIngressBuilder(PydcsWaypointBuilder):
target = self.package.target
if isinstance(target, NavalControlPoint):
carrier_name = target.get_carrier_group_name()
if carrier_name:
group_names.append(carrier_name)
carrier_tgo = target.ground_objects[0]
for g in carrier_tgo.groups:
group_names.append(g.group_name)
elif isinstance(target, TheaterGroundObject):
for group in target.groups:
group_names.append(group.group_name)

View File

@ -11,7 +11,8 @@ from .pydcswaypointbuilder import PydcsWaypointBuilder
class BaiIngressBuilder(PydcsWaypointBuilder):
def add_tasks(self, waypoint: MovingPoint) -> None:
self.register_special_ingress_points()
waypoint.tasks.append(OptFormation.trail_open())
if not self.flight.is_helo:
waypoint.tasks.append(OptFormation.trail_open())
# TODO: Add common "UnitGroupTarget" base type.
group_names = []
target = self.package.target

View File

@ -94,7 +94,11 @@ class JoinPointBuilder(PydcsWaypointBuilder):
max_dist: float = 30.0,
vertical_spacing: float = 2000.0,
) -> None:
waypoint.tasks.append(OptROE(value=OptROE.Values.OpenFire))
if self.flight.is_helo:
# Make helicopters a bit more aggressive
waypoint.tasks.append(OptROE(value=OptROE.Values.OpenFireWeaponFree))
else:
waypoint.tasks.append(OptROE(value=OptROE.Values.OpenFire))
rx = (random.random() + 0.1) * 333
ry = feet(vertical_spacing).meters

View File

@ -4,6 +4,7 @@ from dcs.task import (
ControlledTask,
EngageTargets,
Targets,
OptROE,
)
from game.utils import nautical_miles
@ -13,6 +14,7 @@ from .pydcswaypointbuilder import PydcsWaypointBuilder
class SeadSweepIngressBuilder(PydcsWaypointBuilder):
def add_tasks(self, waypoint: MovingPoint) -> None:
self.register_special_ingress_points()
waypoint.tasks.append(OptROE(value=OptROE.Values.OpenFireWeaponFree))
# Preemptively use ECM to better avoid getting swatted.
ecm_option = OptECMUsing(value=OptECMUsing.Values.UseIfDetectedLockByRadar)
waypoint.tasks.append(ecm_option)
@ -26,7 +28,7 @@ class SeadSweepIngressBuilder(PydcsWaypointBuilder):
self.flight.coalition.game.settings.sead_sweep_engagement_range_distance
).meters
),
targets=[Targets.All.GroundUnits.AirDefence.AAA.SAMRelated],
targets=[Targets.All.GroundUnits.AirDefence],
)
)
)

View File

@ -7,6 +7,7 @@ from dcs.task import (
SwitchWaypoint,
)
from game.utils import knots
from .pydcswaypointbuilder import PydcsWaypointBuilder
@ -29,10 +30,12 @@ class SplitPointBuilder(PydcsWaypointBuilder):
waypoint.tasks.append(OptFormation.rotary_wedge())
else:
waypoint.tasks.append(OptFormation.finger_four_close())
if not self.flight.is_helo:
waypoint.speed_locked = True
waypoint.speed_locked = True
waypoint.ETA_locked = False
if self.flight.is_helo:
waypoint.speed = knots(100).meters_per_second
else:
waypoint.speed = self.flight.coalition.doctrine.rtb_speed.meters_per_second
waypoint.ETA_locked = False
if self.flight is self.package.primary_flight:
script = RunScript(
f'trigger.action.setUserFlag("split-{id(self.package)}", true)'

View File

@ -1,7 +1,7 @@
import logging
from dcs.point import MovingPoint
from dcs.task import EngageTargets, OptFormation, Targets
from dcs.task import EngageTargets, OptFormation, Targets, OptROE
from game.ato.flightplans.sweep import SweepFlightPlan
from game.utils import nautical_miles
@ -16,6 +16,8 @@ class SweepIngressBuilder(PydcsWaypointBuilder):
else:
waypoint.tasks.append(OptFormation.spread_four_open())
waypoint.tasks.append(OptROE(value=OptROE.Values.OpenFireWeaponFree))
if not isinstance(self.flight.flight_plan, SweepFlightPlan):
flight_plan_type = self.flight.flight_plan.__class__.__name__
logging.error(

View File

@ -73,7 +73,7 @@ class VisualsGenerator:
self.game = game
def _generate_frontline_smokes(self) -> None:
country = self.mission.country(self.game.red.faction.country.name)
country = list(self.mission.coalition["neutrals"].countries.values())[0]
for front_line in self.game.theater.conflicts():
from_cp = front_line.blue_cp
to_cp = front_line.red_cp

View File

@ -16,6 +16,8 @@ if TYPE_CHECKING:
from game import Game
_dcs_saved_game_folder: Optional[str] = None
_prefer_liberation_payloads: bool = False
_server_port: int = 16880
# fmt: off
@ -61,6 +63,8 @@ class MigrationUnpickler(pickle.Unpickler):
return dcs.terrain.falklands.airports.Hipico_Flying_Club
if name in ["SaveManager", "SaveGameBundle"]:
return DummyObject
if name == "CaletaTortel":
return dcs.terrain.falklands.airports.Caleta_Tortel_Airport
if module == "pydcs_extensions.f4b.f4b":
return pydcs_extensions.f4
if module == "pydcs_extensions.irondome.irondome":
@ -74,9 +78,13 @@ class MigrationUnpickler(pickle.Unpickler):
# fmt: on
def setup(user_folder: str) -> None:
def setup(user_folder: str, prefer_liberation_payloads: bool, port: int) -> None:
global _dcs_saved_game_folder
global _prefer_liberation_payloads
global _server_port
_dcs_saved_game_folder = user_folder
_prefer_liberation_payloads = prefer_liberation_payloads
_server_port = port
if not save_dir().exists():
save_dir().mkdir(parents=True)
@ -110,6 +118,11 @@ def payloads_dir(backup: bool = False) -> Path:
return payloads
def prefer_liberation_payloads() -> bool:
global _prefer_liberation_payloads
return _prefer_liberation_payloads
def user_custom_weapon_injections_dir() -> Path:
return base_path() / "Retribution" / "WeaponInjections"
@ -118,6 +131,11 @@ def save_dir() -> Path:
return base_path() / "Retribution" / "Saves"
def server_port() -> int:
global _server_port
return _server_port
def _temporary_save_file() -> str:
return str(save_dir() / "tmpsave.retribution")

View File

@ -281,9 +281,45 @@ class PretenseAircraftGenerator:
num_of_bai = 0
num_of_strike = 0
num_of_cap = 0
sead_tasks = [FlightType.SEAD, FlightType.SEAD_SWEEP, FlightType.SEAD_ESCORT]
strike_tasks = [
FlightType.STRIKE,
FlightType.OCA_RUNWAY,
FlightType.OCA_AIRCRAFT,
]
patrol_tasks = [
FlightType.BARCAP,
FlightType.TARCAP,
FlightType.ESCORT,
FlightType.INTERCEPTION,
]
sead_capable_cp = False
cas_capable_cp = False
bai_capable_cp = False
strike_capable_cp = False
patrol_capable_cp = False
# First check what are the capabilities of the squadrons on this CP
for squadron in cp.squadrons:
for task in sead_tasks:
if task in squadron.auto_assignable_mission_types:
sead_capable_cp = True
for task in strike_tasks:
if task in squadron.auto_assignable_mission_types:
if not squadron.aircraft.helicopter:
strike_capable_cp = True
for task in patrol_tasks:
if task in squadron.auto_assignable_mission_types:
if not squadron.aircraft.helicopter:
patrol_capable_cp = True
if FlightType.CAS in squadron.auto_assignable_mission_types:
cas_capable_cp = True
if FlightType.BAI in squadron.auto_assignable_mission_types:
bai_capable_cp = True
random_squadron_list = list(cp.squadrons)
random.shuffle(random_squadron_list)
# Then plan transports, AEWC and tankers
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
@ -291,14 +327,6 @@ class PretenseAircraftGenerator:
if cp.coalition != squadron.coalition:
continue
squadron.owned_aircraft += (
self.game.settings.pretense_ai_aircraft_per_flight
)
squadron.untasked_aircraft += (
self.game.settings.pretense_ai_aircraft_per_flight
)
squadron.populate_for_turn_0(False)
package = Package(cp, squadron.flight_db, auto_asap=False)
mission_types = squadron.auto_assignable_mission_types
aircraft_per_flight = 1
if squadron.aircraft.helicopter and (
@ -311,52 +339,6 @@ class PretenseAircraftGenerator:
or FlightType.AIR_ASSAULT in mission_types
):
flight_type = FlightType.TRANSPORT
elif (
FlightType.SEAD in mission_types
or FlightType.SEAD_SWEEP in mission_types
or FlightType.SEAD_ESCORT in mission_types
) and num_of_sead < self.game.settings.pretense_sead_flights_per_cp:
flight_type = FlightType.SEAD
num_of_sead += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif (
FlightType.DEAD in mission_types
and num_of_sead < self.game.settings.pretense_sead_flights_per_cp
):
flight_type = FlightType.DEAD
num_of_sead += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif (
(squadron.aircraft.helicopter and (FlightType.ESCORT in mission_types))
or (FlightType.CAS in mission_types)
and num_of_cas < self.game.settings.pretense_cas_flights_per_cp
):
flight_type = FlightType.CAS
num_of_cas += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif (
FlightType.BAI in mission_types
) and num_of_bai < self.game.settings.pretense_bai_flights_per_cp:
flight_type = FlightType.BAI
num_of_bai += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif (
FlightType.STRIKE in mission_types
or FlightType.OCA_RUNWAY in mission_types
or FlightType.OCA_AIRCRAFT in mission_types
) and num_of_strike < self.game.settings.pretense_strike_flights_per_cp:
flight_type = FlightType.STRIKE
num_of_strike += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif (
FlightType.BARCAP in mission_types
or FlightType.TARCAP in mission_types
or FlightType.ESCORT in mission_types
or FlightType.INTERCEPTION in mission_types
) and num_of_cap < self.game.settings.pretense_barcap_flights_per_cp:
flight_type = FlightType.BARCAP
num_of_cap += 1
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
elif FlightType.AEWC in mission_types:
flight_type = FlightType.AEWC
aircraft_per_flight = PRETENSE_AI_AWACS_PER_FLIGHT
@ -366,37 +348,181 @@ class PretenseAircraftGenerator:
else:
continue
if flight_type == FlightType.TRANSPORT:
flight = Flight(
package,
squadron,
aircraft_per_flight,
FlightType.PRETENSE_CARGO,
StartType.IN_FLIGHT,
divert=cp,
)
package.add_flight(flight)
flight.state = Navigating(flight, self.game.settings, waypoint_index=1)
else:
flight = Flight(
package,
squadron,
aircraft_per_flight,
flight_type,
StartType.COLD,
divert=cp,
)
package.add_flight(flight)
flight.state = WaitingForStart(
flight, self.game.settings, self.game.conditions.start_time
)
print(
f"Generated flight for {flight_type} flying {squadron.aircraft.display_name} at {squadron.location.name}"
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
ato.add_package(package)
# Then plan SEAD and DEAD, if capable
if sead_capable_cp:
while num_of_sead < self.game.settings.pretense_sead_flights_per_cp:
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
continue
if cp.coalition != squadron.coalition:
continue
mission_types = squadron.auto_assignable_mission_types
if (
(
FlightType.SEAD in mission_types
or FlightType.SEAD_SWEEP in mission_types
or FlightType.SEAD_ESCORT in mission_types
)
and num_of_sead
< self.game.settings.pretense_sead_flights_per_cp
):
flight_type = FlightType.SEAD
num_of_sead += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
elif (
FlightType.DEAD in mission_types
and num_of_sead
< self.game.settings.pretense_sead_flights_per_cp
):
flight_type = FlightType.DEAD
num_of_sead += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
else:
continue
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
# Then plan Strike, if capable
if strike_capable_cp:
while num_of_strike < self.game.settings.pretense_strike_flights_per_cp:
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
continue
if cp.coalition != squadron.coalition:
continue
mission_types = squadron.auto_assignable_mission_types
for task in strike_tasks:
if task in mission_types and not squadron.aircraft.helicopter:
flight_type = FlightType.STRIKE
num_of_strike += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
break
# Then plan air-to-air, if capable
if patrol_capable_cp:
while num_of_cap < self.game.settings.pretense_barcap_flights_per_cp:
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
continue
if cp.coalition != squadron.coalition:
continue
mission_types = squadron.auto_assignable_mission_types
for task in patrol_tasks:
if task in mission_types and not squadron.aircraft.helicopter:
flight_type = FlightType.BARCAP
num_of_cap += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
break
# Then plan CAS, if capable
if cas_capable_cp:
while num_of_cas < self.game.settings.pretense_cas_flights_per_cp:
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
continue
if cp.coalition != squadron.coalition:
continue
mission_types = squadron.auto_assignable_mission_types
if (
squadron.aircraft.helicopter
and (FlightType.ESCORT in mission_types)
) or (FlightType.CAS in mission_types):
flight_type = FlightType.CAS
num_of_cas += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
# And finally, plan BAI, if capable
if bai_capable_cp:
while num_of_bai < self.game.settings.pretense_bai_flights_per_cp:
for squadron in random_squadron_list:
# Intentionally don't spawn anything at OffMapSpawns in Pretense
if isinstance(squadron.location, OffMapSpawn):
continue
if cp.coalition != squadron.coalition:
continue
mission_types = squadron.auto_assignable_mission_types
if FlightType.BAI in mission_types:
flight_type = FlightType.BAI
num_of_bai += 1
aircraft_per_flight = (
self.game.settings.pretense_ai_aircraft_per_flight
)
self.generate_pretense_flight(
ato, cp, squadron, aircraft_per_flight, flight_type
)
return
def generate_pretense_flight(
self,
ato: AirTaskingOrder,
cp: ControlPoint,
squadron: Squadron,
aircraft_per_flight: int,
flight_type: FlightType,
) -> None:
squadron.owned_aircraft += self.game.settings.pretense_ai_aircraft_per_flight
squadron.untasked_aircraft += self.game.settings.pretense_ai_aircraft_per_flight
squadron.populate_for_turn_0(False)
package = Package(cp, squadron.flight_db, auto_asap=False)
if flight_type == FlightType.TRANSPORT:
flight = Flight(
package,
squadron,
aircraft_per_flight,
FlightType.PRETENSE_CARGO,
StartType.IN_FLIGHT,
divert=cp,
)
package.add_flight(flight)
flight.state = Navigating(flight, self.game.settings, waypoint_index=1)
else:
flight = Flight(
package,
squadron,
aircraft_per_flight,
flight_type,
StartType.COLD,
divert=cp,
)
package.add_flight(flight)
flight.state = WaitingForStart(
flight, self.game.settings, self.game.conditions.start_time
)
print(
f"Generated flight for {flight_type} flying {squadron.aircraft.display_name} at {squadron.location.name}"
)
ato.add_package(package)
def generate_pretense_aircraft_for_other_side(
self, cp: ControlPoint, coalition: Coalition, ato: AirTaskingOrder
) -> None:

View File

@ -219,13 +219,6 @@ class ProcurementAi:
budget, fulfilled = self.fulfill_aircraft_request(
squadrons, request.number, budget
)
if not fulfilled:
# The request was not fulfilled because we could not afford any suitable
# aircraft. Rather than continuing, which could proceed to buy tons of
# cheap escorts that will never allow us to plan a strike package, stop
# buying so we can save the budget until a turn where we *can* afford to
# fill the package.
break
return budget
@property

View File

@ -2,6 +2,7 @@ import time
from collections.abc import Iterator
from contextlib import contextmanager
from threading import Thread
from typing import Optional
import uvicorn
from uvicorn import Config
@ -13,12 +14,13 @@ from game.sim import GameUpdateEvents
class Server(uvicorn.Server):
def __init__(self) -> None:
def __init__(self, port: Optional[int]) -> None:
settings = ServerSettings.get(port)
super().__init__(
Config(
app=app,
host=ServerSettings.get().server_bind_address,
port=ServerSettings.get().server_port,
host=settings.server_bind_address,
port=settings.server_port,
# Configured explicitly with default_logging.yaml or logging.yaml.
log_config=None,
)

View File

@ -1,6 +1,7 @@
from __future__ import annotations
from functools import lru_cache
from typing import Optional
from pydantic_settings import BaseSettings
@ -30,5 +31,5 @@ class ServerSettings(BaseSettings):
@classmethod
@lru_cache
def get(cls) -> ServerSettings:
return cls()
def get(cls, port: Optional[int] = server_port) -> ServerSettings:
return cls(server_port=port)

View File

@ -193,11 +193,12 @@ class Settings:
default=False,
detail=(
"If checked, squadrons with a primary task matching the mission will be "
"preferred even if there is a closer squadron capable of the mission as a"
"preferred even if there is a closer squadron capable of the mission as a "
"secondary task. Expect longer flights, but squadrons will be more often "
"assigned to their primary task."
),
)
# CAMPAIGN DOCTRINE
autoplan_tankers_for_strike: bool = boolean_option(
"Auto-planner plans refueling flights for Strike packages",
page=CAMPAIGN_DOCTRINE_PAGE,
@ -283,6 +284,23 @@ class Settings:
"setting to avoid the AI flying into the terrain."
),
)
atflir_autoswap: bool = boolean_option(
"Auto-swap ATFLIR to LITENING",
page=CAMPAIGN_DOCTRINE_PAGE,
section=GENERAL_SECTION,
default=True,
detail=(
"Automatically swaps ATFLIR to LITENING pod for newly generated land-based F-18 flights "
"without having to change the payload. <u>Takes effect after current turn!</u>"
),
)
ai_jettison_empty_tanks: bool = boolean_option(
"Enable AI empty fuel tank jettison",
page=CAMPAIGN_DOCTRINE_PAGE,
section=GENERAL_SECTION,
default=False,
detail=("AI will jettison their fuel tanks as soon as they're empty."),
)
airbase_threat_range: int = bounded_int_option(
"Airbase threat range (nmi)",
page=CAMPAIGN_DOCTRINE_PAGE,
@ -291,7 +309,7 @@ class Settings:
min=0,
max=300,
detail=(
"Will impact both defensive (BARCAP) and offensive flights. Also has a performance impact,"
"Will impact both defensive (BARCAP) and offensive flights. Also has a performance impact, "
"lower threat range generally means less BARCAPs are planned."
),
)
@ -339,7 +357,7 @@ class Settings:
min=0,
max=300,
detail=(
"How far, at minimum, will AEW&C racetracks be planned"
"How far, at minimum, will AEW&C racetracks be planned "
"to known threat zones."
),
)
@ -375,7 +393,7 @@ class Settings:
default=True,
detail=(
"If set, squadrons will be limited to a maximum number of pilots and dead "
"pilots will replenish at a fixed rate, each defined with the settings"
"pilots will replenish at a fixed rate, each defined with the settings "
"below. Auto-purchase may buy aircraft for which there are no pilots"
"available, so this feature is still a work-in-progress."
),
@ -573,7 +591,7 @@ class Settings:
default=35,
min=0,
max=100,
detail="See 2-ship weight factor (WF2)",
detail="See 2-ship weight factor (WF3)",
)
fpa_4ship_weight: int = bounded_int_option(
"4-ship weight factor (WF4)",
@ -582,7 +600,7 @@ class Settings:
default=15,
min=0,
max=100,
detail="See 2-ship weight factor (WF2)",
detail="See 2-ship weight factor (WF4)",
)
# Mission Generator
@ -675,16 +693,6 @@ class Settings:
"targets available for OCA/Aircraft missions."
),
)
atflir_autoswap: bool = boolean_option(
"Auto-swap ATFLIR to LITENING",
MISSION_GENERATOR_PAGE,
GAMEPLAY_SECTION,
default=True,
detail=(
"Automatically swaps ATFLIR to LITENING pod for newly generated land-based F-18 flights "
"without having to change the payload. <u>Takes effect after current turn!</u>"
),
)
default_start_type: StartType = choices_option(
"Default start type for AI aircraft",
page=MISSION_GENERATOR_PAGE,
@ -777,7 +785,7 @@ class Settings:
GAMEPLAY_SECTION,
default=False,
detail=(
"If enabled, AI can use roadbases or airbases which only have ground spawns."
"If enabled, AI can use roadbases or airbases which only have ground spawns. "
"AI will always air-start from these bases (due to DCS limitation)."
),
)
@ -787,7 +795,7 @@ class Settings:
GAMEPLAY_SECTION,
default=True,
detail=(
"Can be used to remove lightposts and other obstacles from roadbase runways."
"Can be used to remove lightposts and other obstacles from roadbase runways. "
"Might not work in DCS multiplayer."
),
)

View File

@ -51,6 +51,7 @@ class AirWing:
size: int,
heli: bool,
this_turn: bool,
preferred_type: Optional[AircraftType] = None,
) -> list[Squadron]:
airfield_cache = ObjectiveDistanceCache.get_closest_airfields(location)
best_aircraft = AircraftType.priority_list_for_task(task)
@ -59,7 +60,13 @@ class AirWing:
if control_point.captured != self.player:
continue
capable_at_base = []
for squadron in control_point.squadrons:
squadrons = [
s
for s in control_point.squadrons
if not preferred_type
or s.aircraft.variant_id == preferred_type.variant_id
]
for squadron in squadrons:
if squadron.can_auto_assign_mission(
location, task, size, heli, this_turn
):
@ -92,8 +99,11 @@ class AirWing:
size: int,
heli: bool,
this_turn: bool,
preferred_type: Optional[AircraftType] = None,
) -> Optional[Squadron]:
for squadron in self.best_squadrons_for(location, task, size, heli, this_turn):
for squadron in self.best_squadrons_for(
location, task, size, heli, this_turn, preferred_type
):
return squadron
return None

View File

@ -120,20 +120,27 @@ class ConflictTheater:
)
return new_point
def control_points_for(self, player: bool) -> Iterator[ControlPoint]:
def control_points_for(
self, player: bool, state_check: bool = False
) -> Iterator[ControlPoint]:
for point in self.controlpoints:
if point.captured == player:
yield point
if not state_check:
yield point
elif point.is_carrier and point.runway_is_operational():
yield point
elif not point.is_carrier:
yield point
def player_points(self) -> List[ControlPoint]:
return list(self.control_points_for(player=True))
def player_points(self, state_check: bool = False) -> List[ControlPoint]:
return list(self.control_points_for(player=True, state_check=state_check))
def conflicts(self) -> Iterator[FrontLine]:
for cp in self.player_points():
yield from cp.front_lines.values()
def enemy_points(self) -> List[ControlPoint]:
return list(self.control_points_for(player=False))
def enemy_points(self, state_check: bool = False) -> List[ControlPoint]:
return list(self.control_points_for(player=False, state_check=state_check))
def closest_control_point(
self, point: Point, allow_naval: bool = False

View File

@ -321,6 +321,13 @@ class AirliftPlanner:
if self.package.flights:
self.package.set_tot_asap(now)
self.game.ato_for(self.for_player).add_package(self.package)
from game.server import EventStream
from game.sim import GameUpdateEvents
events = GameUpdateEvents()
for f in self.package.flights:
events = events.new_flight(f)
EventStream.put_nowait(events)
def create_airlift_flight(self, squadron: Squadron) -> int:
available_aircraft = squadron.untasked_aircraft
@ -606,6 +613,8 @@ class PendingTransfers:
== TransitConnection.Shipping
):
return self.cargo_ships.add(transfer, next_stop)
else:
next_stop = transfer.destination
AirliftPlanner(self.game, transfer, next_stop).create_package_for_airlift(now)
def new_transfer(self, transfer: TransferOrder, now: datetime) -> None:

View File

@ -11,6 +11,8 @@ from game import persistency
global __dcs_saved_game_directory
global __dcs_installation_directory
global __last_save_file
global __prefer_liberation_payloads
global __server_port
USER_PATH = Path(os.environ["LOCALAPPDATA"]) / "DCSRetribution"
@ -23,6 +25,8 @@ def init():
global __dcs_installation_directory
global __last_save_file
global __ignore_empty_install_directory
global __prefer_liberation_payloads
global __server_port
if PREFERENCES_PATH.exists():
try:
@ -35,16 +39,24 @@ def init():
__ignore_empty_install_directory = pref_data.get(
"ignore_empty_install_directory", False
)
__prefer_liberation_payloads = pref_data.get(
"prefer_liberation_payloads", False
)
__server_port = pref_data.get("server_port", 16880)
is_first_start = False
except (KeyError, json.JSONDecodeError):
__dcs_saved_game_directory = ""
__dcs_installation_directory = ""
__last_save_file = ""
__ignore_empty_install_directory = False
__prefer_liberation_payloads = False
__server_port = 16880
is_first_start = True
else:
__last_save_file = ""
__ignore_empty_install_directory = False
__prefer_liberation_payloads = False
__server_port = 16880
try:
__dcs_saved_game_directory = (
dcs.installation.get_dcs_saved_games_directory()
@ -61,16 +73,22 @@ def init():
__dcs_installation_directory = ""
is_first_start = True
persistency.setup(__dcs_saved_game_directory)
persistency.setup(
__dcs_saved_game_directory, __prefer_liberation_payloads, __server_port
)
return is_first_start
def setup(saved_game_dir, install_dir):
def setup(saved_game_dir, install_dir, prefer_liberation_payloads, port):
global __dcs_saved_game_directory
global __dcs_installation_directory
global __prefer_liberation_payloads
global __server_port
__dcs_saved_game_directory = saved_game_dir
__dcs_installation_directory = install_dir
persistency.setup(__dcs_saved_game_directory)
__prefer_liberation_payloads = prefer_liberation_payloads
__server_port = port
persistency.setup(saved_game_dir, prefer_liberation_payloads, port)
def setup_last_save_file(last_save_file):
@ -83,11 +101,14 @@ def save_config():
global __dcs_installation_directory
global __last_save_file
global __ignore_empty_install_directory
global __server_port
pref_data = {
"saved_game_dir": __dcs_saved_game_directory,
"dcs_install_dir": __dcs_installation_directory,
"last_save_file": __last_save_file,
"ignore_empty_install_directory": __ignore_empty_install_directory,
"prefer_liberation_payloads": __prefer_liberation_payloads,
"server_port": __server_port,
}
PREFERENCES_PATH.parent.mkdir(exist_ok=True, parents=True)
with PREFERENCES_PATH.open("w") as prefs:
@ -104,6 +125,16 @@ def get_saved_game_dir():
return __dcs_saved_game_directory
def prefer_liberation_payloads():
global __prefer_liberation_payloads
return __prefer_liberation_payloads
def server_port():
global __server_port
return __server_port
def ignore_empty_install_directory():
global __ignore_empty_install_directory
return __ignore_empty_install_directory

View File

@ -61,18 +61,6 @@ def inject_custom_payloads(user_path: Path) -> None:
PayloadDirectories.set_preferred(user_path / "MissionEditor" / "UnitPayloads")
def inject_mod_payloads(mod_path: Path) -> None:
if mod_path.exists():
payloads = mod_path
else:
raise RuntimeError(
f"Could not find mod payloads at {mod_path}."
f"Aircraft will have no payloads."
)
# We configure these as preferred so the mod's loadouts override the stock ones.
PayloadDirectories.set_preferred(payloads)
def on_game_load(game: Optional[Game]) -> None:
EventStream.drain()
EventStream.put_nowait(GameUpdateEvents().game_loaded(game))
@ -454,7 +442,8 @@ def main():
dump_task_priorities()
return
with Server().run_in_thread():
liberation_install.init()
with Server(liberation_install.server_port()).run_in_thread():
run_ui(game, UiFlags(args.dev, args.show_sim_speed_controls))

View File

@ -166,6 +166,8 @@ class QTopPanel(QFrame):
with logged_duration("Skipping turn"):
self.game.pass_turn(no_action=True)
GameUpdateSignal.get_instance().updateGame(self.game)
state = self.game_model.game.check_win_loss()
GameUpdateSignal.get_instance().gameStateChanged(state)
self.proceedButton.setEnabled(True)
def negative_start_packages(self, now: datetime) -> List[Package]:

View File

@ -8,6 +8,7 @@ from PySide6.QtWebEngineCore import QWebEnginePage, QWebEngineSettings
from PySide6.QtWebEngineWidgets import QWebEngineView
from game.server.settings import ServerSettings
from qt_ui.liberation_install import server_port
from qt_ui.models import GameModel
@ -44,7 +45,7 @@ class QLiberationMap(QWebEngineView):
url = QUrl("http://localhost:3000")
else:
url = QUrl.fromLocalFile(str(Path("client/build/index.html").resolve()))
server_settings = ServerSettings.get()
server_settings = ServerSettings.get(server_port())
host = server_settings.server_bind_address
if host.startswith("::"):
host = f"[{host}]"

View File

@ -19,6 +19,8 @@ from PySide6.QtWidgets import (
)
from game.ato.flight import Flight
from game.server import EventStream
from game.sim import GameUpdateEvents
from game.squadrons import Squadron
from game.theater import ConflictTheater
from qt_ui.delegates import TwoColumnRowDelegate
@ -258,6 +260,9 @@ class AirWingTabs(QTabWidget):
def open_awcd(self, gm: GameModel):
AirWingConfigurationDialog(gm.game, True, self).exec_()
events = GameUpdateEvents().begin_new_turn()
EventStream.put_nowait(events)
gm.ato_model.on_sim_update(events)
class AirWingDialog(QDialog):

View File

@ -569,7 +569,7 @@ class QLiberationWindow(QMainWindow):
LAYOUTS.import_templates()
def showLogsDialog(self):
self.dialog = QLogsWindow()
self.dialog = QLogsWindow(self)
self.dialog.show()
def onDebriefing(self, debrief: Debriefing):

View File

@ -8,6 +8,7 @@ from PySide6.QtWidgets import (
QPlainTextEdit,
QVBoxLayout,
QPushButton,
QWidget,
)
from qt_ui.logging_handler import HookableInMemoryHandler
@ -21,8 +22,8 @@ class QLogsWindow(QDialog):
clear_button: QPushButton
_logging_handler: typing.Optional[HookableInMemoryHandler]
def __init__(self):
super().__init__()
def __init__(self, parent: QWidget):
super().__init__(parent)
self.setWindowTitle("Logs")
self.setMinimumSize(400, 100)

View File

@ -47,76 +47,100 @@ class QAutoCreateDialog(QDialog):
hbox = QHBoxLayout()
self.primary_combobox = QComboBox()
self.primary_combobox.setFixedWidth(100)
self.primary_count = _spinbox_template()
self.primary_type = QComboBox()
nr_targets = len(self.package.target.strike_targets)
count = max(1, min(4, nr_targets // 2) + nr_targets % 1) if nr_targets else 4
self.primary_count.setValue(count)
hbox.addWidget(self.primary_combobox)
hbox.addWidget(self.primary_count)
hbox.addWidget(self.primary_type)
self.layout.addLayout(hbox)
self.checkboxes = {}
hbox = QHBoxLayout()
self.tarcap = QCheckBox()
self.tarcap.setText("TARCAP")
self.tarcap = self._create_checkbox("TARCAP")
self.tarcap_count = _spinbox_template()
hbox.addWidget(self.tarcap)
hbox.addWidget(self.tarcap_count)
self.tarcap_type = self._create_type_selector(FlightType.TARCAP)
hbox.addWidget(self.tarcap_type)
self.layout.addLayout(hbox)
self.checkboxes[self.tarcap] = (FlightType.TARCAP, self.tarcap_count)
self.checkboxes[self.tarcap] = (
FlightType.TARCAP,
self.tarcap_count,
self.tarcap_type,
)
hbox = QHBoxLayout()
self.escort = QCheckBox()
self.escort.setText("Escort")
self.escort = self._create_checkbox("Escort")
self.escort_count = _spinbox_template()
hbox.addWidget(self.escort)
hbox.addWidget(self.escort_count)
self.escort_type = self._create_type_selector(FlightType.ESCORT)
hbox.addWidget(self.escort_type)
self.layout.addLayout(hbox)
self.checkboxes[self.escort] = (FlightType.ESCORT, self.escort_count)
self.checkboxes[self.escort] = (
FlightType.ESCORT,
self.escort_count,
self.escort_type,
)
hbox = QHBoxLayout()
self.sead_escort = QCheckBox()
self.sead_escort.setText("SEAD Escort")
self.sead_escort = self._create_checkbox("SEAD Escort")
self.sead_escort_count = _spinbox_template()
hbox.addWidget(self.sead_escort)
hbox.addWidget(self.sead_escort_count)
self.sead_escort_type = self._create_type_selector(FlightType.SEAD_ESCORT)
hbox.addWidget(self.sead_escort_type)
self.layout.addLayout(hbox)
self.checkboxes[self.sead_escort] = (
FlightType.SEAD_ESCORT,
self.sead_escort_count,
self.sead_escort_type,
)
hbox = QHBoxLayout()
self.sead = QCheckBox()
self.sead.setText("SEAD")
self.sead = self._create_checkbox("SEAD")
self.sead_count = _spinbox_template()
hbox.addWidget(self.sead)
hbox.addWidget(self.sead_count)
self.sead_type = self._create_type_selector(FlightType.SEAD)
hbox.addWidget(self.sead_type)
self.layout.addLayout(hbox)
self.checkboxes[self.sead] = (FlightType.SEAD, self.sead_count)
self.checkboxes[self.sead] = (FlightType.SEAD, self.sead_count, self.sead_type)
hbox = QHBoxLayout()
self.sead_sweep = QCheckBox()
self.sead_sweep.setText("SEAD Sweep")
self.sead_sweep = self._create_checkbox("SEAD Sweep")
self.sead_sweep_count = _spinbox_template()
hbox.addWidget(self.sead_sweep)
hbox.addWidget(self.sead_sweep_count)
self.sead_sweep_type = self._create_type_selector(FlightType.SEAD_SWEEP)
hbox.addWidget(self.sead_sweep_type)
self.layout.addLayout(hbox)
self.checkboxes[self.sead_sweep] = (
FlightType.SEAD_SWEEP,
self.sead_sweep_count,
self.sead_sweep_type,
)
hbox = QHBoxLayout()
self.refueling = QCheckBox()
self.refueling.setText("Refueling")
self.refueling = self._create_checkbox("Refueling")
self.refueling_count = _spinbox_template()
self.refueling_count.setValue(1)
hbox.addWidget(self.refueling)
hbox.addWidget(self.refueling_count)
self.refueling_type = self._create_type_selector(FlightType.REFUELING)
hbox.addWidget(self.refueling_type, 1)
self.layout.addLayout(hbox)
self.checkboxes[self.refueling] = (FlightType.REFUELING, self.refueling_count)
self.checkboxes[self.refueling] = (
FlightType.REFUELING,
self.refueling_count,
self.refueling_type,
)
self.create_button = QPushButton("Create")
self.create_button.setProperty("style", "start-button")
@ -139,6 +163,28 @@ class QAutoCreateDialog(QDialog):
if mt in primary_tasks:
self.primary_combobox.addItem(mt.value, mt)
self.primary_combobox.setCurrentIndex(0)
self._load_aircraft_types()
@staticmethod
def _create_checkbox(label: str) -> QCheckBox:
cb = QCheckBox(label)
cb.setFixedWidth(100)
return cb
def _create_type_selector(self, flight_type: FlightType) -> QComboBox:
airwing = self.game.blue.air_wing
cb = QComboBox()
for ac in airwing.best_available_aircrafts_for(flight_type):
cb.addItem(ac.variant_id, ac)
return cb
def _load_aircraft_types(self):
self.primary_type.clear()
for ac in self.game.blue.air_wing.best_available_aircrafts_for(
self.primary_combobox.currentData()
):
self.primary_type.addItem(ac.variant_id, ac)
self.primary_type.setCurrentIndex(0)
def on_primary_task_changed(self) -> None:
disable = self.primary_combobox.currentData() == FlightType.CAS
@ -147,15 +193,26 @@ class QAutoCreateDialog(QDialog):
if disable:
cb.setChecked(False)
cb.setDisabled(disable)
self._load_aircraft_types()
def on_create_clicked(self) -> None:
pf: List[ProposedFlight] = []
count = self.primary_count.value()
pf.append(ProposedFlight(self.primary_combobox.currentData(), count))
pf.append(
ProposedFlight(
self.primary_combobox.currentData(),
count,
preferred_type=self.primary_type.currentData(),
)
)
for cb in self.checkboxes:
if cb.isChecked():
type, spinner = self.checkboxes[cb]
pf.append(ProposedFlight(type, spinner.value()))
type, spinner, ac_box = self.checkboxes[cb]
pf.append(
ProposedFlight(
type, spinner.value(), preferred_type=ac_box.currentData()
)
)
with MultiEventTracer() as tracer:
with tracer.trace(f"Auto-plan package"):
pm = ProposedMission(self.package.target, pf, asap=True)

View File

@ -237,11 +237,12 @@ class QPackageDialog(QDialog):
auto_create_dialog = QAutoCreateDialog(
self.game, self.package_model, parent=self.window()
)
auto_create_dialog.exec_()
for f in self.package_model.package.flights:
EventStream.put_nowait(GameUpdateEvents().new_flight(f))
self.package_model.update_tot()
self.package_changed.emit()
if auto_create_dialog.exec_() == QDialog.DialogCode.Accepted:
for f in self.package_model.package.flights:
EventStream.put_nowait(GameUpdateEvents().new_flight(f))
self.package_model.update_tot()
self.package_changed.emit()
self.auto_create_button.setDisabled(True)
def on_change_name(self) -> None:
self.package_model.package.custom_name = self.package_name_text.text()

View File

@ -11,6 +11,8 @@ from PySide6.QtWidgets import (
QMessageBox,
QPushButton,
QVBoxLayout,
QCheckBox,
QSpinBox,
)
from qt_ui import liberation_install, liberation_theme
@ -40,6 +42,14 @@ class QLiberationPreferences(QFrame):
self.themeSelect = QComboBox()
[self.themeSelect.addItem(y["themeName"]) for x, y in THEMES.items()]
preference = liberation_install.prefer_liberation_payloads()
self.prefer_liberation_payloads = preference if preference else False
self.payloads_cb = QCheckBox()
self.payloads_cb.setChecked(self.prefer_liberation_payloads)
self.port = liberation_install.server_port()
self.port_input = QSpinBox()
self.initUi()
def initUi(self):
@ -73,6 +83,25 @@ class QLiberationPreferences(QFrame):
layout.addWidget(self.themeSelect, 4, 1, alignment=Qt.AlignmentFlag.AlignRight)
self.themeSelect.setCurrentIndex(get_theme_index())
layout.addWidget(
QLabel("<strong>Prefer custom Liberation payloads:</strong>"),
5,
0,
alignment=Qt.AlignmentFlag.AlignLeft,
)
layout.addWidget(self.payloads_cb, 5, 1, alignment=Qt.AlignmentFlag.AlignRight)
layout.addWidget(
QLabel("<strong>Server port (restart required):</strong>"),
6,
0,
alignment=Qt.AlignmentFlag.AlignLeft,
)
layout.addWidget(self.port_input, 6, 1, alignment=Qt.AlignmentFlag.AlignRight)
self.port_input.setRange(1, 2**16 - 1)
self.port_input.setValue(self.port)
self.port_input.setStyleSheet("QSpinBox{ width: 50 }")
main_layout.addLayout(layout)
main_layout.addStretch()
@ -98,6 +127,8 @@ class QLiberationPreferences(QFrame):
print("Applying changes")
self.saved_game_dir = self.edit_saved_game_dir.text()
self.dcs_install_dir = self.edit_dcs_install_dir.text()
self.prefer_liberation_payloads = self.payloads_cb.isChecked()
self.port = self.port_input.value()
set_theme_index(self.themeSelect.currentIndex())
if not os.path.isdir(self.saved_game_dir):
@ -153,7 +184,12 @@ class QLiberationPreferences(QFrame):
error_dialog.exec_()
return False
liberation_install.setup(self.saved_game_dir, self.dcs_install_dir)
liberation_install.setup(
self.saved_game_dir,
self.dcs_install_dir,
self.prefer_liberation_payloads,
self.port,
)
liberation_install.save_config()
liberation_theme.save_theme_config()
return True

View File

@ -10,7 +10,7 @@ click==8.1.7
colorama==0.4.6
distlib==0.3.8
Faker==22.6.0
fastapi==0.109.1
fastapi==0.109.2
filelock==3.13.1
h11==0.14.0
httptools==0.6.1
@ -32,15 +32,15 @@ pluggy==1.4.0
pre-commit==3.6.0
pydantic==2.6.0
pydantic-settings==2.1.0
-e git+https://github.com/dcs-retribution/pydcs@0bcdeecb4bd9032878b4dbf6fedac5a951429e26#egg=pydcs
-e git+https://github.com/dcs-retribution/pydcs@353f5b177dd406122a83e8572fd6ca54adf84389#egg=pydcs
pyinstaller==5.13.2
pyinstaller-hooks-contrib==2024.0
pyparsing==3.1.1
pyproj==3.6.1
pyshp==2.3.1
PySide6==6.6.1
PySide6-Addons==6.6.1
PySide6-Essentials==6.6.1
PySide6==6.4.3
PySide6-Addons==6.4.3
PySide6-Essentials==6.4.3
pytest==8.0.0
pytest-cov==4.1.0
python-dateutil==2.8.2
@ -48,10 +48,10 @@ python-dotenv==1.0.1
pywin32-ctypes==0.2.2
PyYAML==6.0.1
Shapely==2.0.2
shiboken6==6.6.1
shiboken6==6.4.3
six==1.16.0
sniffio==1.3.0
starlette==0.35.1
starlette==0.36.3
suntime==1.2.5
tabulate==0.9.0
text-unidecode==1.3

View File

@ -7,7 +7,7 @@ recommended_enemy_faction: China/Argentina Falklands Occupation Force
description: <p>Argentina and China have taken the Falklands by surprise. Currently on the East Coast of the United States for training, an Invicible-class carrier is steaming down to the South Atlantic to retake the islands, with the help of the United States Carrier Group. A beachhead has been established on the small air base of San Julian where the USAF has parked a small number of F-15Es and F-16 to assist. <p>Retake the Falklands, and proceed inland to neutralize the enemy.</p></p><p><b>Author's notes</b><br/>For this campaign, you can use UK Harrier and Apache skins, and Argentine JF-17 and Mirage Skins. Original campaign Gran Polvorin by Fuzzle.</p>
miz: RetakeTheFalklands.miz
performance: 2
recommended_start_date: 2005-06-15
recommended_start_date: 2002-12-21
version: "10.7"
squadrons:
# Off-map spawn

View File

@ -1,11 +1,11 @@
---
name: Syria - WRL - Assault on Damascus (v1.1) #1.0 - Original Release / #1.1 - Player F15e added
name: Syria - WRL - Assault on Damascus (v1.2) #1.0 - Original Release / #1.1 - Player F15e added / #1.2 - IADS ADDED & Massive Overhaul, Added C130 spawn support at main airbase
theater: Syria
authors: HolyOrangeJuice
recommended_player_faction: WRL - Task Force Blue
recommended_enemy_faction: WRL - Task Force Red
recommended_start_date: 2022-06-04
description: "<p>This mission was modified by HolyOrangeJuice [OscarJuliet] for the WRL Group. Join us for weekly PVE events. <a style=\"color: white\" href=\"https://werunliberation.com\">werunliberation.com</a></p><p>Original Battle for Golan Heights by Khopa.</p><p>This modified campaign does not represent any historical time period or events. Attack from Ramat-David and eliminate the enemy around Damascus.</p><p>All WRL Campaigns use high budget and high income to focus on the PVE goals to eliminate the enemy. Use lower starting money and income for increased difficulty.</p>"
description: "<p>This campaign is the gold standard of WRL campaigns. This campaign will always have the latest retribution additions. Consider this a feature complete campaign as it progresses through updates. Play Battle 4 Gerogia as a beginner mission. Play this one for an advanced experience</p><p>This mission was heavily modified by HolyOrangeJuice [OscarJuliet] for the WRL Group. Join us for weekly PVE events. <a style=\"color: white\" href=\"https://werunliberation.com\">werunliberation.com</a></p><p>Original Battle for Golan Heights by Khopa.</p><p>This modified campaign does not represent any historical time period or events. Attack from Ramat-David and eliminate the enemy around Damascus.</p><p>All WRL Campaigns use high budget and high income to focus on the PVE goals to eliminate the enemy. Use lower starting money and income for increased difficulty.</p>"
miz: WRL_AssaultonDamascus.miz
performance: 2
version: "10.7" #CTLD Zones Added
@ -13,9 +13,102 @@ recommended_player_money: 5000
recommended_enemy_money: 2000
recommended_player_income_multiplier: 5.0
recommended_enemy_income_multiplier: 1.0
advanced_iads: false
settings:
max_frontline_width: 30
advanced_iads: true # Campaign has connection_nodes / power_sources / command_centers
iads_config:
#REDFOR DEFENSE MARJ AIRBASE AREA
- M-COMMAND-1:
- M-POWER-1
- M-POWER-2
- M-TOWER-1
- M-TOWER-2
- M-EWR-1:
- M-POWER-1
- M-TOWER-1
- M-EWR-2:
- M-POWER-1
- M-TOWER-1
- M-EWR-3:
- M-POWER-2
- M-TOWER-2
- M-SAM-1:
- M-POWER-1
- M-TOWER-1
- M-SAM-2:
- M-POWER-1
- M-TOWER-1
- M-SAM-3:
- M-POWER-2
- M-TOWER-2
- M-SAM-4:
- M-POWER-2
- M-TOWER-2
- M-SAM-5:
- M-POWER-2
- M-TOWER-2
- M-SAM-6:
- M-POWER-2
- M-TOWER-2
#REDFOR DEFENSE DAMASCUS AIRBASE AREA
- D-COMMAND-1:
- D-POWER-1
- D-POWER-2
- D-TOWER-1
- D-TOWER-2
- D-EWR-1:
- D-POWER-1
- D-TOWER-1
- D-EWR-2:
- D-POWER-2
- D-TOWER-2
- D-EWR-3:
- D-POWER-2
- D-TOWER-2
- D-SAM-1:
- D-POWER-1
- D-TOWER-1
- D-SAM-2:
- D-POWER-2
- D-TOWER-2
- D-SAM-3:
- D-POWER-1
- D-TOWER-1
- D-SAM-4:
- D-POWER-2
- D-TOWER-2
#REDFOR DEFENSE AL-DUMAYR AIRBASE AREA
- A-COMMAND-1:
- A-POWER-1
- A-TOWER-1
- A-EWR-1:
- A-POWER-1
- A-TOWER-1
- A-EWR-2:
- A-POWER-1
- A-TOWER-1
- A-SAM-1:
- A-POWER-1
- A-TOWER-1
- A-SAM-2:
- A-POWER-1
- A-TOWER-1
#BLUEFOR RAMAT DEFENSE
- R-COMMAND-1:
- R-POWER-1
- R-TOWER-1
- RAMAT1:
- R-POWER-1
- R-TOWER-1
- RAMAT2:
- R-POWER-1
- R-TOWER-1
- RAMAT3:
- R-POWER-1
- R-TOWER-1
- RAMAT4:
- R-POWER-1
- R-TOWER-1
squadrons:
CVN-74 John Stennis:
- primary: BARCAP
@ -75,7 +168,12 @@ squadrons:
secondary: any
aircraft:
- F-117A Nighthawk
size: 5
size: 8
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 16
# Ramat-David
30:
- primary: BAI
@ -108,88 +206,103 @@ squadrons:
aircraft:
- AV-8B Harrier II Night Attack
size: 16
# Golan South
# Golan South:
# Golan North
Golan North:
- primary: BAI
secondary: air-to-ground
aircraft:
- A Company, 1-211th ARB #AH-64D Apache Longbow
size: 10
size: 8
- primary: BAI
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 10
size: 8
- primary: BAI
secondary: air-to-ground
aircraft:
- Ka-50 Hokum III
size: 10
size: 8
- primary: Transport
secondary: air-to-ground
aircraft:
- HMLA-169 (UH-1H) #UH-1H Iroquois
size: 8
# Golan South
Golan South:
- primary: BAI
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
size: 4
- primary: BAI
secondary: air-to-ground
aircraft:
- SA 342M Gazelle
size: 4
size: 8
- primary: Transport
secondary: any
aircraft:
- HMLA-169 (UH-1H) #UH-1H Iroquois
size: 4
- primary: Transport
secondary: any
secondary: air-to-ground
aircraft:
- Mi-8MTV2 Hip
size: 4
# Marj Ruhayyil
23:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-21bis Fishbed-N
size: 16
# Al-Dumayr
9:
- primary: BARCAP
secondary: any
aircraft:
- Su-27 Flanker-B
size: 16
# Khalkhalah
18:
- primary: BARCAP
secondary: any
aircraft:
- MiG-23MLD Flogger-K
size: 16
size: 8
# Damascus
7:
- primary: BARCAP
secondary: any
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 16
size: 12
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 16
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 16
size: 12
# Marj Ruhayyil
# 23:
# Al-Dumayr
# 9:
# Khalkhalah
# 18:
# MEZZEH
# 25:
# FOB ALPHA
# FOB ALPHA:
# FOB BRAVO
# FOB BRAVO:
# MARJ AS SULTAN SOUTH
# 8:
# MARJ AS SULTAN NORTH
# 22:
# QABR AS SITT
# 29:
ground_forces:
KHALK1: SA-11
KHALK2: SA-2/S-75
DAMASCUS1: SA-11
DUMAYR1: SA-2/S-75
DUMAYR2: SA-2/S-75
DUMAYR3: SA-10/S-300PS
M-SAM-1: SA-11
M-SAM-2: SA-11
M-SAM-3: SA-2/S-75
M-SAM-4: SA-3/S-125
M-SAM-5: SA-3/S-125
M-SAM-6: SA-3/S-125
M-SHORAD-1: SA-15 SHORAD
# M-AAA-1:
D-SAM-1: SA-2/S-75
D-SAM-2: SA-2/S-75
D-SAM-3: SA-6
D-SAM-4: SA-3/S-125
D-SHORAD-1: SA-15 SHORAD
# D-AAA-1:
K-SHORAD-1: SA-15 SHORAD
# K-AAA-1:
FOB-SHORAD-1: SA-15 SHORAD
# FOB-AAA-1:
A-SHORAD-1: SA-15 SHORAD
RAMAT1: Patriot
RAMAT2: Hawk
RAMAT3: Patriot
RAMAT2: Patriot
RAMAT3: NASAMS AIM-120C
RAMAT4: NASAMS AIM-120C
GSOUTH1: NASAMS AIM-120C
GSOUTH2: Hawk
GSOUTH2: NASAMS AIM-120C
GNORTH1: NASAMS AIM-120C

View File

@ -1,28 +1,25 @@
---
name: Syria - WRL - Battle For Syria North (1.0) #1.0 Release with Player F15e
name: Syria - WRL - Battle For Syria North (v1.2) #1.2 Complete Mission Overhaul - Frontlines Removed - CTLD or C130s are expected for base capture / Consider victory by destroying all airbases.
theater: Syria
authors: HolyOrangeJuice
description: "<p>This mission was modified by HolyOrangeJuice [OscarJuliet] for the WRL Group. Original Mission by Sith1144. Join us for weekly PVE events. <a style=\"color: white\" href=\"https://werunliberation.com\">werunliberation.com</a></p><p>This modification of the mission is not meant to represent historical accuracy. An exciting battle on the Northern part of the Syria map.</p><p>All WRL Campaigns use high budget and high income to focus on the PVE goals to eliminate the enemy. Use lower starting money and income for increased difficulty</p>"
description: "<p>This mission was heavily modified by HolyOrangeJuice [OscarJuliet] for the WRL Group. Original Mission by Sith1144. Join us for weekly PVE events. <a style=\"color: white\" href=\"https://werunliberation.com\">werunliberation.com</a></p><p>This modification of the mission is not meant to represent historical accuracy. An exciting battle on the Northern part of the Syria map.</p><p>All WRL Campaigns use high budget and high income to focus on the PVE goals to eliminate the enemy. Use lower starting money and income for increased difficulty</p>"
recommended_player_faction: WRL - Task Force Blue
recommended_enemy_faction: WRL - Task Force Red
recommended_start_date: 2019-06-04
miz: WRL_Battle4SyriaNorth.miz
performance: 2
version: "10.7" #No CTLD zones, campaign is too large for CTLD focus
version: "10.7" #CTLD ZONES ADDED
recommended_player_money: 5000
recommended_enemy_money: 2000
recommended_player_income_multiplier: 5.0
recommended_enemy_income_multiplier: 1.0
advanced_iads: true # Campaign has connection_nodes / power_sources / command_centers
#IADS: EWR and C2 get power generators. batteries have their own generators.
advanced_iads: true
iads_config:
# NATO IADS
#EWRs
- NATO EWR-1:
- NATO IADS Command
- NATO EWR:
- NATO IADS Command
# SAMs
- NATO SAM:
- NATO IADS Command
- NATO SAM-1:
@ -39,202 +36,129 @@ iads_config:
- NATO IADS Command
- NATO SAM-7:
- NATO IADS Command
# Yellow defense zone (Gaziantep-Minakh)
#EWRs
- YellowEWRN: #mountainrange (north)
- YellowPPW
- YellowControlN
- YellowEWRS: #mountainrange (center)
- YellowPPW
- YellowControlW
- YellowEWRC: # internal
- HamidiyeControl
- GaziantepControl
- GaziantepPP
- GaziantepAirControl:
- GaziantepControl
- GaziantepPP
# The air defense barrier behind the mountains
- YellowBarrierN:
- YellowControlN
- YellowBarrierC1:
- YellowControlW
- YellowBarrierC2:
- YellowControlW
- YellowBarrierS:
- YellowControlW
- YellowBarrierAAA:
- YellowControlW
# the central long range SAM and its point defenses
- YellowLongRangeSAMPointDefense:
- HamidiyeControl
- YellowLongRangeSAM:
- HamidiyeControl
- YellowLongRangeSAMAAA:
- HamidiyeControl
# the defenses around Gaziantep airfield
- GAZSAMN:
- GaziantepControl
- GAZSAMW:
- GaziantepControl
# the defenses around Minakh airfield
- MinakhSAM1:
- MinakhControl
- MinakhSAM2:
- MinakhControl
#C2 links
- YellowControlN:
- HamidiyeControl
- YellowControlW:
- HamidiyeControl
- YellowControlN
- YellowZoneCommand:
- GaziantepControl
- MinakhControl
- HamidiyeControl
- GaziantepPP
- GaziantepAirControl
# Green Defense Zone (HATAY)
# EWRs
- CoastalEWRN:
- HatayControl
- AntakyaPower
- CoastalEWRS:
- SamandagControl
- AntakyaPower
# The air defense barrier behind the mountains
- GreenBarrierSAM:
- SamandagControl
- GreenBarrierSAM-1:
- SamandagControl
- GreenBarrierSAM-2:
- HatayControl
- GreenBarrierSAM-3:
- HatayControl
- GreenBarrierSAM-4:
- HatayControl
# Coastal Defenses
- GreenSAM-2:
- SamandagControl
- GreenSAM-3:
- SamandagControl
- GreenSAM-4:
- SamandagControl
# Hatay Airfield
- HataySAM:
- HatayControl
- HataySAM-1:
- HatayControl
- HatayAAA:
- HatayControl
# Industrial/Command zone
- GreenSAM:
- IdlibControl
- GreenZoneCommand
- GreenSAM-2:
- IdlibControl
- GreenZoneCommand
# long range battery and defenses
- GreenZoneSAM:
- ReyhanliControl
- GreenZoneSAMDefense:
- ReyhanliControl
# C2 links
- GreenZoneCommand:
- IdlibControl
- IdlibPower
- SamandagControl
- HatayControl:
- ReyhanliControl
- SamandagControl
- AntakyaPower
- SamandagControl:
- AntakyaPower
- IdlibControl:
- ReyhanliControl
- SamandagControl
- IdlibPower
- ReyhanliControl:
- IdlibPower
# Pink zone (Aleppo)
# EWR
- Abu al-Duhur Air Control:
- Al Safira Power
- Aleppo Air Control:
- Aleppo Power
- Kuweires Air Control:
- Al Safira Power
- Aleppo Power
- Jirah Air Control:
- Al Safira Power
# Aleppo city defenses
- AleppoSAM:
- AleppoCommand
- Aleppo Control
- AleppoSAM-1:
- AleppoCommand
- Aleppo Control
- AleppoSAM-2:
- AleppoCommand
- Aleppo Control
- AleppoSAM-3:
- AleppoCommand
- Aleppo Control
- AleppoSAM-4:
- AleppoCommand
- Aleppo Control
- AleppoSAM-5:
- AleppoCommand
- Aleppo Control
- AleppoSAM-6:
- AleppoCommand
- Aleppo Control
- AleppoSAM-7:
- AleppoCommand
- Aleppo Control
# Long Range SAM
- Pink SAM:
- Al Safira Power
- Aleppo Control
- AlSafiraCommand
- AlSafiraPD:
- Aleppo Control
- AlSafiraCommand
# Abu al-Duhur
- AbuSAM:
- Abu al-Duhur control
- AbuSAM-1:
- Abu al-Duhur control
# Kuweires
- KuweiresSAM:
- KuweiresControl
# Jirah
- JirahSAM:
- JirahControl
- JirahSAM-1:
- JirahControl
- JirahSAM-2:
- JirahControl
# C2 links
- AleppoCommand:
- Aleppo Power
- Al Safira Power
- Aleppo Control
- AlSafiraCommand:
- Al Safira Power
- Aleppo Power
- Aleppo Control
- KuweiresControl:
- Al Safira Power
- Aleppo Control
- JirahControl:
- Al Safira Power
- KuweiresControl
- Abu al-Duhur control:
- Aleppo Power
- Aleppo Control
- Aleppo Control:
- Aleppo Power
#BLUE DEFENSE AREA - HINT: Go after the power stations
- B-COMMAND-1:
- B-POWER-1
- B-TOWER-1
- B-POWER-2
- B-TOWER-2
- B-SAM-1:
- B-POWER-1
- B-TOWER-1
- B-SAM-2:
- B-POWER-1
- B-TOWER-1
- B-SAM-3:
- B-POWER-1
- B-TOWER-1
- B-SAM-4:
- B-POWER-2
- B-TOWER-2
- B-SAM-5: #SA10
- B-POWER-2
- B-TOWER-2
- B-EWR-1:
- B-POWER-1
- B-TOWER-1
- B-EWR-2:
- B-POWER-1
- B-TOWER-1
#RED DEFENSE AREA - HINT: Go after the power stations
- R-COMMAND-1:
- R-POWER-1
- R-TOWER-1
- R-POWER-2
- R-TOWER-2
- R-SAM-1:
- R-POWER-1
- R-TOWER-1
- R-SAM-2:
- R-POWER-1
- R-TOWER-1
- R-SAM-3:
- R-POWER-1
- R-TOWER-1
- R-SAM-4:
- R-POWER-1
- R-TOWER-1
- R-SAM-5:
- R-POWER-1
- R-TOWER-1
- R-SAM-6:
- R-POWER-1
- R-TOWER-1
- R-SAM-7:
- R-POWER-1
- R-TOWER-1
- R-SAM-8:
- R-POWER-2
- R-TOWER-2
- R-SAM-9: #SA-10
- R-POWER-2
- R-TOWER-2
#YELLOW DEFNESE AREA - HINT: Go after the command bunkers
- Y-COMMAND-1:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-COMMAND-2:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-SAM-1:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-2:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-3:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-4:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-5:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-6:
- Y-POWER-1
- Y-TOWER-1
- Y-POWER-2
- Y-TOWER-2
- Y-SAM-7:
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-SAM-8:
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-SAM-9:
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-SAM-10:
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
- Y-SAM-11: #SA-5
- Y-POWER-2
- Y-TOWER-2
- Y-TOWER-3
squadrons:
#Incirlik
16:
@ -340,8 +264,8 @@ squadrons:
aircraft:
- Mi-8MTV2 Hip
size: 4
#carrier
Blue Carrier:
#NATO CARRIERS
NATO CVN:
- primary: BARCAP
secondary: any
aircraft:
@ -365,86 +289,88 @@ squadrons:
aircraft:
- S-3B Viking
size: 4
#Abu Al-Duhur
1:
- primary: BARCAP
secondary: any
aircraft:
- MiG-29S Fulcrum-C
size: 16
#Hatay
15:
- primary: SEAD
NATO LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 12
#Minakh
26:
- AV-8B Harrier II Night Attack
#Abu Al-Duhur
1:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 12
#Hatay
15:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 12
#Minakh
26:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-21bis Fishbed-N
size: 12
#Aleppo
27:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 16
- MiG-23MLD Flogger-K
size: 12
#Jirah
17:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-31 Foxhound
size: 16
- MiG-23MLD Flogger-K
size: 12
#Gaziantep
11:
- primary: BAI
secondary: air-to-ground
- primary: BARCAP
secondary: air-to-air
aircraft:
- Su-30 Flanker-C
- MiG-21bis Fishbed-N
size: 12
#Kuweires
31:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 12
ground_forces:
NATO SAM: Hawk
NATO SAM-1: Hawk
NATO SAM-2: Hawk
NATO SAM-3: Hawk
NATO SAM-4: Hawk
YellowBarrierN: SA-2/S-75 with ZSU-23/57
YellowBarrierC1: SA-6
YellowBarrierC2: SA-11
YellowBarrierS: SA-2/S-75 with ZSU-23/57
YellowLongRangeSAM: SA-2/S-75 with ZSU-23/57
GAZSAMN: SA-11
GreenBarrierSAM-4: SA-2/S-75 with ZSU-23/57
GreenBarrierSAM-3: SA-2/S-75 with ZSU-23/57
GreenZoneSAMDefense: SA-11
GreenZoneSAM: SA-2/S-75 with ZSU-23/57
HataySAM: SA-11
HataySAM-1: SA-2/S-75 with ZSU-23/57
GreenSAM-2: SA-3/S-125
GreenSAM-3: SA-6
GreenSAM-1: SA-2/S-75 with ZSU-23/57
JirahSAM: SA-10/S-300PS
JirahSAM-1: SA-11
JirahSAM-2: SA-2/S-75 with ZSU-23/57
KuweiresSAM: SA-6
Pink SAM: SA-11
AlSafiraPD: SA-15 SHORAD
AleppoSAM: SA-3/S-125
AleppoSAM-1: SA-3/S-125
AleppoSAM-2: SA-3/S-125
AleppoSAM-3: SA-3/S-125
AleppoSAM-4: SA-3/S-125
AleppoSAM-5: SA-6
AleppoSAM-6: SA-6
AleppoSAM-7: SA-11
MinakhSAM1: SA-3/S-125
MinakhSAM2: SA-3/S-125
GAZSAMN: SA-11
GAZSAMW: SA-3/S-125
AbuSAM: SA-2/S-75 with ZSU-23/57
AbuSAM-1: SA-15 SHORAD
B-SAM-1: SA-2/S-75
B-SAM-2: SA-11
B-SAM-3: SA-2/S-75
B-SAM-4: SA-2/S-75
B-SAM-5: SA-10/S-300PS
R-SAM-1: SA-2/S-75
R-SAM-2: SA-2/S-75
R-SAM-3: SA-11
R-SAM-4: SA-11
R-SAM-5: SA-6
R-SAM-6: SA-3/S-125
R-SAM-7: SA-6
R-SAM-8: SA-11
R-SAM-9: SA-10/S-300PS
Y-SAM-1: SA-6
Y-SAM-2: SA-3/S-125
Y-SAM-3: SA-6
Y-SAM-4: SA-3/S-125
Y-SAM-5: SA-6
Y-SAM-6: SA-3/S-125
Y-SAM-7: SA-11
Y-SAM-8: SA-2/S-75
Y-SAM-9: SA-2/S-75
Y-SAM-10: SA-2/S-75
Y-SAM-11: SA-10/S-300PS

Binary file not shown.

View File

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

View File

@ -1,152 +1,167 @@
---
name: Sinai - Exercise Bright Star
theater: Sinai
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Egypt 2010's
description: <p>For over 4 decades, the United States and Egypt have run a series of biannual joint military exercises called Bright Star. Over the years, the number of participating countries has grown substantially. Exercise Bright Star 2025 boasts 8 participant nations and 14 observer nations. The United States and a portion of the exercise coalition will play the part of a fictional hostile nation dubbed Orangeland, staging a mock invasion against Cairo. Israel, having for the first time accepted the invitation to observe, is hosting the aggressor faction of the exercise coalition at its airfields.</p>
miz: exercise_bright_star.miz
performance: 1
recommended_start_date: 2025-09-01
version: "10.7"
squadrons:
Blue CV-1:
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 2
- primary: Air Assault
secondary: any
aircraft:
- SH-60B Seahawk
size: 2
# Hatzerim (141)
7:
- primary: Escort
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 20
- primary: OCA/Runway
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 8
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
size: 8
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: BAI
secondary: any
aircraft:
- JF-17 Thunder
size: 16
- primary: BARCAP
secondary: any
aircraft:
- Mirage 2000C
size: 16
# Kedem
12:
- primary: Transport
aircraft:
- CH-47D
size: 20
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
size: 4
# Nevatim (106)
8:
- primary: AEW&C
aircraft:
- E-3A
size: 2
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
- primary: Refueling
aircraft:
- KC-135 Stratotanker MPRS
size: 1
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
# Melez (30)
5:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 4
- primary: TARCAP
secondary: air-to-air
aircraft:
- Mirage 2000C
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Mirage 2000C
size: 12
# Wadi al Jandali (72)
13:
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: SEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 4
- primary: OCA/Aircraft
secondary: air-to-ground
aircraft:
- SA 342L Gazelle
size: 4
# Cairo West (95)
18:
- primary: Transport
aircraft:
- C-130
size: 8
- primary: Escort
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 20
- primary: BARCAP
secondary: any
aircraft:
- J-7B
---
name: Sinai - Exercise Bright Star
theater: Sinai
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Egypt 2000
description:
<p>For over four decades, the United States and Egypt have conducted a series
of biannual joint military exercises known as Bright Star. As the
geopolitical landscape has transformed, so too has the scope and scale of
Exercise Bright Star. The exercise has grown over the years to incorporate
a wide array of international participants. The 2025 iteration of
Exercise Bright Star features eight participating nations alongside
fourteen observer nations.</p><p>
For the 2025 exercises, the United States, along with a select contingent
from the exercise coalition, will take on the role of a hypothetical
adversarial nation, dubbed Orangeland. This scenario is designed to
simulate a mock invasion against Cairo, and presents a valuable
opportunity for participating nations to refine their joint operational
capabilities and improve logistical and tactical interoperability</p><p>
A historic addition to Exercise Bright Star 2025 is the participation of
Israel as an observer nation. This marks a significant milestone, given
the complex historical relations in the region, and symbolises a step
forward in regional collaboration and military diplomacy. Israel's role,
hosting the aggressor faction of the exercise coalition at its airfields,
not only demonstrates the broadening scope of the exercise but also highlights
the value of fostering an environment of mutual cooperation and shared
security objectives.</p>
miz: exercise_bright_star.miz
performance: 1
recommended_start_date: 2025-09-01
version: "10.7"
squadrons:
Blue CV-1:
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: AEW&C
aircraft:
- E-2D Advanced Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 4
Bombers from RAF Fairford:
- primary: Anti-ship
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 8
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 8
# Hatzerim (141)
7:
- primary: Escort
secondary: any
aircraft:
- F-15C Eagle
size: 20
- primary: OCA/Runway
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 16
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: BAI
secondary: any
aircraft:
- JF-17 Thunder
size: 16
- primary: BARCAP
secondary: any
aircraft:
- Mirage 2000C
size: 12
# Kedem
12:
- primary: Transport
secondary: any
aircraft:
- CH-47D
size: 20
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 4
# Nevatim (106)
8:
- primary: AEW&C
aircraft:
- E-3A
size: 2
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 2
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
# Melez (30)
5:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 4
- primary: BAI
secondary: any
aircraft:
- Mirage 2000C
size: 12
- primary: Escort
secondary: any
aircraft:
- MiG-21bis Fishbed-N
size: 12
# Wadi al Jandali (72)
13:
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: SEAD
secondary: any
aircraft:
- F-4E Phantom II
size: 20
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: Air Assault
secondary: any
aircraft:
- Mi-24P Hind-F
size: 4
- primary: OCA/Aircraft
secondary: any
aircraft:
- SA 342L Gazelle
size: 4
# Cairo West (95)
18:
- primary: Transport
aircraft:
- C-130
size: 8
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 20

View File

@ -1,108 +1,127 @@
---
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.7"
squadrons:
# Tonopah Airport
17:
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (AI)
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: AEW&C
aircraft:
- E-3A
size: 1
# Tonopah Test Range
18:
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 10
- primary: DEAD
secondary: air-to-ground
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 24
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
size: 2
# Groom Lake
2:
- primary: Escort
secondary: air-to-air
aircraft:
- J-11A Flanker-L
size: 20
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 20
# Creech
Creech FARP:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 8
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 4
# Nellis AFB
4:
- primary: Strike
secondary: air-to-ground
aircraft:
- H-6J Badger
size: 20
- primary: AEW&C
aircraft:
- KJ-2000
size: 1
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 20
# Boulder City Airport
6:
- primary: SEAD Escort
secondary: any
aircraft:
- FC-1 Fierce Dragon
size: 20
---
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.7"
squadrons:
Bombers from Minot AFB:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 4
Bombers from Ellsworth AFB:
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 4
# Tonopah Airport
17:
- primary: TARCAP
secondary: any
aircraft:
- F-15C Eagle
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: AEW&C
aircraft:
- E-3A
size: 1
# Tonopah Test Range
18:
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 10
- primary: DEAD
secondary: air-to-ground
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 24
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-60L
- UH-60A
size: 2
# Groom Lake
2:
- primary: Escort
secondary: air-to-air
aircraft:
- J-11A Flanker-L
size: 20
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 20
# Creech
1:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 8
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 4
# Nellis AFB
4:
- primary: Strike
secondary: air-to-ground
aircraft:
- H-6J Badger
size: 20
- primary: AEW&C
aircraft:
- KJ-2000
size: 1
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 20
# Boulder City Airport
6:
- primary: SEAD Escort
secondary: any
aircraft:
- FC-1 Fierce Dragon
size: 20

View File

@ -1,119 +1,136 @@
---
name: Normandy - The Final Countdown II
theater: Normandy
authors: Starfire
recommended_player_faction: D-Day Allied Forces 1944 and 1990
recommended_enemy_faction: Germany 1944
description:
<p>While enroute to the Persian Gulf for Operation Desert Shield, the USS Theodore Roosevelt and its carrier strike group are engufled by an electrical vortex and transported through time and space to the English channel on the morning of the Normandy Landings - June 6th 1944. Seeking to reduce the cost in lives to the Allied Forces about to storm the beaches, the captain of the Roosevelt has elected to provide air support for the landings.</p><p><strong>Note:</strong> This campaign has a custom faction that combines modern US naval forces with WW2 Allied forces. To play it as intended, you should carefully ration your use of modern aircraft and not replenish them if shot down (as you cannot get new Tomcats and Hornets in 1944). You can also choose to play it as a purely WW2 campaign by switching to one of the WW2 Ally factions.</p>
miz: final_countdown_2.miz
performance: 2
recommended_start_date: 1944-06-06
version: "10.7"
squadrons:
#Blue CV (90)
Blue-CV:
- primary: TARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 24
- primary: DEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 2
- primary: Air Assault
secondary: any
aircraft:
- SH-60B Seahawk
size: 4
#Stoney Cross (39)
58:
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- A-20G Havoc
- Boston Mk.III
size: 20
#Needs Oar Point (55)
28:
- primary: BARCAP
secondary: any
aircraft:
- Spitfire LF Mk IX
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- MosquitoFBMkVI
size: 20
#RAF Grafton Underwood (1000)
From RAF Grafton Underwood:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-17G Flying Fortress
- Fortress Mk.III
size: 20
#Lymington (56)
37:
- primary: Escort
secondary: any
aircraft:
- P-51D-30-NA Mustang
- Mustang Mk.IV (Late)
size: 20
- primary: BAI
secondary: any
aircraft:
- P-47D-40 Thunderbolt
- Thunderbolt Mk.II (Late)
size: 20
#Carpiquet (47)
19:
- primary: TARCAP
secondary: air-to-air
aircraft:
- Fw 190 D-9 Dora
size: 12
- primary: CAS
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 8
#Broglie (32)
68:
- primary: Escort
secondary: any
aircraft:
- Bf 109 K-4 Kurfürst
size: 24
#Saint-Andre-de-lEure (30)
70:
- primary: BAI
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 12
#Vilacoublay (76)
42:
- primary: BARCAP
secondary: any
aircraft:
- Fw 190 A-8 Anton
size: 20
---
name: Normandy - The Final Countdown II
theater: Normandy
authors: Starfire
recommended_player_faction: D-Day Allied Forces 1944 and 1990
recommended_enemy_faction: Germany 1944
description:
<p>While enroute to the Persian Gulf for Operation Desert Shield, the USS
Theodore Roosevelt and its carrier strike group are engufled by an electrical
vortex and transported through time and space to the English channel on the
morning of the Normandy Landings - June 6th 1944. Seeking to reduce the cost
in lives to the Allied Forces about to storm the beaches, the captain of the
Roosevelt has elected to provide air support for the
landings.</p><p><strong>Note:</strong> This campaign has a custom faction that
combines modern US naval forces with WW2 Allied forces. To play it as
intended, you should carefully ration your use of modern aircraft and not
replenish them if shot down (as you cannot get new Tomcats and Hornets in
1944). You can also choose to play it as a purely WW2 campaign by switching to
one of the WW2 Ally factions.</p>
miz: final_countdown_2.miz
performance: 2
recommended_start_date: 1944-06-06
version: "10.7"
squadrons:
#Blue CV (90)
Blue-CV:
- primary: TARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 24
- primary: DEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 24
- primary: CAS
secondary: air-to-ground
aircraft:
- S-3B Viking
size: 12
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 2
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 6
#Stoney Cross (39)
58:
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- A-20G Havoc
- Boston Mk.III
size: 20
#Needs Oar Point (55)
28:
- primary: BARCAP
secondary: any
aircraft:
- Spitfire LF Mk IX
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- MosquitoFBMkVI
size: 20
#RAF Grafton Underwood (1000)
Bombers from RAF Grafton Underwood:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-17G Flying Fortress
- Fortress Mk.III
size: 20
#Lymington (56)
37:
- primary: Escort
secondary: any
aircraft:
- P-51D-30-NA Mustang
- Mustang Mk.IV (Late)
size: 20
- primary: BAI
secondary: any
aircraft:
- P-47D-40 Thunderbolt
- Thunderbolt Mk.II (Late)
size: 20
#Carpiquet (47)
19:
- primary: TARCAP
secondary: air-to-air
aircraft:
- Fw 190 D-9 Dora
size: 12
- primary: CAS
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 8
#Broglie (32)
68:
- primary: Escort
secondary: any
aircraft:
- Bf 109 K-4 Kurfürst
size: 24
#Saint-Andre-de-lEure (30)
70:
- primary: BAI
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Ju 88 A-4
size: 12
#Vilacoublay (76)
42:
- primary: BARCAP
secondary: any
aircraft:
- Fw 190 A-8 Anton
size: 20

View File

@ -1,149 +1,155 @@
---
name: Falklands - Operation Grabthar's Hammer
theater: Falklands
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010
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: 1999-12-25
version: "10.7"
squadrons:
#Mount Pleasant
2:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 16
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 12
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
#San Julian
11:
- primary: BAI
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (AI)
- F-15E Strike Eagle (Suite 4+)
size: 8
- primary: Air Assault
secondary: any
aircraft:
- UH-1H Iroquois
size: 1
#Blue CV
Blue-CV:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 20
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 32
- primary: Escort
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 32
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 1
- primary: Refueling
aircraft:
- S-3B Tanker
size: 3
- primary: Air Assault
secondary: any
aircraft:
- SH-60B Seahawk
size: 2
# Blue LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 18
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
size: 2
#El Calafate
14:
- primary: Transport
aircraft:
- Mi-8MTV2 Hip
size: 10
#Rio Gallegros
5:
- primary: BARCAP
secondary: air-to-air
aircraft:
- Su-27 Flanker-B
size: 12
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 12
#Punta Arenas
9:
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 16
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 16
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
size: 16
- primary: Refueling
aircraft:
- IL-78M
size: 2
#Ushuaia
7:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 8
#Ushuaia Helo Port
8:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
---
name: Falklands - Operation Grabthar's Hammer
theater: Falklands
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010
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
Ushuaia for use in its ongoing conflict with Chile. United States military
forces have established a foothold at San Julian. While the SoW are distracted
up north, it is up to the Marines to launch an assault upon Ushuaia from an LHA
in order to disable the bomb production facility. Fortunately, Ushuaia is
lightly defended as the SoW are trying to avoid unwanted attention.</p>
miz: grabthars_hammer.miz
performance: 2
recommended_start_date: 1999-12-25
version: "10.7"
squadrons:
#Mount Pleasant
2:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 8
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: Escort
secondary: any
aircraft:
- F-15C Eagle
size: 8
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 2
#San Julian
11:
- primary: BAI
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 8
#Blue CV
Blue-CV:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 20
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 40
- primary: DEAD
secondary: air-to-ground
aircraft:
- S-3B Viking
size: 20
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 4
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 4
# Blue LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 18
- primary: Air Assault
secondary: any
aircraft:
- UH-1H Iroquois
size: 2
Bombers from Edwards AFB:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 12
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 12
#El Calafate
14:
- primary: Transport
aircraft:
- Mi-8MTV2 Hip
size: 10
#Rio Gallegros
5:
- primary: Escort
secondary: air-to-air
aircraft:
- Su-27 Flanker-B
size: 12
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 12
#Punta Arenas
9:
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 16
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 16
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
size: 16
- primary: Refueling
aircraft:
- IL-78M
size: 2
#Ushuaia
7:
- primary: CAS
secondary: air-to-ground
aircraft:
- Ka-50 Hokum (Blackshark 3)
size: 8
#Ushuaia Helo Port
8:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 8

Binary file not shown.

View File

@ -0,0 +1,100 @@
---
name: Syria - Operation Aegean Aegis
theater: Syria
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Turkey 2005
description:
<p><strong>Note:</strong> This fictional campaign was designed for the Apache
and Harrier. It requires manual flight planning. While enemy aircraft are present
at airfields, there will be no enemy flights as their aircraft are grounded.</p>
<p>
In a sudden and alarming escalation of tensions in Cyprus, the Anatolian Order,
a North Cypriot insurgent faction, has carried out a bold night-time assault on
three crucial airfields in the Republic of Cyprus; Paphos, Akrotiri, and Larnaca.
The insurgents, equipped with stolen surplus Turkish military hardware, used
chemical weapons in their attack, forcing the evacuation of all three airfields.
Notably, the capture of Akrotiri, a British Overseas Territory hosting a Royal
Air Force base, has drawn significant international attention and concern.</p>
<p>
The EU has strongly condemned this unprovoked attack against one of its member
states. Turkey, despite its historical connections with North Cyprus, has also
denounced the Anatolian Order's actions and is investigating how its aircraft,
ground vehicles, and weaponry held in storage ended up in insurgent hands.</p>
<p>
Amidst the crisis, a lone US Navy LHA, strategically positioned in the Aegean Sea,
is preparing a response to the crisis. Its mission is to deploy Apache helicopters
to neutralise the hastily erected air defenses around the captured airfields, before
Harrier jumpjets neutralise the Anatolian Order's aircraft. These aircraft, a
selection of mothballed Turkish F-4s and helicopters, are currently grounded due to
lack of suitable fuel and spare parts. It is imperative that they are dealt with
swiftly before ground troops are air-lifted in to reclaim the airfields.</p>
<p>
The operation's final phase involves targeting North Cyprus's only airport at Ercan.
The plan is to bomb its runway, preventing any further airborne reinforcements by the
insurgents. However, due to the air defenses established along the northern edge of
the Green Line (the UN-patrolled demilitarised zone) there are strict advisories against
overflying North Cyprus unless absolutely necessary, to minimise the risk of losses.
</p>
miz: operation_aegean_aegis.miz
performance: 1
recommended_start_date: 2017-04-20
recommended_player_money: 1000
recommended_enemy_money: 0
recommended_player_income_multiplier: 1.0
recommended_enemy_income_multiplier: 0.0
version: "10.7"
squadrons:
#Tarawa Class LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 12
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 6
- primary: Air Assault
secondary: any
aircraft:
- UH-1H Iroquois
size: 2
#Paphos
46:
- primary: DEAD
secondary: air-to-ground
aircraft:
- F-4E Phantom II
size: 12
#Akrotiri
44:
- primary: BAI
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
size: 4
- primary: CAS
secondary: air-to-ground
aircraft:
- OH-58D Kiowa Warrior
size: 4
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-60A
size: 4
#Larnaca
47:
- primary: Transport
aircraft:
- C-130
size: 6
#Ercan
49:
- primary: Transport
aircraft:
- CH-47D
size: 6

View File

@ -1,146 +1,147 @@
---
name: Persian Gulf - Operation Noisy Cricket
theater: Persian Gulf
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Iran 2015
description:
<p>In the face of mounting sanctions against their nuclear program, Iran has
barred all shipping from transiting the Strait of Hormuz. Three days ago, the
Iranian Vice-President ordered a series of missile attacks on commercial
vessels entering the Gulf of Oman through the highly strategic chokepoint,
sinking a container ship and damaging two oil tankers. Operation Noisy Cricket
is the American response to this threat to regional stability. The objective
is to render inoperative Iran's array of coastal anti-ship missile sites, as
well as disable the airfields from which maritime strike aircraft could be
launched.</p><p>While officially intended only to deter any further attempts
to disrupt the flow of maritime traffic and and protect the interests of the
global economy, The USAF will also leverage the resultant degradation in
Iranian air defences to launch a deep strike from airfields in the UAE in an
attempt to take out Iran's last combat-worthy F-14 Tomcats, currently
stationed at Kerman. At the same time, a carrier-based Marine detachment will
be inserted via helicopter to conduct an unscheduled inspection of the Bushehr
Nuclear Power Plant, in order to verify Iran's compliance with international
nuclear agreements and gather evidence of any ongoing nuclear weapons
development.</p>
miz: operation_noisy_cricket.miz
performance: 1
recommended_start_date: 2019-07-13
recommended_player_money: 0
recommended_enemy_money: 0
recommended_player_income_multiplier: 0.2
recommended_enemy_income_multiplier: 0.2
version: "10.9"
squadrons:
Blue CV-1:
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 40
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 4
- primary: Air Assault
secondary: any
aircraft:
- SH-60B Seahawk
size: 4
#Al Minhad AFB (61)
12:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 32
- primary: Escort
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 24
#Al Dhafra AFB (251)
4:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 4
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
- primary: OCA/Runway
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 8
- primary: BAI
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
size: 12
#Bandar Abbas Intl (51)
2:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-4E Phantom II
size: 20
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-5E Tiger II
size: 16
#Qeshm Island (12)
13:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 12
#Abu Musa Island (8)
1:
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 8
#Kish Intl (46)
24:
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK Fencer-D
size: 20
- primary: Escort
secondary: any
aircraft:
- Mirage-F1EQ
size: 16
#Shiraz Intl (122)
19:
- primary: Transport
aircraft:
- IL-76MD
size: 5
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
size: 12
#Kerman
18:
- primary: AEW&C
aircraft:
- A-50
size: 1
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-14A Tomcat (Block 135-GR Late)
size: 10
---
name: Persian Gulf - Operation Noisy Cricket
theater: Persian Gulf
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Iran 2015
description:
<p>In the face of mounting sanctions against their nuclear program, Iran has
barred all shipping from transiting the Strait of Hormuz. Three days ago, the
Iranian Vice-President ordered a series of missile attacks on commercial
vessels entering the Gulf of Oman through the highly strategic chokepoint,
sinking a container ship and damaging two oil tankers. Operation Noisy Cricket
is the American response to this threat to regional stability. The objective
is to render inoperative Iran's array of coastal anti-ship missile sites, as
well as disable the airfields from which maritime strike aircraft could be
launched.</p><p>While officially intended only to deter any further attempts
to disrupt the flow of maritime traffic and and protect the interests of the
global economy, The USAF will also leverage the resultant degradation in
Iranian air defences to launch a deep strike from airfields in the UAE in an
attempt to take out Iran's last combat-worthy F-14 Tomcats, currently
stationed at Kerman. At the same time, a carrier-based Marine detachment will
be inserted via helicopter to conduct an unscheduled inspection of the Bushehr
Nuclear Power Plant, in order to verify Iran's compliance with international
nuclear agreements and gather evidence of any ongoing nuclear weapons
development.</p>
miz: operation_noisy_cricket.miz
performance: 1
recommended_start_date: 2019-07-13
recommended_player_money: 0
recommended_enemy_money: 0
recommended_player_income_multiplier: 0.2
recommended_enemy_income_multiplier: 0.2
version: "10.7"
squadrons:
Blue CV-1:
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 40
- primary: AEW&C
aircraft:
- E-2D Advanced Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 4
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 4
#Al Minhad AFB (61)
12:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 32
- primary: Escort
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 24
#Al Dhafra AFB (251)
4:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 4
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
- primary: OCA/Runway
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 20
#Bandar Abbas Intl (51)
2:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-4E Phantom II
size: 20
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-5E Tiger II
size: 16
#Qeshm Island (12)
13:
- primary: Air Assault
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 12
#Abu Musa Island (8)
1:
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 8
#Kish Intl (46)
24:
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK Fencer-D
size: 20
- primary: Escort
secondary: any
aircraft:
- Mirage-F1EQ
size: 16
#Shiraz Intl (122)
19:
- primary: Transport
aircraft:
- IL-76MD
size: 5
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
size: 12
#Kerman
18:
- primary: AEW&C
aircraft:
- A-50
size: 1
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-14A Tomcat (Block 135-GR Late)
size: 10

View File

@ -1,132 +1,160 @@
---
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.7"
squadrons:
# Ramat David
30:
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 20
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (AI)
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: AEW&C
aircraft:
- E-3A
size: 2
# King Hussein Air College
19:
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 20
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 8
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 12
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 8
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 2
- primary: Air Assault
secondary: air-to-ground
aircraft:
- UH-1H Iroquois
size: 2
# Damascus
7:
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-4E Phantom II
- Mirage-F1EQ
size: 12
- primary: BAI
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
- Su-25 Frogfoot
size: 12
- primary: CAS
secondary: air-to-ground
aircraft:
- OH-58D Kiowa Warrior
- Mi-24P Hind-F
size: 8
# Tiyas
39:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- Su-24M Fencer-D
size: 20
# Abu Al Duhur
1:
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- H-6J Badger
size: 20
# Gaziantep
11:
- primary: BARCAP
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- MiG-29A Fulcrum-A
size: 12
# Incirlik
16:
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- Tu-22M3 Backfire-C
size: 20
- primary: AEW&C
aircraft:
- E-3A
- A-50
size: 2
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- IL-78M
size: 2
- primary: Transport
aircraft:
- C-130
- IL-76MD
size: 4
---
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: 2
recommended_start_date: 2019-12-23
version: "10.7"
squadrons:
Blue CV-1:
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 40
- primary: BAI
secondary: air-to-ground
aircraft:
- S-3B Viking
size: 20
- primary: AEW&C
aircraft:
- E-2D Advanced Hawkeye
size: 4
- primary: Refueling
aircraft:
- S-3B Tanker
size: 4
Bombers from RAF Fairford:
- primary: DEAD
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 8
# Akrotiri
44:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 8
- primary: OCA/Runway
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
size: 20
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 4
# Ramat David
30:
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 28
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 4
# Damascus
7:
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- H-6J Badger
size: 16
- primary: BAI
secondary: air-to-ground
aircraft:
- AH-1W SuperCobra
- Su-25 Frogfoot
size: 16
- primary: CAS
secondary: air-to-ground
aircraft:
- OH-58D Kiowa Warrior
- Mi-24P Hind-F
size: 4
# Tiyas
39:
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- Su-24M Fencer-D
size: 16
- primary: Escort
secondary: air-to-air
aircraft:
- F-4E Phantom II
- Mirage-F1EQ
size: 16
# Abu Al Duhur
1:
- primary: Fighter sweep
secondary: air-to-air
aircraft:
- F-4E Phantom II
- MiG-23ML Flogger-G
size: 8
# Gaziantep
11:
- primary: BARCAP
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- MiG-29A Fulcrum-A
size: 8
# Incirlik
16:
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- Tu-22M3 Backfire-C
size: 16
- primary: AEW&C
aircraft:
- E-3A
- A-50
size: 1
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- IL-78M
size: 1
- primary: Escort
secondary: any
aircraft:
- F-4E Phantom II
- MiG-21bis Fishbed-N
size: 16

View File

@ -1,148 +1,156 @@
---
name: Caucasus - Operation Vectron's Claw
theater: Caucasus
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010
description: <p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut off from friendly forces by Russian troops backing the separatist state. The UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and troops at the Zugdidi Sector HQ will have to make a run for the coast, supported by offshore US naval aircraft. The contingent is aware that their best shot at survival is to swiftly retake Sukhumi before Russian forces have a chance to dig in, so that friendly ground forces can land and reinforce them.</p><p><strong>Note:</strong> Ground unit purchase will not be available past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi with at least one surviving ground unit to capture it. Two Hueys are available at Zugdidi for some close air support. The player can either play the first leg of the scenario as an evacuation with a couple of light vehicles (e.g. Humvees) set on breakthrough (modifying waypoints in the mission editor so they are not charging head-on into enemy ground forces is suggested), or purchase heavier ground units if they wish to experience a more traditional frontline ground war. Once Sukhumi has been captured, squadrons based in Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn point.</p>
miz: operation_vectrons_claw.miz
performance: 1
recommended_start_date: 2008-08-08
version: "10.7"
squadrons:
Blue CV-1:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 20
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 32
- primary: Escort
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 32
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 1
- primary: Refueling
aircraft:
- S-3B Tanker
size: 3
- primary: Air Assault
secondary: any
aircraft:
- SH-60B Seahawk
size: 2
Blue LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 20
From Incirlik:
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 8
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 6
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 16
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 16
- primary: BAI
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (AI)
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 8
- primary: Strike
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 8
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
#FARPs
UNOMIG Sector HQ:
- primary: Transport
secondary: any
aircraft:
- UH-1H Iroquois
size: 2
Dzhugba:
- primary: CAS
secondary: any
aircraft:
- Mi-24P Hind-F
size: 8
#Sukhumi-Babushara
20:
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 8
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 12
#Sochi-Adler
18:
- primary: Escort
secondary: air-to-air
aircraft:
- Su-27 Flanker-B
size: 8
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 20
#Anapa-Vityazevo
12:
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-95MS Bear-H
size: 16
Red CV:
- primary: BARCAP
secondary: any
aircraft:
- SU-33 Flanker-D
size: 18
#I am aware there is no Russian LHA. This is just for campaign inversion.
Red LHA:
- primary: BAI
secondary: air-to-ground
size: 20
---
name: Caucasus - Operation Vectron's Claw
theater: Caucasus
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010
description:
<p><strong>Background</strong> - The United Nations Observer Mission in Georgia (UNOMIG) has been actively monitoring the ceasefire agreement between Georgia and its breakaway region of Abkhazia. Recent developments have escalated tensions in the area, leading to a precarious situation for UN observers and affiliated personnel.
</p><p><strong>Current Situation</strong> - UNOMIG observers, along with a contingent of international troops, have found themselves isolated due to the intervention of Russian forces supporting the separatist ambitions of Abkhazia. The UNOMIG headquarters located in Sukhumi has fallen into enemy hands. A smaller group based at the Zugdidi Sector Headquarters now faces the daunting task of navigating to safety with the aid of offshore naval air support.
</p><p><strong>Objective</strong> - The immediate goal is to orchestrate a strategic withdrawal of UN forces to the coastline, leveraging support from US naval aircraft positioned offshore. The critical mission objective is the rapid recapture of Sukhumi. This action is essential to enable the landing of friendly ground forces and the ferrying in of land-based sqwuadrons from Incirlik.
</p><p><strong>Operational Constraints</strong> - It is crucial to note that reinforcement of ground units will not be possible until Sukhumi is successfully recaptured. This recapture can either be performed using existing UN personnel and ground vehicles, or via heliborne assault troop insertion.
</p><p><strong>Assets & Support</strong> - Available assets include two Huey helicopters for close air support. Commanders may opt to initiate the operation with light vehicles, such as Humvees, employing breakthrough tactics to avoid direct confrontations with enemy forces. Alternatively, the use of heavier ground units is an option for commanders seeking a more conventional combat engagement. Upon the recapture of Sukhumi, additional squadrons from Incirlik, Turkey, will become operational.
</p><p><strong>Secondary Objective</strong> - Consider prioritising the capture of the Batumi airfield, located to the south, for its strategic value as a forward operating base. Commanders should be aware of the inherent risks, as the airfield is relatively small and lacks air defence systems, posing a significant threat to any stationed aircraft.</p>
miz: operation_vectrons_claw.miz
performance: 1
recommended_start_date: 2008-08-08
version: "10.7"
control_points:
Squadrons from Incirlik:
ferry_only: true
squadrons:
Blue CV-1:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
size: 16
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 60
- primary: CAS
secondary: air-to-ground
aircraft:
- S-3B Viking
size: 8
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
- primary: Refueling
aircraft:
- S-3B Tanker
size: 2
- primary: Air Assault
secondary: any
aircraft:
- UH-60L
- UH-60A
size: 2
Blue LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
size: 20
Squadrons from Incirlik:
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
size: 4
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 6
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
size: 16
- primary: BAI
secondary: any
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 8
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 1
Bombers from RAF Fairford:
- primary: Anti-ship
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 4
Bombers from Base Aérea de Morón:
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 4
#FARPs
UNOMIG Sector HQ:
- primary: Transport
secondary: any
aircraft:
- UH-1H Iroquois
size: 2
Dzhugba:
- primary: CAS
secondary: any
aircraft:
- Mi-24P Hind-F
size: 4
#Sukhumi-Babushara
20:
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29S Fulcrum-C
size: 8
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 12
#Sochi-Adler
18:
- primary: Escort
secondary: air-to-air
aircraft:
- Su-27 Flanker-B
size: 8
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
size: 20
- primary: DEAD
secondary: air-to-ground
aircraft:
- Su-34 Fullback
size: 20
#Maykop-Khanskaya
16:
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
size: 20
#Anapa-Vityazevo
12:
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-95MS Bear-H
size: 16
Red CV:
- primary: BARCAP
secondary: any
aircraft:
- SU-33 Flanker-D
size: 16

Binary file not shown.

View File

@ -0,0 +1,99 @@
---
name: Marianas - Operation Velvet Thunder
theater: MarianaIslands
authors: Starfire
recommended_player_faction: USA 1970
recommended_enemy_faction: NVA 1970
description:
<p>Operation Velvet Thunder is a high-intensity training exercise designed to
prepare fresh troops for the challenges they will face in Vietnam. The dense
jungle and rugged terrain of the Mariana Islands will provide a realistic
backdrop, allowing our forces to hone essential skills in jungle warfare,
unconventional tactics, and counterinsurgency operations. There are multiple
checkpoints scattered across the area of operations that will have to be
captured by Air Assault. Due to the limited size and availability of LZs, it
is vital to pay close attention to where you designate troop drop off zones.
</p><p><strong>Note:</strong> This campaign is intended to be played with the
A-4 Skyhawk and OV-10a aircraft mods active. The C-101CC has also been included
as a stand-in for the Cessna A-37 Dragonfly in order to provide a CAS platform
of roughly equivalent combat capability. This campaign will be updated to use
Heatblur's F-4 Phantom II once it is in early access.</p>
miz: operation_velvet_thunder.miz
performance: 1
recommended_start_date: 1970-11-29
version: "10.7"
settings:
a4_skyhawk: true
f4bc_phantom: true
ov10a_bronco: true
squadrons:
#Andersen AFB
6:
- primary: Escort
secondary: any
aircraft:
- F-5E Tiger II
size: 8
- primary: BAI
secondary: any
aircraft:
- C-101CC Aviojet
size: 8
- primary: CAS
secondary: any
aircraft:
- OV-10A Bronco
size: 8
- primary: SEAD
secondary: any
aircraft:
- F-4C Phantom II
- F-4E Phantom II
size: 8
- primary: Strike
secondary: any
aircraft:
- B-52H Stratofortress
size: 4
- primary: Air Assault
secondary: any
aircraft:
- UH-1H Iroquois
size: 4
- primary: Transport
secondary: any
aircraft:
- CH-47D
size: 4
#Blue CV
Blue-CV:
- primary: DEAD
secondary: any
aircraft:
- A-4E Skyhawk
size: 16
- primary: AEW&C
aircraft:
- E-2C Hawkeye
size: 2
#Rota Intl
1:
- primary: TARCAP
secondary: any
aircraft:
- MiG-19P Farmer-B
size: 8
#Tinian Intl
3:
- primary: Air Assault
secondary: any
aircraft:
- Mi-8MTV2 Hip
size: 4
#Saipan Intl
2:
- primary: BAI
secondary: any
aircraft:
- MiG-21bis Fishbed-N
size: 8

View File

@ -14,6 +14,8 @@ recommended_player_money: 2000
recommended_enemy_money: 1000
recommended_player_income_multiplier: 1.5
recommended_enemy_income_multiplier: 0.7
settings:
airbase_threat_range: 300
squadrons:
#BLUFOR CVN
Naval-3:

View File

@ -2,30 +2,6 @@ local unitPayloads = {
["name"] = "AH-64D_BLK_II",
["payloads"] = {
[1] = {
["name"] = "Retribution CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 31,
},
},
[2] = {
["displayName"] = "Retribution BAI",
["name"] = "Retribution BAI",
["pylons"] = {
@ -45,12 +21,16 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[3] = {
[2] = {
["name"] = "Retribution OCA/Aircraft",
["pylons"] = {
[1] = {
@ -69,14 +49,46 @@ local unitPayloads = {
["CLSID"] = "{M261_M229}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[3] = {
["name"] = "Retribution CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[4] = {
["displayName"] = "Retribution Escort",
["name"] = "Retribution Escort",
["displayName"] = "Retribution DEAD",
["name"] = "Retribution DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{M299_4xAGM_114L}",
@ -94,6 +106,39 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[5] = {
["displayName"] = "Retribution Escort",
["name"] = "Retribution Escort",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,

View File

@ -2,84 +2,81 @@ local unitPayloads = {
["name"] = "B-52H",
["payloads"] = {
[1] = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "{46ACDCF8-5451-4E26-BDDB-E78D5830E93C}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 30,
},
},
[2] = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 3,
},
},
["tasks"] = {
[1] = 32,
[2] = 34,
},
},
[3] = {
["name"] = "SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{8DCAF3A3-7FCF-41B8-BB88-58DEDA878EDE}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 33,
},
},
[4] = {
["name"] = "CAP",
["pylons"] = {
},
["tasks"] = {
},
},
[5] = {
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 1,
},
},
["tasks"] = {
},
},
[6] = {
["displayName"] = "Retribution OCA/Runway",
["name"] = "Retribution OCA/Runway",
["pylons"] = {
[1] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 1,
["CLSID"] = "{585D626E-7F42-4073-AB70-41E728C333E2}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{696CFFC4-0BDE-42A8-BE4B-0BE3D9DD723C}",
["num"] = 3,
["CLSID"] = "{6C47D097-83FF-4FB2-9496-EAB36DDF0B05}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{585D626E-7F42-4073-AB70-41E728C333E2}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[2] = {
["name"] = "Retribution DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{45447F82-01B5-4029-A572-9AAD28AF0275}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{8DCAF3A3-7FCF-41B8-BB88-58DEDA878EDE}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{45447F82-01B5-4029-A572-9AAD28AF0275}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[3] = {
["displayName"] = "Retribution Anti-ship",
["name"] = "Retribution Anti-ship",
["pylons"] = {
[1] = {
["CLSID"] = "{HSAB-6xAGM-84}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{HSAB-6xAGM-84}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
},
},
[4] = {
["displayName"] = "Retribution Strike",
["name"] = "Retribution Strike",
["pylons"] = {
[1] = {
["CLSID"] = "{585D626E-7F42-4073-AB70-41E728C333E2}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{6C47D097-83FF-4FB2-9496-EAB36DDF0B05}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{585D626E-7F42-4073-AB70-41E728C333E2}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 32,
[2] = 34,
},
},
},

View File

@ -2,133 +2,127 @@ local unitPayloads = {
["name"] = "Ka-50",
["payloads"] = {
[1] = {
["name"] = "CAS",
["name"] = "Retribution CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 1,
["num"] = 4,
},
[2] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 2,
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["CLSID"] = "B_8V20A_OFP2",
["num"] = 3,
},
[4] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 4,
["CLSID"] = "B_8V20A_OFP2",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
[3] = 18,
},
},
[2] = {
["name"] = "CAP",
["displayName"] = "Retribution BAI",
["name"] = "Retribution BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 1,
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 4,
},
[2] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 2,
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["CLSID"] = "B_8V20A_OFP2",
["num"] = 3,
},
[4] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 4,
["CLSID"] = "B_8V20A_OFP2",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
[3] = 18,
},
},
[3] = {
["name"] = "SEAD",
["displayName"] = "Retribution DEAD",
["name"] = "Retribution DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
["num"] = 4,
},
[2] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 2,
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 4,
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
[3] = 18,
},
},
[4] = {
["name"] = "ANTISHIP",
["displayName"] = "Retribution OCA/Aircraft",
["name"] = "Retribution OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 4,
},
[2] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 2,
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 4,
["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
[3] = 18,
},
},
[5] = {
["name"] = "STRIKE",
["displayName"] = "Retribution Escort",
["name"] = "Retribution Escort",
["pylons"] = {
[1] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 1,
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 4,
},
[2] = {
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 2,
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["num"] = 4,
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
[3] = 18,
},
},
},

View File

@ -2,7 +2,7 @@ local unitPayloads = {
["name"] = "Ka-50_3",
["payloads"] = {
[1] = {
["name"] = "CAS",
["name"] = "Retribution CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{9S846_2xIGLA}",
@ -34,8 +34,8 @@ local unitPayloads = {
},
},
[2] = {
["displayName"] = "STRIKE",
["name"] = "STRIKE",
["displayName"] = "Retribution BAI",
["name"] = "Retribution BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{9S846_2xIGLA}",
@ -54,20 +54,86 @@ local unitPayloads = {
["num"] = 1,
},
[5] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["CLSID"] = "B_8V20A_OFP2",
["num"] = 3,
},
[6] = {
["CLSID"] = "{37DCC01E-9E02-432F-B61D-10C166CA2798}",
["CLSID"] = "B_8V20A_OFP2",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
[2] = 32,
},
},
[3] = {
["displayName"] = "Retribution OCA/Aircraft",
["name"] = "Retribution OCA/Aircraft",
["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,
},
},
[4] = {
["displayName"] = "Retribution DEAD",
["name"] = "Retribution DEAD",
["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,
},
},
[5] = {
["displayName"] = "Retribution Escort",
["name"] = "Retribution Escort",
["pylons"] = {
[1] = {
@ -79,19 +145,19 @@ local unitPayloads = {
["num"] = 5,
},
[3] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 4,
},
[4] = {
["CLSID"] = "{A6FD14D3-6D30-4C85-88A7-8D17BEE120E2}",
["CLSID"] = "{6DADF342-D4BA-4D8A-B081-BA928C4AF86D}",
["num"] = 1,
},
[5] = {
["CLSID"] = "B_8V20A_OFP2",
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 3,
},
[6] = {
["CLSID"] = "B_8V20A_OFP2",
["CLSID"] = "{FC56DF80-9B09-44C5-8976-DCFAFF219062}",
["num"] = 2,
},
},

View File

@ -1,168 +1,174 @@
local unitPayloads = {
["name"] = "S-3B",
["payloads"] = {
[1] = {
["name"] = "SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 29,
},
},
[2] = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 30,
},
},
[3] = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 32,
[1] = 33,
},
},
[4] = {
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{A76344EB-32D2-4532-8FA2-0C1BDC00747E}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{A76344EB-32D2-4532-8FA2-0C1BDC00747E}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
},
[5] = {
["name"] = "RUNWAY_ATTACK",
["pylons"] = {
[1] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 1,
},
[2] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 34,
},
},
["unitType"] = "S-3B",
}
return unitPayloads
local unitPayloads = {
["name"] = "S-3B",
["payloads"] = {
[1] = {
["displayName"] = "Retribution OCA/Aircraft",
["name"] = "Retribution OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{B83CB620-5BBE-4BEA-910C-EB605A327EF9}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{B83CB620-5BBE-4BEA-910C-EB605A327EF9}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 4,
},
[6] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 30,
},
},
[2] = {
["displayName"] = "Retribution DEAD",
["name"] = "Retribution DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{AF42E6DF-9A60-46D8-A9A0-1708B241AADB}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 30,
},
},
[3] = {
["displayName"] = "Retribution Anti-ship",
["name"] = "Retribution Anti-ship",
["pylons"] = {
[1] = {
["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{8B7CADF9-4954-46B3-8CFB-93F2F5B90B03}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 30,
},
},
[4] = {
["name"] = "Retribution CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{444BA8AE-82A7-4345-842E-76154EFCCA46}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 3,
},
[5] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 4,
},
[6] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 5,
},
},
["tasks"] = {
[1] = 30,
},
},
[5] = {
["displayName"] = "Retribution BAI",
["name"] = "Retribution BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{69DC8AE7-8F77-427B-B8AA-B19D3F478B66}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 5,
},
[4] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 3,
},
[6] = {
["CLSID"] = "{ADD3FAE1-EBF6-4EF9-8EFC-B36B5DDF1E6B}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 30,
},
},
[6] = {
["displayName"] = "Retribution Strike",
["name"] = "Retribution Strike",
["pylons"] = {
[1] = {
["CLSID"] = "{60CC734F-0AFA-4E2E-82B8-93B941AB11CF}",
["num"] = 6,
},
[2] = {
["CLSID"] = "{60CC734F-0AFA-4E2E-82B8-93B941AB11CF}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 5,
},
[4] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 3,
},
[6] = {
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 30,
},
},
},
["tasks"] = {
},
["unitType"] = "S-3B",
}
return unitPayloads

View File

@ -21,6 +21,7 @@
"S-3B Viking",
"F/A-18C Hornet (Lot 20)",
"F-14B Tomcat",
"F-14A Tomcat (Block 135-GR Late)",
"UH-1H Iroquois",
"B-1B Lancer"

View File

@ -0,0 +1,96 @@
{
"country": "Egypt",
"name": "Egypt 2000",
"authors": "Starfire",
"description": "<p>Egyptian military in the 21st century.</p>",
"locales": [
"ar_SA"
],
"aircrafts": [
"MiG-29S Fulcrum-C",
"MiG-21bis Fishbed-N",
"Mirage 2000C",
"F-4E Phantom II",
"F-16CM Fighting Falcon (Block 50)",
"IL-76MD",
"C-130",
"C-130J-30 Super Hercules",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"SA 342L Gazelle",
"SA 342M Gazelle",
"CH-47D",
"Ka-50 Hokum",
"Ka-50 Hokum (Blackshark 3)",
"Mi-24V Hind-E",
"Mi-24P Hind-F",
"Mi-8MTV2 Hip"
],
"awacs": [
"E-2C Hawkeye"
],
"frontline_units": [
"M1A2 Abrams",
"M60A3 \"Patton\"",
"T-90A",
"T-55A",
"BMP-1",
"M113",
"BTR-80",
"M1043 HMMWV (M2 HMG)",
"M1045 HMMWV (BGM-71 TOW)",
"M1097 Heavy HMMWV Avenger",
"ZSU-23-4 Shilka",
"M163 Vulcan Air Defense System"
],
"artillery_units": [
"M109A6 Paladin",
"M270 Multiple Launch Rocket System"
],
"logistics_units": [
"Truck Ural-375",
"Truck Ural-4320T",
"Truck GAZ-66"
],
"infantry_units": [
"Infantry RPG",
"Infantry AK-74 Rus",
"MANPADS SA-18 Igla \"Grouse\"",
"MANPADS Stinger",
"Mortar 2B11 120mm",
"Paratrooper AKS",
"Paratrooper RPG-16"
],
"preset_groups": [
"SA-2/S-75",
"SA-6",
"SA-17",
"SA-10/S-300PS",
"SA-23/S-300VM",
"Patriot",
"Hawk"
],
"naval_units": [
"FFG Oliver Hazard Perry",
"Corvette 1241.1 Molniya",
"FAC La Combattante IIa"
],
"missiles": [
"SSM SS-1C Scud-B"
],
"air_defense_units": [
"EWR AN/FPS-117 Radar",
"EWR 55G6",
"M1097 Heavy HMMWV Avenger",
"M48 Chaparral",
"M163 Vulcan Air Defense System",
"SA-9 Strela",
"SA-15 Tor",
"ZSU-23-4 Shilka",
"AAA ZU-23 Closed Emplacement",
"ZU-23 on Ural-375",
"ZSU-57-2 'Sparka'"
],
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper"
}

View File

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

View File

@ -0,0 +1,55 @@
{
"country": "Vietnam",
"name": "NVA 1970",
"authors": "Starfire",
"description": "<p>North Vietnamese Army during the Vietnam War from 1965 to 1975</p>",
"locales": [
"vi_Vn"
],
"aircrafts": [
"Mi-8MTV2 Hip",
"MiG-19P Farmer-B",
"MiG-21bis Fishbed-N"
],
"awacs": [],
"tankers": [],
"frontline_units": [
"T-55A",
"PT-76",
"M2A1 Half-Track",
"Grad MRL FDDM (FC)"
],
"artillery_units": [
"BM-21 Grad"
],
"logistics_units": [
"LUV UAZ-469 Jeep",
"Truck Ural-375"
],
"infantry_units": [
"Infantry AK-74 Rus",
"Infantry RPG"
],
"missiles": [],
"preset_groups": [
"SA-2/S-75",
"SA-3/S-125",
"KS-19/SON-9",
"Cold-War-Flak"
],
"naval_units": [
"Boat Armed Hi-speed",
"Boat Schnellboot type S130"
],
"air_defense_units": [
"SAM P19 \"Flat Face\" SR (SA-2/3)",
"S-60 57mm",
"8.8 cm Flak 18",
"ZSU-57-2 'Sparka'",
"AAA ZU-23 Emplacement",
"ZU-23 on Ural-375",
"ZSU-23-4 Shilka"
],
"requirements": {},
"doctrine": "coldwar"
}

View File

@ -1,120 +1,121 @@
{
"country": "China",
"name": "Redfor (China) 2010",
"authors": "Robert Peary",
"description": "<p>Combined Redfor under China's leadership in the late 2000s, early 2010s.</p>",
"aircrafts": [
"FC-1 Fierce Dragon",
"IL-76MD",
"J-11A Flanker-L",
"J-15 Flanker X-2",
"J-7B",
"Ka-50 Hokum",
"L-39ZA Albatros",
"Mi-24V Hind-E",
"Mi-24P Hind-F",
"Mi-28N Havoc",
"Mi-8MTV2 Hip",
"MiG-29S Fulcrum-C",
"MiG-31 Foxhound",
"Su-24M Fencer-D",
"Su-25 Frogfoot",
"Su-25T Frogfoot",
"Su-27 Flanker-B",
"Su-30MKK Flanker-G",
"Su-34 Fullback",
"Tu-22M3 Backfire-C",
"H-6J Badger"
],
"awacs": [
"KJ-2000"
],
"tankers": [
"IL-78M"
],
"frontline_units": [
"BMP-1",
"BMP-2",
"BMP-3",
"BTR-80",
"BTR-82A",
"HQ-7 Launcher",
"SA-19 Grison (2K22 Tunguska)",
"T-55A",
"T-72B3 model 2011",
"T-80UD",
"T-90A",
"Type 04A (ZBD-04A)",
"Type 96B (ZTZ-96B)"
],
"artillery_units": [
"2S19 Msta-S",
"2S9 Nona-S",
"BM-27 Uragan",
"BM-30 Smerch (9M55K5 HE Rockets)"
],
"logistics_units": [
"LUV UAZ-469 Jeep",
"Truck Ural-375"
],
"infantry_units": [
"Infantry AK-74 Rus",
"MANPADS SA-18 Igla \"Grouse\"",
"Mortar 2B11 120mm",
"Paratrooper AKS",
"Paratrooper RPG-16"
],
"missiles": [],
"preset_groups": [
"SA-2/S-75",
"HQ-2",
"SA-6",
"SA-11",
"HQ-7",
"SA-10/S-300PS",
"SA-10B/S-300PS",
"SA-17",
"SA-12/S-300V",
"SA-20/S-300PMU-1",
"SA-20B/S-300PMU-2",
"SA-23/S-300VM",
"Chinese Navy"
],
"naval_units": [
"Frigate 1135M Rezky",
"Type 052B Destroyer",
"Type 052C Destroyer",
"Corvette 1241.1 Molniya",
"Type 054A Frigate",
"CV 1143.5 Admiral Kuznetsov",
"Type 071 Amphibious Transport Dock"
],
"air_defense_units": [
"EWR 1L13",
"EWR 55G6",
"SAM SA-8 Osa \"Gecko\" TEL",
"SA-9 Strela",
"SA-13 Gopher (9K35 Strela-10M3)",
"SA-15 Tor",
"SA-19 Grison (2K22 Tunguska)",
"AAA ZU-23 Closed Emplacement",
"ZU-23 on Ural-375",
"ZSU-23-4 Shilka"
],
"carrier_names": [
"001 Liaoning",
"002 Shandong"
],
"helicopter_carrier_names": [
"Kunlun Shan",
"Jinggang Shan",
"Changbai Shan",
"Yimeng Shan",
"Longhu Shan",
"Wuzhi Shan",
"Wudang Shan"
],
"requirements": {},
"has_jtac": true,
"jtac_unit": "WingLoong-I"
{
"country": "China",
"name": "Redfor (China) 2010",
"authors": "Robert Peary",
"description": "<p>Combined Redfor under China's leadership in the late 2000s, early 2010s.</p>",
"aircrafts": [
"FC-1 Fierce Dragon",
"IL-76MD",
"J-11A Flanker-L",
"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",
"Mi-28N Havoc",
"Mi-8MTV2 Hip",
"MiG-29S Fulcrum-C",
"MiG-31 Foxhound",
"Su-24M Fencer-D",
"Su-25 Frogfoot",
"Su-25T Frogfoot",
"Su-27 Flanker-B",
"Su-30MKK Flanker-G",
"Su-34 Fullback",
"Tu-22M3 Backfire-C",
"H-6J Badger"
],
"awacs": [
"KJ-2000"
],
"tankers": [
"IL-78M"
],
"frontline_units": [
"BMP-1",
"BMP-2",
"BMP-3",
"BTR-80",
"BTR-82A",
"HQ-7 Launcher",
"SA-19 Grison (2K22 Tunguska)",
"T-55A",
"T-72B3 model 2011",
"T-80UD",
"T-90A",
"Type 04A (ZBD-04A)",
"Type 96B (ZTZ-96B)"
],
"artillery_units": [
"2S19 Msta-S",
"2S9 Nona-S",
"BM-27 Uragan",
"BM-30 Smerch (9M55K5 HE Rockets)"
],
"logistics_units": [
"LUV UAZ-469 Jeep",
"Truck Ural-375"
],
"infantry_units": [
"Infantry AK-74 Rus",
"MANPADS SA-18 Igla \"Grouse\"",
"Mortar 2B11 120mm",
"Paratrooper AKS",
"Paratrooper RPG-16"
],
"missiles": [],
"preset_groups": [
"SA-2/S-75",
"HQ-2",
"SA-6",
"SA-11",
"HQ-7",
"SA-10/S-300PS",
"SA-10B/S-300PS",
"SA-17",
"SA-12/S-300V",
"SA-20/S-300PMU-1",
"SA-20B/S-300PMU-2",
"SA-23/S-300VM",
"Chinese Navy"
],
"naval_units": [
"Frigate 1135M Rezky",
"Type 052B Destroyer",
"Type 052C Destroyer",
"Corvette 1241.1 Molniya",
"Type 054A Frigate",
"CV 1143.5 Admiral Kuznetsov",
"Type 071 Amphibious Transport Dock"
],
"air_defense_units": [
"EWR 1L13",
"EWR 55G6",
"SAM SA-8 Osa \"Gecko\" TEL",
"SA-9 Strela",
"SA-13 Gopher (9K35 Strela-10M3)",
"SA-15 Tor",
"SA-19 Grison (2K22 Tunguska)",
"AAA ZU-23 Closed Emplacement",
"ZU-23 on Ural-375",
"ZSU-23-4 Shilka"
],
"carrier_names": [
"001 Liaoning",
"002 Shandong"
],
"helicopter_carrier_names": [
"Kunlun Shan",
"Jinggang Shan",
"Changbai Shan",
"Yimeng Shan",
"Longhu Shan",
"Wuzhi Shan",
"Wudang Shan"
],
"requirements": {},
"has_jtac": true,
"jtac_unit": "WingLoong-I"
}

View File

@ -0,0 +1,71 @@
{
"country": "USA",
"name": "USA 1970",
"authors": "Starfire",
"description": "<p>US military during the Vietnam War from 1965 to 1975</p>",
"locales": [
"en_US"
],
"aircrafts": [
"F-14A Tomcat (Block 135-GR Late)",
"F-4C Phantom II",
"F-4B Phantom II",
"F-4E Phantom II",
"F-5E Tiger II",
"A-4E Skyhawk",
"OV-10A Bronco",
"C-101CC Aviojet",
"B-52H Stratofortress",
"C-47 Skytrain",
"C-130",
"UH-1H Iroquois",
"AH-1W SuperCobra",
"OH-58D Kiowa Warrior",
"CH-47D",
"CH-53E"
],
"awacs": [
"E-2C Hawkeye"
],
"tankers": [
"KC-130",
"KC-135 Stratotanker"
],
"frontline_units": [
"M113",
"M163 Vulcan Air Defense System",
"M60A3 \"Patton\""
],
"artillery_units": [
"M109A6 Paladin"
],
"logistics_units": [
"Truck M818 6x6",
"LARC-V"
],
"infantry_units": [
"Infantry M249",
"Infantry M4"
],
"missiles": [],
"preset_groups": [
"Hawk"
],
"naval_units": [
"FFG Oliver Hazard Perry",
"CV-59 Forrestal"
],
"air_defense_units": [
"SAM Hawk SR (AN/MPQ-50)",
"M163 Vulcan Air Defense System",
"M48 Chaparral"
],
"carrier_names": [
"CV-59 Forrestal",
"CV-60 Saratoga",
"CV-61 Ranger",
"CV-62 Independence"
],
"requirements": {},
"doctrine": "coldwar"
}

View File

@ -106,7 +106,6 @@
"UH-1H Iroquois"
],
"awacs": [
"E-2C Hawkeye",
"E-2D Advanced Hawkeye",
"E-3A"
],

View File

@ -1,5 +1,5 @@
{
"nameInUI": "DCS Dismounts",
"nameInUI": "DCS Dismounts (FPS-killer)",
"defaultValue": false,
"specificOptions": [
{

File diff suppressed because it is too large Load Diff

View File

@ -574,10 +574,12 @@ function onWpnEvent(event)
end
local player = event.initiator
targetName = event.target:getTypeName()
local targetName = event.target:getTypeName()
local impactPoint = event.target:getPosition().p
env.info(weapon.." hit "..targetName)
debugMsg(weapon.." hit "..targetName)
if weapon and targetName then
env.info(weapon.." hit "..targetName)
debugMsg(weapon.." hit "..targetName)
end
--env.info('Impact point was at: X: ' .. impactPoint.x .. ' Y: ' .. impactPoint.y .. ' Z: ' .. impactPoint.z)
if clusterWeaps[weapon] then
local ordnance = event.weapon

View File

@ -1,41 +1,42 @@
class: Helicopter
always_keeps_gun: true
lha_capable: true
cabin_size: 0 # Can not transport troops
can_carry_crates: false # Can not carry crates
description:
The legendary 'Apache' is an US twin-turboshaft attack helicopter for
a crew of two. It features a nose-mounted sensor suite for target acquisition and
night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried
between the main landing gear, under the aircraft's forward fuselage, and four hardpoints
mounted on stub-wing pylons for carrying armament and stores, typically a mixture
of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant
systems redundancy to improve combat survivability. American AH-64s have served
in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel
used the Apache in its military conflicts in Lebanon and the Gaza Strip. British
and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq.
introduced: 2003
manufacturer: Boeing
origin: USA
price: 20
role: Attack
variants:
AH-64D Apache Longbow: {}
radios:
# DCS uses the 2nd Radio AN/ARC-164 (UHF) as the main intra flight for the Apache
# so we use this Radio for Intra and Inter Flight for now
# The radio frequencies set in the mission editor are in the current state of Early
# access not used for radio presets. Only the flight frequency is used. Any other
# frequency has to be entered manually atm.
intra_flight: AN/ARC-186(V) AM
inter_flight: AN/ARC-164
channels:
type: common
namer: apache
intra_flight_radio_index: 1
inter_flight_radio_index: 2
tasks:
BAI: 510
CAS: 510
Escort: 100
OCA/Aircraft: 510
class: Helicopter
always_keeps_gun: true
lha_capable: true
cabin_size: 0 # Can not transport troops
can_carry_crates: false # Can not carry crates
description:
The legendary 'Apache' is an US twin-turboshaft attack helicopter for
a crew of two. It features a nose-mounted sensor suite for target acquisition and
night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried
between the main landing gear, under the aircraft's forward fuselage, and four hardpoints
mounted on stub-wing pylons for carrying armament and stores, typically a mixture
of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant
systems redundancy to improve combat survivability. American AH-64s have served
in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel
used the Apache in its military conflicts in Lebanon and the Gaza Strip. British
and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq.
introduced: 2003
manufacturer: Boeing
origin: USA
price: 20
role: Attack
variants:
AH-64D Apache Longbow: {}
radios:
# DCS uses the 2nd Radio AN/ARC-164 (UHF) as the main intra flight for the Apache
# so we use this Radio for Intra and Inter Flight for now
# The radio frequencies set in the mission editor are in the current state of Early
# access not used for radio presets. Only the flight frequency is used. Any other
# frequency has to be entered manually atm.
intra_flight: AN/ARC-186(V) AM
inter_flight: AN/ARC-164
channels:
type: common
namer: apache
intra_flight_radio_index: 1
inter_flight_radio_index: 2
tasks:
BAI: 510
CAS: 510
DEAD: 115
Escort: 100
OCA/Aircraft: 510

View File

@ -1,31 +1,32 @@
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: {}
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"
tasks:
BAI: 430
CAS: 430
Escort: 90
OCA/Aircraft: 430
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: {}
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"
tasks:
BAI: 430
CAS: 430
DEAD: 113
Escort: 90
OCA/Aircraft: 430

View File

@ -1,32 +1,33 @@
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. The Black Shark III can also carry A-A Igla missiles."
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 III: {}
Ka-50 Hokum (Blackshark 3): {} # for compatibility with Liberation
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"
tasks:
BAI: 440
CAS: 440
Escort: 100
OCA/Aircraft: 440
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. The Black Shark III can also carry A-A Igla missiles."
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 III: {}
Ka-50 Hokum (Blackshark 3): {} # for compatibility with Liberation
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"
tasks:
BAI: 440
CAS: 440
DEAD: 113
Escort: 100
OCA/Aircraft: 440

View File

@ -1,24 +1,27 @@
carrier_capable: true
description:
The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet
aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare.
In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial
refueling. The Viking also provided electronic warfare and surface surveillance
capabilities to a carrier battle group. A carrier-based, subsonic, all-weather,
long-range, multi-mission aircraft, it carried automated weapon systems and was
capable of extended missions with in-flight refueling. Because of its characteristic
sound, it was nicknamed the "War Hoover" after the vacuum cleaner brand. The S-3
was phased out from front-line fleet service aboard aircraft carriers in January
2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon,
Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet
introduced: 1984
manufacturer: Lockheed
origin: USA
price: 10
role: Carrier-based Attack
variants:
S-3B Viking: {}
tasks:
Anti-ship: 350
OCA/Aircraft: 330
Strike: 370
carrier_capable: true
description:
The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet
aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare.
In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial
refueling. The Viking also provided electronic warfare and surface surveillance
capabilities to a carrier battle group. A carrier-based, subsonic, all-weather,
long-range, multi-mission aircraft, it carried automated weapon systems and was
capable of extended missions with in-flight refueling. Because of its characteristic
sound, it was nicknamed the "War Hoover" after the vacuum cleaner brand. The S-3
was phased out from front-line fleet service aboard aircraft carriers in January
2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon,
Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet
introduced: 1984
manufacturer: Lockheed
origin: USA
price: 10
role: Carrier-based Attack
variants:
S-3B Viking: {}
tasks:
Anti-ship: 350
BAI: 570
CAS: 570
DEAD: 200
OCA/Aircraft: 330
Strike: 370