Clean up CAP types.

Stop using "CAP". Use BARCAP or TARCAP instead.

TARCAP no longer allowed anywhere but front lines, since that's all we
have mission planning for right now. Later will add TARCAP and BARCAP
for all objective types with different timing profiles.

Part two of the fix for
https://github.com/Khopa/dcs_liberation/issues/210.
This commit is contained in:
Dan Albert 2020-10-17 14:32:09 -07:00
parent cace523aa8
commit 3d41eb1ab4
7 changed files with 32 additions and 30 deletions

View File

@ -997,7 +997,7 @@ class AircraftConflictGenerator:
flight: Flight, timing: PackageWaypointTiming, flight: Flight, timing: PackageWaypointTiming,
dynamic_runways: Dict[str, RunwayData]) -> None: dynamic_runways: Dict[str, RunwayData]) -> None:
flight_type = flight.flight_type flight_type = flight.flight_type
if flight_type in [FlightType.CAP, FlightType.BARCAP, FlightType.TARCAP, if flight_type in [FlightType.BARCAP, FlightType.TARCAP,
FlightType.INTERCEPTION]: FlightType.INTERCEPTION]:
self.configure_cap(group, flight, dynamic_runways) self.configure_cap(group, flight, dynamic_runways)
elif flight_type in [FlightType.CAS, FlightType.BAI]: elif flight_type in [FlightType.CAS, FlightType.BAI]:

View File

@ -131,7 +131,7 @@ class AircraftAllocator:
@staticmethod @staticmethod
def preferred_aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: def preferred_aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]:
cap_missions = (FlightType.BARCAP, FlightType.CAP, FlightType.TARCAP) cap_missions = (FlightType.BARCAP, FlightType.TARCAP)
if task in cap_missions: if task in cap_missions:
return CAP_PREFERRED return CAP_PREFERRED
elif task == FlightType.CAS: elif task == FlightType.CAS:
@ -147,7 +147,7 @@ class AircraftAllocator:
@staticmethod @staticmethod
def capable_aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: def capable_aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]:
cap_missions = (FlightType.BARCAP, FlightType.CAP, FlightType.TARCAP) cap_missions = (FlightType.BARCAP, FlightType.TARCAP)
if task in cap_missions: if task in cap_missions:
return CAP_CAPABLE return CAP_CAPABLE
elif task == FlightType.CAS: elif task == FlightType.CAS:
@ -403,7 +403,7 @@ class CoalitionMissionPlanner:
# Find friendly CPs within 100 nmi from an enemy airfield, plan CAP. # Find friendly CPs within 100 nmi from an enemy airfield, plan CAP.
for cp in self.objective_finder.vulnerable_control_points(): for cp in self.objective_finder.vulnerable_control_points():
yield ProposedMission(cp, [ yield ProposedMission(cp, [
ProposedFlight(FlightType.CAP, 2, self.MAX_CAP_RANGE), ProposedFlight(FlightType.BARCAP, 2, self.MAX_CAP_RANGE),
]) ])
# Find front lines, plan CAP. # Find front lines, plan CAP.
@ -492,11 +492,7 @@ class CoalitionMissionPlanner:
error = random.randint(-margin, margin) error = random.randint(-margin, margin)
yield max(0, time + error) yield max(0, time + error)
dca_types = ( dca_types = (FlightType.BARCAP, FlightType.INTERCEPTION)
FlightType.BARCAP,
FlightType.CAP,
FlightType.INTERCEPTION,
)
non_dca_packages = [p for p in self.ato.packages if non_dca_packages = [p for p in self.ato.packages if
p.primary_task not in dca_types] p.primary_task not in dca_types]

View File

@ -8,7 +8,7 @@ from theater.controlpoint import ControlPoint, MissionTarget
class FlightType(Enum): class FlightType(Enum):
CAP = 0 CAP = 0 # Do not use. Use BARCAP or TARCAP.
TARCAP = 1 TARCAP = 1
BARCAP = 2 BARCAP = 2
CAS = 3 CAS = 3

View File

@ -69,8 +69,6 @@ class FlightPlanBuilder:
logging.error("BAI flight plan generation not implemented") logging.error("BAI flight plan generation not implemented")
elif task == FlightType.BARCAP: elif task == FlightType.BARCAP:
self.generate_barcap(flight) self.generate_barcap(flight)
elif task == FlightType.CAP:
self.generate_barcap(flight)
elif task == FlightType.CAS: elif task == FlightType.CAS:
self.generate_cas(flight) self.generate_cas(flight)
elif task == FlightType.DEAD: elif task == FlightType.DEAD:
@ -103,6 +101,8 @@ class FlightPlanBuilder:
logging.error( logging.error(
"Troop transport flight plan generation not implemented" "Troop transport flight plan generation not implemented"
) )
else:
logging.error(f"Unsupported task type: {task.name}")
except InvalidObjectiveLocation: except InvalidObjectiveLocation:
logging.exception(f"Could not create flight plan") logging.exception(f"Could not create flight plan")

View File

@ -19,7 +19,6 @@ from gen.flights.flight import (
CAP_DURATION = 30 # Minutes CAP_DURATION = 30 # Minutes
CAP_TYPES = (FlightType.BARCAP, FlightType.CAP)
INGRESS_TYPES = { INGRESS_TYPES = {
FlightWaypointType.INGRESS_CAS, FlightWaypointType.INGRESS_CAS,
@ -151,7 +150,7 @@ class TotEstimator:
# Takeoff immediately. # Takeoff immediately.
return 0 return 0
if self.package.primary_task in CAP_TYPES: if self.package.primary_task == FlightType.BARCAP:
start_time = self.timing.race_track_start start_time = self.timing.race_track_start
else: else:
start_time = self.timing.join start_time = self.timing.join
@ -184,7 +183,7 @@ class TotEstimator:
# the package. # the package.
return 0 return 0
if self.package.primary_task in CAP_TYPES: if self.package.primary_task == FlightType.BARCAP:
# The racetrack start *is* the target. The package target is the # The racetrack start *is* the target. The package target is the
# protected objective. # protected objective.
time_to_target = 0 time_to_target = 0
@ -278,14 +277,14 @@ class PackageWaypointTiming:
@property @property
def race_track_start(self) -> int: def race_track_start(self) -> int:
if self.package.primary_task in CAP_TYPES: if self.package.primary_task == FlightType.BARCAP:
return self.package.time_over_target return self.package.time_over_target
else: else:
return self.ingress return self.ingress
@property @property
def race_track_end(self) -> int: def race_track_end(self) -> int:
if self.package.primary_task in CAP_TYPES: if self.package.primary_task == FlightType.BARCAP:
return self.target + CAP_DURATION * 60 return self.target + CAP_DURATION * 60
else: else:
return self.egress return self.egress

View File

@ -19,7 +19,6 @@ class QFlightTypeComboBox(QComboBox):
COMMON_ENEMY_MISSIONS = [ COMMON_ENEMY_MISSIONS = [
FlightType.ESCORT, FlightType.ESCORT,
FlightType.TARCAP,
FlightType.SEAD, FlightType.SEAD,
FlightType.DEAD, FlightType.DEAD,
# TODO: FlightType.ELINT, # TODO: FlightType.ELINT,
@ -27,42 +26,46 @@ class QFlightTypeComboBox(QComboBox):
# TODO: FlightType.RECON, # TODO: FlightType.RECON,
] ]
FRIENDLY_AIRBASE_MISSIONS = [ COMMON_FRIENDLY_MISSIONS = [
FlightType.CAP, FlightType.BARCAP,
# TODO: FlightType.INTERCEPTION
# TODO: FlightType.LOGISTICS
] ]
FRIENDLY_AIRBASE_MISSIONS = [
# TODO: FlightType.INTERCEPTION
# TODO: FlightType.LOGISTICS
] + COMMON_FRIENDLY_MISSIONS
FRIENDLY_CARRIER_MISSIONS = [ FRIENDLY_CARRIER_MISSIONS = [
FlightType.BARCAP,
# TODO: FlightType.INTERCEPTION # TODO: FlightType.INTERCEPTION
# TODO: Buddy tanking for the A-4? # TODO: Buddy tanking for the A-4?
# TODO: Rescue chopper? # TODO: Rescue chopper?
# TODO: Inter-ship logistics? # TODO: Inter-ship logistics?
] ] + COMMON_FRIENDLY_MISSIONS
ENEMY_CARRIER_MISSIONS = [ ENEMY_CARRIER_MISSIONS = [
FlightType.ESCORT, FlightType.ESCORT,
FlightType.TARCAP, FlightType.BARCAP,
# TODO: FlightType.ANTISHIP # TODO: FlightType.ANTISHIP
] ]
ENEMY_AIRBASE_MISSIONS = [ ENEMY_AIRBASE_MISSIONS = [
FlightType.BARCAP,
# TODO: FlightType.STRIKE # TODO: FlightType.STRIKE
] + COMMON_ENEMY_MISSIONS ] + COMMON_ENEMY_MISSIONS
FRIENDLY_GROUND_OBJECT_MISSIONS = [ FRIENDLY_GROUND_OBJECT_MISSIONS = [
FlightType.CAP,
# TODO: FlightType.LOGISTICS # TODO: FlightType.LOGISTICS
# TODO: FlightType.TROOP_TRANSPORT # TODO: FlightType.TROOP_TRANSPORT
] ] + COMMON_FRIENDLY_MISSIONS
ENEMY_GROUND_OBJECT_MISSIONS = [ ENEMY_GROUND_OBJECT_MISSIONS = [
FlightType.BARCAP,
FlightType.STRIKE, FlightType.STRIKE,
] + COMMON_ENEMY_MISSIONS ] + COMMON_ENEMY_MISSIONS
FRONT_LINE_MISSIONS = [ FRONT_LINE_MISSIONS = [
FlightType.CAS, FlightType.CAS,
FlightType.TARCAP,
# TODO: FlightType.TROOP_TRANSPORT # TODO: FlightType.TROOP_TRANSPORT
# TODO: FlightType.EVAC # TODO: FlightType.EVAC
] + COMMON_ENEMY_MISSIONS ] + COMMON_ENEMY_MISSIONS

View File

@ -54,6 +54,7 @@ class QFlightWaypointTab(QFrame):
rlayout.addWidget(QLabel("<strong>Generator :</strong>")) rlayout.addWidget(QLabel("<strong>Generator :</strong>"))
rlayout.addWidget(QLabel("<small>AI compatible</small>")) rlayout.addWidget(QLabel("<small>AI compatible</small>"))
# TODO: Filter by objective type.
self.recreate_buttons.clear() self.recreate_buttons.clear()
recreate_types = [ recreate_types = [
FlightType.CAS, FlightType.CAS,
@ -137,12 +138,15 @@ class QFlightWaypointTab(QFrame):
QMessageBox.Yes QMessageBox.Yes
) )
if result == QMessageBox.Yes: if result == QMessageBox.Yes:
# TODO: These should all be just CAP. # TODO: Should be buttons for both BARCAP and TARCAP.
# BARCAP and TARCAP behave differently. TARCAP arrives a few minutes
# ahead of the rest of the package and stays until the package
# departs, whereas BARCAP usually isn't part of a strike package and
# has a fixed mission time.
if task == FlightType.CAP: if task == FlightType.CAP:
if isinstance(self.package.target, FrontLine): if isinstance(self.package.target, FrontLine):
task = FlightType.TARCAP task = FlightType.TARCAP
elif isinstance(self.package.target, ControlPoint): elif isinstance(self.package.target, ControlPoint):
if self.package.target.is_fleet:
task = FlightType.BARCAP task = FlightType.BARCAP
self.flight.flight_type = task self.flight.flight_type = task
self.planner.populate_flight_plan(self.flight) self.planner.populate_flight_plan(self.flight)