Add patrol configuration to unit data files.

This allows altitude/speed of AEW&C and tankers to be configured.
This commit is contained in:
Mike Jones 2021-06-21 18:29:21 +01:00 committed by Dan Albert
parent 30763b5401
commit a75688f89c
11 changed files with 59 additions and 43 deletions

View File

@ -29,7 +29,7 @@ from game.radio.channels import (
ViggenRadioChannelAllocator,
NoOpChannelAllocator,
)
from game.utils import Speed, kph
from game.utils import Distance, Speed, feet, kph, knots
if TYPE_CHECKING:
from gen.aircraft import FlightData
@ -90,12 +90,29 @@ class RadioConfig:
}[config.get("namer", "default")]
@dataclass(frozen=True)
class PatrolConfig:
altitude: Optional[Distance]
speed: Optional[Speed]
@classmethod
def from_data(cls, data: dict[str, Any]) -> PatrolConfig:
altitude = data.get("altitude", None)
speed = data.get("altitude", None)
return PatrolConfig(
feet(altitude) if altitude is not None else None,
knots(speed) if speed is not None else None,
)
@dataclass(frozen=True)
class AircraftType(UnitType[FlyingType]):
carrier_capable: bool
lha_capable: bool
always_keeps_gun: bool
max_group_size: int
patrol_altitude: Optional[Distance]
patrol_speed: Optional[Speed]
intra_flight_radio: Optional[Radio]
channel_allocator: Optional[RadioChannelAllocator]
channel_namer: Type[ChannelNamer]
@ -192,6 +209,7 @@ class AircraftType(UnitType[FlyingType]):
raise KeyError(f"Missing required price field: {data_path}") from ex
radio_config = RadioConfig.from_data(data.get("radios", {}))
patrol_config = PatrolConfig.from_data(data.get("patrol", {}))
try:
introduction = data["introduced"]
@ -214,6 +232,8 @@ class AircraftType(UnitType[FlyingType]):
lha_capable=data.get("lha_capable", False),
always_keeps_gun=data.get("always_keeps_gun", False),
max_group_size=data.get("max_group_size", aircraft.group_size_max),
patrol_altitude=patrol_config.altitude,
patrol_speed=patrol_config.speed,
intra_flight_radio=radio_config.intra_flight,
channel_allocator=radio_config.channel_allocator,
channel_namer=radio_config.channel_namer,

View File

@ -16,17 +16,6 @@ from functools import cached_property
from typing import Iterator, List, Optional, Set, TYPE_CHECKING, Tuple
from dcs.mapping import Point
from dcs.planes import (
E_3A,
E_2C,
A_50,
IL_78M,
KC130,
KC135MPRS,
KC_135,
KJ_2000,
S_3B_Tanker,
)
from dcs.unit import Unit
from shapely.geometry import Point as ShapelyPoint
@ -1092,15 +1081,8 @@ class FlightPlanBuilder:
orbit_location = self.aewc_orbit(location)
# As high as possible to maximize detection and on-station time.
if flight.unit_type.dcs_unit_type == E_2C:
patrol_alt = feet(30000)
elif flight.unit_type.dcs_unit_type == E_3A:
patrol_alt = feet(35000)
elif flight.unit_type.dcs_unit_type == A_50:
patrol_alt = feet(33000)
elif flight.unit_type.dcs_unit_type == KJ_2000:
patrol_alt = feet(40000)
if flight.unit_type.patrol_altitude is not None:
patrol_alt = flight.unit_type.patrol_altitude
else:
patrol_alt = feet(25000)
@ -1680,31 +1662,17 @@ class FlightPlanBuilder:
builder = WaypointBuilder(flight, self.game, self.is_player)
tanker_type = flight.unit_type
if tanker_type.dcs_unit_type is KC_135:
# ~300 knots IAS.
speed = knots(445)
altitude = feet(24000)
elif tanker_type.dcs_unit_type is KC135MPRS:
# ~300 knots IAS.
speed = knots(440)
altitude = feet(23000)
elif tanker_type.dcs_unit_type is KC130:
# ~210 knots IAS, roughly the max for the KC-130 at altitude.
speed = knots(370)
altitude = feet(22000)
elif tanker_type.dcs_unit_type is S_3B_Tanker:
# ~265 knots IAS.
speed = knots(320)
altitude = feet(12000)
elif tanker_type.dcs_unit_type is IL_78M:
# ~280 knots IAS.
speed = knots(400)
altitude = feet(21000)
if tanker_type.patrol_altitude is not None:
altitude = tanker_type.patrol_altitude
else:
# ~280 knots IAS.
speed = knots(400)
altitude = feet(21000)
if tanker_type.patrol_speed is not None:
speed = tanker_type.patrol_speed
else:
# ~280 knots IAS at 21000.
speed = knots(400)
racetrack = builder.race_track(racetrack_start, racetrack_end, altitude)
return RefuelingFlightPlan(

View File

@ -1,5 +1,7 @@
description: The A-50 is an AWACS plane.
max_group_size: 1
price: 50
patrol:
altitude: 33000
variants:
A-50: null

View File

@ -8,5 +8,7 @@ manufacturer: Northrop Grumman
origin: USA
price: 50
role: AEW&C
patrol:
altitude: 30000
variants:
E-2C Hawkeye: {}

View File

@ -1,5 +1,7 @@
description: The E-3A is a AWACS aicraft.
price: 50
max_group_size: 1
patrol:
altitude: 35000
variants:
E-3A: null

View File

@ -1,4 +1,8 @@
price: 20
max_group_size: 1
patrol:
# ~280 knots IAS.
speed: 400
altitude: 21000
variants:
IL-78M: null

View File

@ -8,5 +8,9 @@ manufacturer: Beoing
origin: USA
price: 25
role: Tanker
patrol:
# ~300 knots IAS.
speed: 445
altitude: 24000
variants:
KC-135 Stratotanker: {}

View File

@ -5,5 +5,9 @@ manufacturer: Lockheed Martin
origin: USA
price: 25
role: Tanker
patrol:
# ~210 knots IAS, roughly the max for the KC-130 at altitude.
speed: 370
altitude: 22000
variants:
KC-130: {}

View File

@ -7,5 +7,9 @@ manufacturer: Boeing
origin: USA
price: 25
role: Tanker
patrol:
# 300 knots IAS.
speed: 440
altitude: 23000
variants:
KC-135 Stratotanker MPRS: {}

View File

@ -1,3 +1,5 @@
price: 50
patrol:
altitude: 40000
variants:
KJ-2000: null

View File

@ -16,5 +16,9 @@ origin: USA
price: 20
max_group_size: 1
role: Carrier-based Tanker
patrol:
# ~265 knots IAS.
speed: 320
altitude: 12000
variants:
S-3B Tanker: {}