Fix drop zone display for air assault.

Troops must be dropped inside this zone or they won't attack the target.
The zone needs to be drawn in the map so players don't break the flight
plan by accidentally moving the drop waypoint outside the DZ.

I've move the API for doing this out of `PatrollingFlightPlan` in favor
of a mixin so this is no longer presented as `engagement_distance` by
the flight plan. I don't love that it's still the `commit-boundary`
endpoint, but it's fine for now.

I don't know why mypy wasn't able to catch this. pycharm is also
struggling to understand this class.
This commit is contained in:
Dan Albert
2022-11-20 11:29:34 -08:00
committed by Raffson
parent e541111a27
commit f5ef509af6
5 changed files with 50 additions and 24 deletions

View File

@@ -4,9 +4,7 @@ from fastapi import APIRouter, Depends
from shapely.geometry import LineString, Point as ShapelyPoint
from game import Game
from game.ato.flightplans.airassault import AirAssaultFlightPlan
from game.ato.flightplans.cas import CasFlightPlan
from game.ato.flightplans.patrolling import PatrollingFlightPlan
from game.ato.flightplans.uizonedisplay import UiZoneDisplay
from game.server import GameContext
from game.server.flights.models import FlightJs
from game.server.leaflet import LeafletPoly, ShapelyUtil
@@ -40,23 +38,12 @@ def commit_boundary(
flight_id: UUID, game: Game = Depends(GameContext.require)
) -> LeafletPoly:
flight = game.db.flights.get(flight_id)
if isinstance(flight.flight_plan, CasFlightPlan) or isinstance(
flight.flight_plan, AirAssaultFlightPlan
):
# Special Commit boundary for CAS and AirAssault
center = flight.flight_plan.layout.target.position
commit_center = ShapelyPoint(center.x, center.y)
elif isinstance(flight.flight_plan, PatrollingFlightPlan):
# Commit boundary for standard patrolling flight plan
start = flight.flight_plan.layout.patrol_start
end = flight.flight_plan.layout.patrol_end
commit_center = LineString(
[
ShapelyPoint(start.x, start.y),
ShapelyPoint(end.x, end.y),
]
)
else:
if not isinstance(flight.flight_plan, UiZoneDisplay):
return []
bubble = commit_center.buffer(flight.flight_plan.engagement_distance.meters)
zone = flight.flight_plan.ui_zone()
if len(zone.points) == 1:
center = ShapelyPoint(zone.points[0].x, zone.points[0].y)
else:
center = LineString([ShapelyPoint(p.x, p.y) for p in zone.points])
bubble = center.buffer(zone.radius.meters)
return ShapelyUtil.poly_to_leaflet(bubble, game.theater)