def calc_points_hit(num_transfers, free_transfers):
    """
    Current rules say we lose 4 points for every transfer beyond
    the number of free transfers we have.
    Num transfers can be an integer, or "W", "F", "Bx", or "Tx"
    (wildcard, free hit, bench-boost or triple-caption).
    For Bx and Tx the "x" corresponds to the number of transfers
    in addition to the card being played.
    """
    if num_transfers == "W" or num_transfers == "F":
        return 0
    elif isinstance(num_transfers, int):
        return max(0, 4 * (num_transfers - free_transfers))
    elif (num_transfers.startswith("B") or num_transfers.startswith("T")) and len(
        num_transfers
    ) == 2:
        num_transfers = int(num_transfers[-1])
        return max(0, 4 * (num_transfers - free_transfers))
    else:
        raise RuntimeError(
            "Unexpected argument for num_transfers {}".format(num_transfers)
        )