mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from dcs.mapping import LatLng
|
|
from pydantic import BaseModel
|
|
|
|
from game.server.leaflet import LeafletPoly, ShapelyUtil
|
|
from game.sim.combat import FrozenCombat
|
|
from game.sim.combat.aircombat import AirCombat
|
|
from game.sim.combat.atip import AtIp
|
|
from game.sim.combat.defendingsam import DefendingSam
|
|
from game.theater import ConflictTheater
|
|
|
|
|
|
class FrozenCombatJs(BaseModel):
|
|
id: UUID
|
|
flight_position: LatLng | None
|
|
target_positions: list[LatLng] | None
|
|
footprint: list[LeafletPoly] | None
|
|
|
|
@staticmethod
|
|
def for_combat(combat: FrozenCombat, theater: ConflictTheater) -> FrozenCombatJs:
|
|
if isinstance(combat, AirCombat):
|
|
return FrozenCombatJs(
|
|
id=combat.id,
|
|
flight_position=None,
|
|
target_positions=None,
|
|
footprint=ShapelyUtil.polys_to_leaflet(combat.footprint, theater),
|
|
)
|
|
if isinstance(combat, AtIp):
|
|
return FrozenCombatJs(
|
|
id=combat.id,
|
|
flight_position=combat.flight.position().latlng(),
|
|
target_positions=[combat.flight.package.target.position.latlng()],
|
|
footprint=None,
|
|
)
|
|
if isinstance(combat, DefendingSam):
|
|
return FrozenCombatJs(
|
|
id=combat.id,
|
|
flight_position=combat.flight.position().latlng(),
|
|
target_positions=[sam.position.latlng() for sam in combat.air_defenses],
|
|
footprint=None,
|
|
)
|
|
raise NotImplementedError(f"Unhandled FrozenCombat type: {combat.__class__}")
|