relics/RelicScale.cs
using Sandbox;
using System.Reflection.PortableExecutable;
using System.Runtime.Versioning;
using System.Threading.Tasks;

public class RelicScale : Relic
{
	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.Choose && Manager.Instance.ChosenCards.Count == 1;
	}

	public override async Task HandleEventAsync( EventType eventType )
	{
		var card0 = Manager.Instance.ChosenCards[0];
		var validCards = Manager.Instance.Cards.Where( x => x.CardType != card0.CardType && !x.IsRevealed ).ToList();

		if ( validCards.Count == 0 )
			return;

		Manager.Instance.PushEventMessage( this, eventType );

		validCards.Shuffle();

		await Task.DelayRealtime( 150 );

		int numCardsToShake = Level * 2;
		for( int i = 0; i < Math.Min( numCardsToShake, validCards.Count); i++ )
		{
			var card = validCards[i];
			await Manager.Instance.ShakeCard( card );
			await Task.DelayRealtime( Game.Random.Int(150, 250) );
		}

		await Task.DelayRealtime( 100 );

		Manager.Instance.PopEventMessage();
	}
}