mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Adjust flightplans for escorts
This commit is contained in:
parent
3f79fa5b9d
commit
2270300177
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user