mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import TYPE_CHECKING
|
|
|
|
from game.utils import Distance, SPEED_OF_SOUND_AT_SEA_LEVEL, Speed, mach, meters
|
|
|
|
if TYPE_CHECKING:
|
|
from .flight import Flight
|
|
from .package import Package
|
|
|
|
|
|
class GroundSpeed:
|
|
@classmethod
|
|
def for_flight(cls, flight: Flight, altitude: Distance) -> Speed:
|
|
# TODO: Expose both a cruise speed and target speed.
|
|
# The cruise speed can be used for ascent, hold, join, and RTB to save
|
|
# on fuel, but mission speed will be fast enough to keep the flight
|
|
# safer.
|
|
|
|
# DCS's max speed is in kph at 0 MSL.
|
|
max_speed = flight.unit_type.max_speed
|
|
if max_speed > SPEED_OF_SOUND_AT_SEA_LEVEL:
|
|
# Aircraft is supersonic. Limit to mach 0.85 to conserve fuel and
|
|
# account for heavily loaded jets.
|
|
return mach(0.85, altitude)
|
|
|
|
# For subsonic aircraft, assume the aircraft can reasonably perform at
|
|
# 80% of its maximum, and that it can maintain the same mach at altitude
|
|
# as it can at sea level. This probably isn't great assumption, but
|
|
# might. be sufficient given the wiggle room. We can come up with
|
|
# another heuristic if needed.
|
|
cruise_mach = max_speed.mach() * (0.60 if flight.is_helo else 0.85)
|
|
return mach(cruise_mach, altitude if not flight.is_helo else meters(0))
|
|
|
|
|
|
# TODO: Most if not all of this should move into FlightPlan.
|
|
class TotEstimator:
|
|
def __init__(self, package: Package) -> None:
|
|
self.package = package
|
|
|
|
def earliest_tot(self, now: datetime) -> datetime:
|
|
if not self.package.flights:
|
|
return now
|
|
|
|
return max(self.earliest_tot_for_flight(f, now) for f in self.package.flights)
|
|
|
|
@staticmethod
|
|
def earliest_tot_for_flight(flight: Flight, now: datetime) -> datetime:
|
|
"""Estimate the earliest time the flight can reach the target position.
|
|
|
|
The interpretation of the TOT depends on the flight plan type. See the various
|
|
FlightPlan implementations for details.
|
|
|
|
Args:
|
|
flight: The flight to get the earliest TOT for.
|
|
now: The current mission time.
|
|
|
|
Returns:
|
|
The earliest possible TOT for the given flight.
|
|
"""
|
|
flight_time = flight.flight_plan.minimum_duration_from_start_to_tot()
|
|
offset = flight.flight_plan.tot_offset
|
|
return now + flight_time - offset
|