Dan Albert 124e2d5e10 Avoid sending landmap data for Falklands.
This is too damn slow. A possible solution is explained in the comment,
but we shouldn't tackle that until we're sure the rest of the game runs
okay.
2022-09-10 16:31:47 -07:00

56 lines
2.0 KiB
Python

import logging
from fastapi import APIRouter, Depends, HTTPException, status
from game import Game
from game.server import GameContext
from .models import MapZonesJs, ThreatZoneContainerJs, UnculledZoneJs
from ..leaflet import ShapelyUtil
router: APIRouter = APIRouter(prefix="/map-zones")
@router.get("/terrain", operation_id="get_terrain_zones", response_model=MapZonesJs)
def get_terrain(game: Game = Depends(GameContext.require)) -> MapZonesJs:
if game.theater.terrain.name == "Falklands":
# The new high fidelity landmap is far too expensive to send to the UI.
# Converting all the points from DCS X/Y to lat/lng and then serializing all
# that data takes minutes and gigabytes (!!) of RAM.
#
# It's not clear how much the rest of Liberation is affected by the landmap
# complexity yet. If the rest of the game is tolerable we will need to start
# baking images of the landmap that can be used as an overlay in the UI rather
# than drawing it from each point.
logging.debug(
"Not sending landmap to the UI for Falklands because it's too slow"
)
return MapZonesJs.empty()
zones = game.theater.landmap
if zones is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
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),
)
@router.get(
"/unculled", operation_id="list_unculled_zones", response_model=list[UnculledZoneJs]
)
def get_unculled_zones(
game: Game = Depends(GameContext.require),
) -> list[UnculledZoneJs]:
return UnculledZoneJs.from_game(game)
@router.get(
"/threats", operation_id="get_threat_zones", response_model=ThreatZoneContainerJs
)
def get_threat_zones(
game: Game = Depends(GameContext.require),
) -> ThreatZoneContainerJs:
return ThreatZoneContainerJs.for_game(game)