mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from game.server.leaflet import LeafletLatLon, 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: LeafletLatLon | None
|
|
target_positions: list[LeafletLatLon] | 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=theater.point_to_ll(combat.flight.position()).as_list(),
|
|
target_positions=[
|
|
theater.point_to_ll(combat.flight.package.target.position).as_list()
|
|
],
|
|
footprint=None,
|
|
)
|
|
if isinstance(combat, DefendingSam):
|
|
return FrozenCombatJs(
|
|
id=combat.id,
|
|
flight_position=theater.point_to_ll(combat.flight.position()).as_list(),
|
|
target_positions=[
|
|
theater.point_to_ll(sam.position).as_list()
|
|
for sam in combat.air_defenses
|
|
],
|
|
footprint=None,
|
|
)
|
|
raise NotImplementedError(f"Unhandled FrozenCombat type: {combat.__class__}")
|