Adjust flightplans for escorts

This commit is contained in:
Raffson 2022-11-12 23:13:23 +01:00
parent 3f79fa5b9d
commit 2270300177
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
4 changed files with 52 additions and 6 deletions

View File

@ -8,6 +8,8 @@ from .formationattack import (
FormationAttackLayout, FormationAttackLayout,
) )
from .waypointbuilder import WaypointBuilder from .waypointbuilder import WaypointBuilder
from .. import FlightType
from ...utils import Distance
class EscortFlightPlan(FormationAttackFlightPlan): class EscortFlightPlan(FormationAttackFlightPlan):
@ -24,12 +26,17 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
ingress, target = builder.escort( ingress, target = builder.escort(
self.package.waypoints.ingress, self.package.target self.package.waypoints.ingress, self.package.target
) )
ingress.only_for_player = True
target.only_for_player = True
hold = builder.hold(self._hold_point()) hold = builder.hold(self._hold_point())
join = builder.join(self.package.waypoints.join) join = builder.join(self.package.waypoints.join)
split = builder.split(self.package.waypoints.split) split = builder.split(self.package.waypoints.split)
refuel = None refuel = None
if self.package.waypoints.refuel is not None: if self.package.waypoints.refuel is not None:
refuel = builder.refuel(self.package.waypoints.refuel) refuel = builder.refuel(self.package.waypoints.refuel)
initial = None
if self.package.primary_task == FlightType.STRIKE:
initial = builder.escort_hold(self.package.waypoints.initial, Distance.from_feet(20000))
return FormationAttackLayout( return FormationAttackLayout(
departure=builder.takeoff(self.flight.departure), departure=builder.takeoff(self.flight.departure),
@ -39,6 +46,7 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
), ),
join=join, join=join,
ingress=ingress, ingress=ingress,
initial=initial,
targets=[target], targets=[target],
split=split, split=split,
refuel=refuel, refuel=refuel,

View File

@ -4,13 +4,13 @@ from abc import ABC
from collections.abc import Iterator from collections.abc import Iterator
from dataclasses import dataclass from dataclasses import dataclass
from datetime import timedelta from datetime import timedelta
from typing import TYPE_CHECKING, TypeVar from typing import TYPE_CHECKING, TypeVar, Optional
from dcs import Point from dcs import Point
from game.flightplan import HoldZoneGeometry from game.flightplan import HoldZoneGeometry
from game.theater import MissionTarget from game.theater import MissionTarget
from game.utils import Speed, meters from game.utils import Speed, meters, Distance
from .flightplan import FlightPlan from .flightplan import FlightPlan
from .formation import FormationFlightPlan, FormationLayout from .formation import FormationFlightPlan, FormationLayout
from .ibuilder import IBuilder from .ibuilder import IBuilder
@ -134,6 +134,7 @@ class FormationAttackFlightPlan(FormationFlightPlan, ABC):
class FormationAttackLayout(FormationLayout): class FormationAttackLayout(FormationLayout):
ingress: FlightWaypoint ingress: FlightWaypoint
targets: list[FlightWaypoint] targets: list[FlightWaypoint]
initial: Optional[FlightWaypoint] = None
def iter_waypoints(self) -> Iterator[FlightWaypoint]: def iter_waypoints(self) -> Iterator[FlightWaypoint]:
yield self.departure yield self.departure
@ -141,6 +142,8 @@ class FormationAttackLayout(FormationLayout):
yield from self.nav_to yield from self.nav_to
yield self.join yield self.join
yield self.ingress yield self.ingress
if self.initial is not None:
yield self.initial
yield from self.targets yield from self.targets
yield self.split yield self.split
if self.refuel is not None: if self.refuel is not None:
@ -185,6 +188,16 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
if self.package.waypoints.refuel is not None: if self.package.waypoints.refuel is not None:
refuel = builder.refuel(self.package.waypoints.refuel) refuel = builder.refuel(self.package.waypoints.refuel)
ingress = builder.ingress(
ingress_type, self.package.waypoints.ingress, self.package.target
)
initial = None
if self.package.primary_task == FlightType.STRIKE:
ingress = builder.nav(self.package.waypoints.ingress, Distance.from_feet(20000))
initial = builder.ingress(
ingress_type, self.package.waypoints.initial, self.package.target
)
return FormationAttackLayout( return FormationAttackLayout(
departure=builder.takeoff(self.flight.departure), departure=builder.takeoff(self.flight.departure),
hold=hold, hold=hold,
@ -192,9 +205,8 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
hold.position, join.position, self.doctrine.ingress_altitude hold.position, join.position, self.doctrine.ingress_altitude
), ),
join=join, join=join,
ingress=builder.ingress( ingress=ingress,
ingress_type, self.package.waypoints.ingress, self.package.target initial=initial,
),
targets=target_waypoints, targets=target_waypoints,
split=split, split=split,
refuel=refuel, refuel=refuel,

View File

@ -415,6 +415,24 @@ class WaypointBuilder:
pretty_name="Orbit", pretty_name="Orbit",
) )
@staticmethod
def escort_hold(start: Point, altitude: Distance) -> FlightWaypoint:
"""Creates custom waypoint for escort flights that need to hold.
Args:
start: Position of the waypoint.
altitude: Altitude of the holding pattern.
"""
return FlightWaypoint(
"ESCORT HOLD",
FlightWaypointType.CUSTOM,
start,
altitude,
description="Anchor and hold at this point",
pretty_name="Escort Hold",
)
@staticmethod @staticmethod
def sweep_start(position: Point, altitude: Distance) -> FlightWaypoint: def sweep_start(position: Point, altitude: Distance) -> FlightWaypoint:
"""Creates a sweep start waypoint. """Creates a sweep start waypoint.

View File

@ -1,13 +1,15 @@
from __future__ import annotations from __future__ import annotations
import random
from dataclasses import dataclass from dataclasses import dataclass
from typing import TYPE_CHECKING from typing import TYPE_CHECKING, Optional
from dcs import Point from dcs import Point
from game.ato.flightplans.waypointbuilder import WaypointBuilder from game.ato.flightplans.waypointbuilder import WaypointBuilder
from game.flightplan import IpZoneGeometry, JoinZoneGeometry from game.flightplan import IpZoneGeometry, JoinZoneGeometry
from game.flightplan.refuelzonegeometry import RefuelZoneGeometry from game.flightplan.refuelzonegeometry import RefuelZoneGeometry
from game.utils import nautical_miles
if TYPE_CHECKING: if TYPE_CHECKING:
from game.ato import Package from game.ato import Package
@ -18,6 +20,7 @@ if TYPE_CHECKING:
class PackageWaypoints: class PackageWaypoints:
join: Point join: Point
ingress: Point ingress: Point
initial: Point
split: Point split: Point
refuel: Point refuel: Point
@ -32,6 +35,10 @@ class PackageWaypoints:
coalition, coalition,
).find_best_ip() ).find_best_ip()
hdg = package.target.position.heading_between_point(ingress_point)
dist = nautical_miles(random.random() * 2 + 7).meters
initial_point = package.target.position.point_from_heading(hdg, dist)
join_point = JoinZoneGeometry( join_point = JoinZoneGeometry(
package.target.position, package.target.position,
origin.position, origin.position,
@ -51,6 +58,7 @@ class PackageWaypoints:
return PackageWaypoints( return PackageWaypoints(
WaypointBuilder.perturb(join_point), WaypointBuilder.perturb(join_point),
ingress_point, ingress_point,
initial_point,
WaypointBuilder.perturb(join_point), WaypointBuilder.perturb(join_point),
refuel_point, refuel_point,
) )