Entities/Abilities/FlipperDashEyeTintAbility.cs

A player ability that shows an eye-tint indicator for Flipper's dash recharge state. It creates a TwinAbilityEyeTint GameObject on spawn, updates its animation and tint based on player state, and destroys it on removal or death.

File Access
namespace BlockParty;

/// <summary>Shows whether Flipper's invert-recharged dash is currently available.</summary>
public sealed class FlipperDashEyeTintAbility : PlayerAbility
{
	private static readonly Color EMPTY_DASH_EYE_TINT = new( 0.86f, 0.18f, 0.18f, 0.82f );

	private TwinAbilityEyeTint _eyeTint;

	public override void OnSpawn( Player player )
	{
		var tintObject = new GameObject( true, "flipper dash eye tint" );
		tintObject.SetParent( player.GameObject );
		tintObject.LocalPosition = Vector3.Zero;
		_eyeTint = tintObject.Components.Create<TwinAbilityEyeTint>();
		_eyeTint.Setup( player, adjustTwinOneWalk: false, eyeLeft: 5, eyeTop: 3, eyeWidth: 5, eyeHeight: 4 );
	}

	public override void OnRemoved( Player player )
	{
		_eyeTint?.GameObject?.Destroy();
		_eyeTint = null;
	}

	public override void OnDeath( Player player )
	{
		if ( _eyeTint is not null ) _eyeTint.Tint = Color.Transparent;
	}

	public override void OnAnimationChanged( Player player, string animation )
	{
		_eyeTint?.SetAnimation( animation );
	}

	public override void PostTick( Player player, float dt )
	{
		if ( _eyeTint is not null )
			_eyeTint.Tint = player.DashCharged ? Color.Transparent : EMPTY_DASH_EYE_TINT;
	}
}