Utility/CameraNoise/Recoil.cs
using Sandbox.Utility;

namespace Sandbox.CameraNoise;

/// <summary>
/// Creates a bunch of other common effects
/// </summary>
class Recoil : BaseCameraNoise
{
	public Recoil( float amount, float speed = 1 )
	{
		new RollShake() { Size = 0.5f * amount * GamePreferences.Screenshake, Waves = 3 * speed };
	}

	public override void ModifyCamera( CameraComponent cc )
	{
	}
}

/// <summary>
/// Shake the screen in a roll motion
/// </summary>
class RollShake : BaseCameraNoise
{
	public float Size { get; set; } = 3.0f;
	public float Waves { get; set; } = 3.0f;

	public RollShake()
	{
		LifeTime = 0.3f;
	}

	public override void ModifyCamera( CameraComponent cc )
	{
		var delta = Delta;
		var s = MathF.Sin( delta * MathF.PI * Waves * 2 );
		cc.WorldRotation *= new Angles( 0, 0, s * Size ) * Easing.EaseOut( DeltaInverse );
	}
}