mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
We can't directly use frozen dataclasses from pydcs in our interface because pydantic can't process them. Pydantic is able to automatically convert to our modelview type from the pydcs type though.
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from game.server.leaflet import LeafletPoint, 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: LeafletPoint | None
|
|
target_positions: list[LeafletPoint] | 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__}")
|