mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Iterator
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from typing import TYPE_CHECKING, Type
|
|
|
|
from .flightplan import FlightPlan, Layout
|
|
from .ibuilder import IBuilder
|
|
from .waypointbuilder import WaypointBuilder
|
|
from .. import Flight
|
|
from ..flightwaypointtype import FlightWaypointType
|
|
|
|
if TYPE_CHECKING:
|
|
from ..flightwaypoint import FlightWaypoint
|
|
|
|
|
|
@dataclass
|
|
class CustomLayout(Layout):
|
|
def iter_waypoints(self) -> Iterator[FlightWaypoint]:
|
|
yield self.departure
|
|
yield from self.custom_waypoints
|
|
|
|
|
|
class CustomFlightPlan(FlightPlan[CustomLayout]):
|
|
@staticmethod
|
|
def builder_type() -> Type[Builder]:
|
|
return Builder
|
|
|
|
@property
|
|
def is_custom(self) -> bool:
|
|
return True
|
|
|
|
@property
|
|
def tot_waypoint(self) -> FlightWaypoint:
|
|
target_types = (
|
|
FlightWaypointType.PATROL_TRACK,
|
|
FlightWaypointType.TARGET_GROUP_LOC,
|
|
FlightWaypointType.TARGET_POINT,
|
|
FlightWaypointType.TARGET_SHIP,
|
|
)
|
|
for waypoint in self.waypoints:
|
|
if waypoint in target_types:
|
|
return waypoint
|
|
return self.layout.departure
|
|
|
|
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None:
|
|
if waypoint == self.tot_waypoint:
|
|
return self.tot
|
|
return None
|
|
|
|
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None:
|
|
return None
|
|
|
|
@property
|
|
def mission_begin_on_station_time(self) -> datetime | None:
|
|
return None
|
|
|
|
@property
|
|
def mission_departure_time(self) -> datetime:
|
|
return self.package.time_over_target
|
|
|
|
|
|
class Builder(IBuilder[CustomFlightPlan, CustomLayout]):
|
|
def __init__(
|
|
self, flight: Flight, waypoints: list[FlightWaypoint] | None = None
|
|
) -> None:
|
|
super().__init__(flight)
|
|
if waypoints is None:
|
|
waypoints = []
|
|
self.waypoints = waypoints
|
|
|
|
def layout(self) -> CustomLayout:
|
|
builder = WaypointBuilder(self.flight)
|
|
return CustomLayout(builder.takeoff(self.flight.departure), self.waypoints)
|
|
|
|
def build(self, dump_debug_info: bool = False) -> CustomFlightPlan:
|
|
return CustomFlightPlan(self.flight, self.layout())
|