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

public class CardSyringe : Card
{
	public override bool ShouldHandleEvent( EventType eventType )
	{
		return eventType == EventType.Match && Manager.Instance.ChosenCards[1] == this;
	}

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

		await Task.DelayRealtime( 400 );

		Manager.Instance.PlayCardSfxBetween( "syringe", Manager.Instance.ChosenCards[0], Manager.Instance.ChosenCards[1], volume: 1.3f, pitch: Game.Random.Float( 0.98f, 1.01f ) );

		await Task.DelayRealtime( 250 );

		var healAmount = Manager.Instance.MaxHP - Manager.Instance.HP;

		Manager.Instance.SpawnHealHPFloater( healAmount, WorldPosition );

		await Manager.Instance.GainHP( healAmount );

		await Task.DelayRealtime( 300 );

		var timerReductionAmount = Manager.Instance.Stats[StatType.TimerTotalTime] / 2f;
		Manager.Instance.Stats[StatType.TimerTotalTime] -= timerReductionAmount;

		var status = Manager.Instance.AddStatus( "StatusSyringe" );
		((StatusSyringe)status).TimerReductionAmount = timerReductionAmount;

		Manager.Instance.TimeSinceTimerChanged = 0f;

		await Task.DelayRealtime( 800 );

		Manager.Instance.PopEventMessage();
	}
}

public class StatusSyringe : StatusEffect
{
	public float TimerReductionAmount { get; set; }

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

	public override async Task HandleEventAsync( EventType eventType )
	{
		Manager.Instance.Stats[StatType.TimerTotalTime] += TimerReductionAmount;

		await Task.DelayRealtime( 0 );

		Manager.Instance.RemoveStatus( this );
	}
}