dcs_liberation/game/commander/battlepositions.py

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)