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

public class RelicMicroscope : Relic
{
	public override void Init()
	{
		base.Init();

		MaxLevel = 1;
	}

	//public override void LevelUp()
	//{
	//	base.LevelUp();

	//	Manager.Instance.Stats[StatType.TimerResetAfterBothChoices] = 1f;
	//}

	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.Match;
	}

	public override async Task HandleEventAsync( EventType eventType )
	{
		var card0 = Manager.Instance.ChosenCards[0];
		var card1 = Manager.Instance.ChosenCards[1];

		List<Card> validCards = new();

		foreach( var card in Manager.Instance.GetNearbyCards( card0.GridPos ) )
		{
			if( !Manager.Instance.ChosenCards.Contains(card) && !card.IsRevealed )
				validCards.Add( card );
		}

		foreach ( var card in Manager.Instance.GetNearbyCards( card1.GridPos ) )
		{
			if ( !Manager.Instance.ChosenCards.Contains( card ) && !card.IsRevealed && !validCards.Contains( card ) )
				validCards.Add( card );
		}

		if ( validCards.Count == 0 )
			return;

		validCards.Shuffle();

		var cardToReveal = validCards.First();

		await Task.DelayRealtime( 300 );

		Manager.Instance.PushEventMessage( this, eventType );

		//Manager.Instance.PlayCardSfx( "satellite", cardToReveal, volume: 0.95f, pitch: Game.Random.Float( 0.9f, 1f ) );

		await Task.DelayRealtime( 300 );

		Manager.Instance.PlayCardSfx( "card_flip", cardToReveal, volume: 0.8f, pitch: Game.Random.Float( 1.15f, 1.2f ) );
		await Manager.Instance.RevealCard( cardToReveal );

		await Task.DelayRealtime( 850 );

		Manager.Instance.PlayCardSfx( "card_flip", cardToReveal, volume: 0.7f, pitch: Game.Random.Float( 0.65f, 0.75f ) );
		Manager.Instance.HideCard( cardToReveal );

		await Task.DelayRealtime( 350 );

		Manager.Instance.PopEventMessage();
	}

	//public override string GetEventText( EventType eventType )
	//{
	//	return "✅Match: reveal a nearby card";
	//}
}