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

public class RelicSocks : Relic
{
	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.LevelStart;
	}

	public override async Task HandleEventAsync(EventType eventType)
	{
		Manager.Instance.PushEventMessage( this, eventType );

		await Task.DelayRealtime( 500 );

		List<Card> validCards = new();

		foreach( var card in Manager.Instance.Cards )
		{
			if ( validCards.Contains( card ) )
				continue;

			var leftCard = Manager.Instance.GetCardAtGridPos( card.GridPos + new IntVector2( -1, 0 ) );
			if(leftCard != null && leftCard.CardType == card.CardType)
			{
				validCards.Add( card );
				validCards.Add( leftCard );
				continue;
			}

			var rightCard = Manager.Instance.GetCardAtGridPos( card.GridPos + new IntVector2( 1, 0 ) );
			if ( rightCard != null && rightCard.CardType == card.CardType )
			{
				validCards.Add( card );
				validCards.Add( rightCard );
				continue;
			}

			var downCard = Manager.Instance.GetCardAtGridPos( card.GridPos + new IntVector2( 0, -1 ) );
			if ( downCard != null && downCard.CardType == card.CardType )
			{
				validCards.Add( card );
				validCards.Add( downCard );
				continue;
			}

			var upCard = Manager.Instance.GetCardAtGridPos( card.GridPos + new IntVector2( 0, 1 ) );
			if ( upCard != null && upCard.CardType == card.CardType )
			{
				validCards.Add( card );
				validCards.Add( upCard );
				continue;
			}
		}

		if(validCards.Count == 0)
		{
			await Task.DelayRealtime( 800 );
			Manager.Instance.PopEventMessage();
			return;
		}

		validCards.Shuffle();

		for( int i = 0; i < Math.Min(Level, validCards.Count); i++ )
		{
			var card = validCards[i];

			await Manager.Instance.ShakeCard( card );

			await Task.DelayRealtime( 800 );
		}
		
		Manager.Instance.PopEventMessage();
	}
}