mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Optional
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from game.data.groups import GroupTask
|
|
from game.server.leaflet import LeafletPoint
|
|
|
|
if TYPE_CHECKING:
|
|
from game import Game
|
|
from game.theater import TheaterGroundObject
|
|
|
|
|
|
class TgoJs(BaseModel):
|
|
id: UUID
|
|
name: str
|
|
control_point_name: str
|
|
category: str
|
|
blue: bool
|
|
position: LeafletPoint
|
|
units: list[str] # TODO: Event stream
|
|
threat_ranges: list[float] # TODO: Event stream
|
|
detection_ranges: list[float] # TODO: Event stream
|
|
dead: bool # TODO: Event stream
|
|
sidc: str # TODO: Event stream
|
|
task: Optional[GroupTask]
|
|
|
|
class Config:
|
|
title = "Tgo"
|
|
|
|
@staticmethod
|
|
def for_tgo(tgo: TheaterGroundObject) -> TgoJs:
|
|
threat_ranges = [group.max_threat_range().meters for group in tgo.groups]
|
|
detection_ranges = [group.max_detection_range().meters for group in tgo.groups]
|
|
return TgoJs(
|
|
id=tgo.id,
|
|
name=tgo.name,
|
|
control_point_name=tgo.control_point.name,
|
|
category=tgo.category,
|
|
blue=tgo.control_point.captured,
|
|
position=tgo.position.latlng(),
|
|
units=[unit.display_name for unit in tgo.units],
|
|
threat_ranges=threat_ranges,
|
|
detection_ranges=detection_ranges,
|
|
dead=tgo.is_dead,
|
|
sidc=str(tgo.sidc()),
|
|
task=tgo.groups[0].ground_object.task if tgo.groups else None,
|
|
)
|
|
|
|
@staticmethod
|
|
def all_in_game(game: Game) -> list[TgoJs]:
|
|
tgos = []
|
|
for control_point in game.theater.controlpoints:
|
|
for tgo in control_point.connected_objectives:
|
|
if not tgo.is_control_point:
|
|
tgos.append(TgoJs.for_tgo(tgo))
|
|
return tgos
|