Example #1
0
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))
Example #2
0
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)