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

public class CardAnt : Card
{
	public override bool IsAlive => true;

	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.TurnStart && Manager.Instance.GetNumNearbyEmptyGridPositions( GridPos, adjacentOnly: false ) > 0;
	}

	public override async Task HandleEventAsync( EventType eventType )
	{
		var emptyGridPos = Manager.Instance.GetRandomNearbyGridPos( GridPos, empty: true, adjacentOnly: false );

		await Task.DelayRealtime( 200 );

		Manager.Instance.PlayCardSfx( "card_move", this, volume: 1.1f, pitch: Game.Random.Float( 0.85f, 1.15f ) );

		await Task.DelayRealtime( 100 );

		Manager.Instance.RemoveCardGridPos( this );
		await Manager.Instance.SetCardGridPos( this, emptyGridPos );

		await Task.DelayRealtime( 300 );

		await Manager.Instance.EventHappened( EventType.AfterCardsMoved );
	}
}