Generate CAP missions in useful locations.

CAP missions should be between the protected location and the nearest
threat. Find the closest enemy airfield and ensure that the CAP race
track is between it and the protected location.
This commit is contained in:
Dan Albert 2020-09-29 00:51:27 -07:00
parent cc7c2cc707
commit 582c43fb6c

View File

@ -16,6 +16,7 @@ from dcs.unit import Unit
from game.data.doctrine import Doctrine, MODERN_DOCTRINE from game.data.doctrine import Doctrine, MODERN_DOCTRINE
from game.utils import nm_to_meter from game.utils import nm_to_meter
from theater import ControlPoint, FrontLine, MissionTarget, TheaterGroundObject from theater import ControlPoint, FrontLine, MissionTarget, TheaterGroundObject
from .closestairfields import ObjectiveDistanceCache
from .flight import Flight, FlightType, FlightWaypoint, FlightWaypointType from .flight import Flight, FlightType, FlightWaypoint, FlightWaypointType
from .waypointbuilder import WaypointBuilder from .waypointbuilder import WaypointBuilder
from ..conflictgen import Conflict from ..conflictgen import Conflict
@ -37,6 +38,7 @@ class FlightPlanBuilder:
def __init__(self, game: Game, is_player: bool) -> None: def __init__(self, game: Game, is_player: bool) -> None:
self.game = game self.game = game
self.is_player = is_player
if is_player: if is_player:
faction = self.game.player_faction faction = self.game.player_faction
else: else:
@ -174,18 +176,30 @@ class FlightPlanBuilder:
self.doctrine.max_patrol_altitude self.doctrine.max_patrol_altitude
) )
closest_cache = ObjectiveDistanceCache.get_closest_airfields(location)
for airfield in closest_cache.closest_airfields:
if airfield.captured != self.is_player:
closest_airfield = airfield
break
else:
logging.error("Could not find any enemy airfields")
return
heading = location.position.heading_between_point(
closest_airfield.position
)
loc = location.position.point_from_heading( loc = location.position.point_from_heading(
random.randint(0, 360), heading,
random.randint(self.doctrine.cap_min_distance_from_cp, random.randint(self.doctrine.cap_min_distance_from_cp,
self.doctrine.cap_max_distance_from_cp) self.doctrine.cap_max_distance_from_cp)
) )
hdg = location.position.heading_between_point(loc)
radius = random.randint( radius = random.randint(
self.doctrine.cap_min_track_length, self.doctrine.cap_min_track_length,
self.doctrine.cap_max_track_length self.doctrine.cap_max_track_length
) )
orbit0p = loc.point_from_heading(hdg - 90, radius) orbit0p = loc.point_from_heading(heading - 90, radius)
orbit1p = loc.point_from_heading(hdg + 90, radius) orbit1p = loc.point_from_heading(heading + 90, radius)
builder = WaypointBuilder(self.doctrine) builder = WaypointBuilder(self.doctrine)
builder.ascent(flight.from_cp) builder.ascent(flight.from_cp)