status/SatelliteLaserStatus.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;

[Status(7, 0, 0.8f, 0, false )]
public class SatelliteLaserStatus : Status
{
	private TimeSince _timeSinceShoot;
	private float _nextShootTime;

	public SatelliteLaserStatus()
    {
		Title = "Attack Satellite";
		IconPath = "textures/icons/satellite_laser.png";
	}

	public override void Init(Player player)
	{
		base.Init(player);

        ShouldUpdate = true;
		_timeSinceShoot = 0f;
		_nextShootTime = Game.Random.Float( 1f, 2f );
	}

	public override void Refresh()
    {
		Description = GetDescription(Level);
    }

    public override void Update(float dt)
    {
        base.Update(dt);

		if( _timeSinceShoot > _nextShootTime )
		{
			Shoot();

			_timeSinceShoot = 0f;
			_nextShootTime = Game.Random.Float( 1f, 5f );
		}
    }

	void Shoot()
	{
		var laser = Manager.Instance.SpawnSatelliteLaser( Manager.Instance.MouseWorldPos );
		laser.Damage = GetDmgForLevel( Level );

		Manager.Instance.PlaySfxNearby( "laser_hit", Manager.Instance.MouseWorldPos, pitch: Game.Random.Float( 1.4f, 1.5f ), volume: 0.6f, maxDist: 7.5f );
	}

    public override string GetDescription(int newLevel)
	{
		return string.Format( "Periodically shoot a {0} dmg laser at your cursor", GetDmgForLevel(Level));
	}

	public override string GetUpgradeDescription(int newLevel)
	{
		return newLevel > 1 ? string.Format( "Periodically shoot a {0}→{1} dmg laser at your cursor ", GetDmgForLevel(newLevel - 1), GetDmgForLevel(newLevel)) : GetDescription(newLevel);
	}

	public float GetDmgForLevel(int level)
	{
		return 6 + level * 5 + MathX.FloorToInt(MathF.Pow(level, 2.2f)) + (level == 7 ? 10 : 0);
	}
}