def set_destination( cp_id: UUID, destination: LeafletPoint = Body(..., title="destination"), game: Game = Depends(GameContext.require), ) -> None: cp = game.theater.find_control_point_by_id(cp_id) if cp is None: raise HTTPException( status.HTTP_404_NOT_FOUND, detail=f"Game has no control point with ID {cp_id}", ) if not cp.moveable: raise HTTPException(status.HTTP_403_FORBIDDEN, detail=f"{cp} is not mobile") if not cp.captured: raise HTTPException(status.HTTP_403_FORBIDDEN, detail=f"{cp} is not owned by the player") point = Point.from_latlng(LatLng(destination.lat, destination.lng), game.theater.terrain) if not cp.destination_in_range(point): raise HTTPException( status.HTTP_400_BAD_REQUEST, detail=f"Cannot move {cp} more than " f"{cp.max_move_distance.nautical_miles}nm.", ) cp.target_position = point EventStream.put_nowait(GameUpdateEvents().update_control_point(cp))
def destination_in_range( cp_id: UUID, lat: float, lng: float, game: Game = Depends(GameContext.require)) -> bool: cp = game.theater.find_control_point_by_id(cp_id) if cp is None: raise HTTPException( status.HTTP_404_NOT_FOUND, detail=f"Game has no control point with ID {cp_id}", ) point = Point.from_latlng(LatLng(lat, lng), game.theater.terrain) return cp.destination_in_range(point)