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, Player 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=Player.BLUE), game.theater ), red=ThreatZonesJs.from_zones( game.threat_zone_for(player=Player.RED), game.theater ), )