cards/CardAntenna.cs
using Sandbox;
using System.Threading.Tasks;

public class CardAntenna : Card
{

	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.Reveal && Manager.Instance.RevealedCard == this && !(Manager.Instance.ChosenCards.Count == 2 && Manager.Instance.ChosenCards.Where(x => x.CardType == CardType.Antenna).Count() == 2);
	}

	public override async Task HandleEventAsync( EventType eventType )
	{
		var antennas = Manager.Instance.GetCardsOfType( CardType.Antenna, except: this ).OrderBy(x => (x.GridPos - GridPos).Length);
		if ( antennas.Count() == 0 )
			return;

		var antenna = antennas.ElementAt( 0 );

		Manager.Instance.PushEventMessage( this, eventType );

		await Task.DelayRealtime( 300 );

		var dist = (antenna.GridPos - GridPos).Length;

		//Log.Info( $"dist: {dist}" );

		int pingTime = (int)Utils.Map( dist, 1f, 5.385f, 150f, 800f, EasingType.SineOut );
		//int pingTime = (int)Utils.Map( dist, 1f, 9.85f, 100f, 800f, EasingType.SineOut );

		Manager.Instance.PlayCardSfx( "antenna", this, volume: 1f, pitch: 1.25f );
		await Manager.Instance.ShakeCard( this, time: pingTime * 0.001f * 0.75f, strength: 55f, easingType: EasingType.SineOut, playSfx: false );

		await Task.DelayRealtime( pingTime );

		Manager.Instance.PlayCardSfx( "antenna", this, volume: Utils.Map( dist, 1f, 5.83f, 1.1f, 0.8f, EasingType.SineIn ), pitch: Utils.Map( dist, 1f, 5.83f, 1.25f, 0.65f, EasingType.SineIn ) );
		await Manager.Instance.ShakeCard( this, time: pingTime * 0.001f * 0.75f, strength: 55f, easingType: EasingType.SineOut, playSfx: false );

		//await Task.DelayRealtime( 900 - pingTime );
		await Task.DelayRealtime( 200 );

		Manager.Instance.PopEventMessage();
	}
}