Effects/Ring/StrikeRing.cs
namespace PlanetMeat;
[Group( "Planet Meat - Effects" ), Title( "Strike Ring" ), Icon( "radar" )]
public sealed class StrikeRing : TimedRing
{
private static GameObject Prefab => GameObject.GetPrefab( "tools/strike/strike_ring.prefab" );
public static StrikeRing Create( Vector3 position, float impactRadius, float scatterDistance )
{
var go = Prefab.Clone( position );
if ( go.Components.Get<StrikeRing>() is StrikeRing strike )
{
strike.EffectRadius = impactRadius;
strike.ScatterDistance = scatterDistance;
return strike;
}
return null;
}
[Property] public AoeRing ScatterRing { get; set; }
public float ScatterDistance
{
get => ScatterRing.Radius - EffectRing.Radius;
set => ScatterRing.Radius = TimerRing.Radius = EffectRing.Radius + value;
}
private Vector3 FinalPosition { get; set; }
public override void MultiplyAlpha( float mult )
{
base.MultiplyAlpha( mult );
ScatterRing.RingColor = ScatterRing.RingColor.WithAlphaMultiplied( mult );
}
public void ZeroInOn( Vector3 finalPosition, float finalRadius, float duration )
{
TimerStartRadius = ScatterRing.Radius;
TimerFinalRadius = finalRadius;
FinalPosition = finalPosition.WithZ( EffectRing.WorldPosition.z );
StartTimer( duration );
}
protected override void Lerp( float frac )
{
if ( frac >= 1.0f )
{
GameObject.Destroy();
}
else
{
base.Lerp( frac );
TimerRing.WorldPosition = WorldPosition.LerpTo( FinalPosition, frac );
EffectRing.WorldPosition = WorldPosition.LerpTo( FinalPosition, frac );
}
}
}