mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Iterator
|
|
from dataclasses import dataclass
|
|
|
|
from game.theater import ControlPoint
|
|
from game.theater.theatergroundobject import VehicleGroupGroundObject
|
|
from game.utils import meters
|
|
|
|
|
|
@dataclass
|
|
class BattlePositions:
|
|
blocking_capture: list[VehicleGroupGroundObject]
|
|
defending_front_line: list[VehicleGroupGroundObject]
|
|
|
|
@property
|
|
def in_priority_order(self) -> Iterator[VehicleGroupGroundObject]:
|
|
yield from self.blocking_capture
|
|
yield from self.defending_front_line
|
|
|
|
def eliminate(self, battle_position: VehicleGroupGroundObject) -> None:
|
|
if battle_position in self.blocking_capture:
|
|
self.blocking_capture.remove(battle_position)
|
|
if battle_position in self.defending_front_line:
|
|
self.defending_front_line.remove(battle_position)
|
|
|
|
def __contains__(self, item: VehicleGroupGroundObject) -> bool:
|
|
return item in self.in_priority_order
|
|
|
|
@classmethod
|
|
def for_control_point(cls, control_point: ControlPoint) -> BattlePositions:
|
|
"""Categorize battle position groups based on target priority.
|
|
|
|
Any battle positions blocking base capture are the highest priority.
|
|
"""
|
|
blocking = []
|
|
defending = []
|
|
battle_positions = [
|
|
tgo
|
|
for tgo in control_point.ground_objects
|
|
if isinstance(tgo, VehicleGroupGroundObject) and not tgo.is_dead
|
|
]
|
|
for battle_position in battle_positions:
|
|
if (
|
|
meters(battle_position.distance_to(control_point))
|
|
< ControlPoint.CAPTURE_DISTANCE
|
|
):
|
|
blocking.append(battle_position)
|
|
else:
|
|
defending.append(battle_position)
|
|
|
|
return BattlePositions(blocking, defending)
|