mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
This doesn't do anything yet, but sets up the data model handling for frozen combat. The next step is to show combat in the map view, since that will be helpful when debugging the step after that one: resolving frozen combat. This would benefit from caching the Shapely data for SAM threat zones. Right now it's generating them once per tick and the stuttering is visible at max speed. https://github.com/dcs-liberation/dcs_liberation/issues/1680
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from shapely.ops import unary_union
|
|
|
|
from game.ato.flightstate import InFlight
|
|
from game.utils import dcs_to_shapely_point
|
|
from .joinablecombat import JoinableCombat
|
|
|
|
if TYPE_CHECKING:
|
|
from game.ato import Flight
|
|
|
|
|
|
class AirCombat(JoinableCombat):
|
|
def __init__(self, flights: list[Flight]) -> None:
|
|
super().__init__(flights)
|
|
footprints = []
|
|
for flight in self.flights:
|
|
if (region := flight.state.a2a_commit_region()) is not None:
|
|
footprints.append(region)
|
|
self.footprint = unary_union(footprints)
|
|
|
|
def joinable_by(self, flight: Flight) -> bool:
|
|
if not flight.state.will_join_air_combat:
|
|
return False
|
|
|
|
if not isinstance(flight.state, InFlight):
|
|
raise NotImplementedError(
|
|
f"Only InFlight flights are expected to join air combat. {flight} is "
|
|
"not InFlight"
|
|
)
|
|
|
|
if self.footprint.intersects(
|
|
dcs_to_shapely_point(flight.state.estimate_position())
|
|
):
|
|
return True
|
|
return False
|
|
|
|
def because(self) -> str:
|
|
blue_flights = []
|
|
red_flights = []
|
|
for flight in self.flights:
|
|
if flight.squadron.player:
|
|
blue_flights.append(str(flight))
|
|
else:
|
|
red_flights.append(str(flight))
|
|
|
|
blue = ", ".join(blue_flights)
|
|
red = ", ".join(red_flights)
|
|
return f"of air combat {blue} vs {red}"
|
|
|
|
def describe(self) -> str:
|
|
return f"in air-to-air combat"
|