mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Still more could be done here by caching the merged poly at the theater level, but this goes a long way. Aircraft commit regions are already cached (in the FlightState), so those are already fairly fast. The combined A2A commit boundary could also potentially be cached at the theater level.
43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Iterator
|
|
from typing import TYPE_CHECKING
|
|
|
|
from dcs import Point
|
|
from shapely.ops import unary_union
|
|
|
|
from game.utils import dcs_to_shapely_point
|
|
|
|
if TYPE_CHECKING:
|
|
from game.theater import ConflictTheater, TheaterGroundObject
|
|
from game.threatzones import ThreatPoly
|
|
|
|
|
|
class SamEngagementZones:
|
|
def __init__(
|
|
self,
|
|
threat_zones: ThreatPoly,
|
|
individual_zones: list[tuple[TheaterGroundObject, ThreatPoly]],
|
|
) -> None:
|
|
self.threat_zones = threat_zones
|
|
self.individual_zones = individual_zones
|
|
|
|
def covers(self, position: Point) -> bool:
|
|
return self.threat_zones.intersects(dcs_to_shapely_point(position))
|
|
|
|
def iter_threatening_sams(self, position: Point) -> Iterator[TheaterGroundObject]:
|
|
for tgo, zone in self.individual_zones:
|
|
if zone.intersects(dcs_to_shapely_point(position)):
|
|
yield tgo
|
|
|
|
@classmethod
|
|
def from_theater(cls, theater: ConflictTheater, player: bool) -> SamEngagementZones:
|
|
commit_regions = []
|
|
individual_zones = []
|
|
for cp in theater.control_points_for(player):
|
|
for tgo in cp.connected_objectives:
|
|
if (region := tgo.threat_poly()) is not None:
|
|
commit_regions.append(region)
|
|
individual_zones.append((tgo, region))
|
|
return SamEngagementZones(unary_union(commit_regions), individual_zones)
|