mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
94 lines
2.6 KiB
Python
94 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from game.server.leaflet import LeafletPoint, LeafletPoly, ShapelyUtil
|
|
from game.theater import ConflictTheater
|
|
from game.threatzones import ThreatZones
|
|
|
|
if TYPE_CHECKING:
|
|
from game import Game
|
|
|
|
|
|
class MapZonesJs(BaseModel):
|
|
inclusion: list[LeafletPoly]
|
|
exclusion: list[LeafletPoly]
|
|
sea: list[LeafletPoly]
|
|
|
|
class Config:
|
|
title = "MapZones"
|
|
|
|
@classmethod
|
|
def empty(cls) -> MapZonesJs:
|
|
return MapZonesJs(inclusion=[], exclusion=[], sea=[])
|
|
|
|
@classmethod
|
|
def from_game(cls, game: Game) -> MapZonesJs:
|
|
zones = game.theater.landmap
|
|
if zones is None:
|
|
return cls.empty()
|
|
|
|
return MapZonesJs(
|
|
inclusion=ShapelyUtil.polys_to_leaflet(zones.inclusion_zones, game.theater),
|
|
exclusion=ShapelyUtil.polys_to_leaflet(zones.exclusion_zones, game.theater),
|
|
sea=ShapelyUtil.polys_to_leaflet(zones.sea_zones, game.theater),
|
|
)
|
|
|
|
|
|
class UnculledZoneJs(BaseModel):
|
|
position: LeafletPoint
|
|
radius: float
|
|
|
|
class Config:
|
|
title = "UnculledZone"
|
|
|
|
@staticmethod
|
|
def from_game(game: Game) -> list[UnculledZoneJs]:
|
|
return [
|
|
UnculledZoneJs(
|
|
position=zone.latlng(),
|
|
radius=game.settings.perf_culling_distance * 1000,
|
|
)
|
|
for zone in game.get_culling_zones()
|
|
]
|
|
|
|
|
|
class ThreatZonesJs(BaseModel):
|
|
full: list[LeafletPoly]
|
|
aircraft: list[LeafletPoly]
|
|
air_defenses: list[LeafletPoly]
|
|
radar_sams: list[LeafletPoly]
|
|
|
|
class Config:
|
|
title = "ThreatZones"
|
|
|
|
@classmethod
|
|
def from_zones(cls, zones: ThreatZones, theater: ConflictTheater) -> ThreatZonesJs:
|
|
return ThreatZonesJs(
|
|
full=ShapelyUtil.polys_to_leaflet(zones.all, theater),
|
|
aircraft=ShapelyUtil.polys_to_leaflet(zones.airbases, theater),
|
|
air_defenses=ShapelyUtil.polys_to_leaflet(zones.air_defenses, theater),
|
|
radar_sams=ShapelyUtil.polys_to_leaflet(zones.radar_sam_threats, theater),
|
|
)
|
|
|
|
|
|
class ThreatZoneContainerJs(BaseModel):
|
|
blue: ThreatZonesJs
|
|
red: ThreatZonesJs
|
|
|
|
class Config:
|
|
title = "ThreatZoneContainer"
|
|
|
|
@staticmethod
|
|
def for_game(game: Game) -> ThreatZoneContainerJs:
|
|
return ThreatZoneContainerJs(
|
|
blue=ThreatZonesJs.from_zones(
|
|
game.threat_zone_for(player=True), game.theater
|
|
),
|
|
red=ThreatZonesJs.from_zones(
|
|
game.threat_zone_for(player=False), game.theater
|
|
),
|
|
)
|