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

[Status(4, 0, 0.8f, 0, false )]
public class NumProjectileStatus : Status
{
	public NumProjectileStatus()
    {
		Title = "More Bullets";
		IconPath = "textures/icons/more_projectiles.png";
	}

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

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

		Player.Modify(this, PlayerStat.NumProjectiles, GetNumProjectilesForLevel(Level), ModifierType.Add);
		Player.Modify(this, PlayerStat.AttackSpeed, GetAttackSpeedMultForLevel(Level), ModifierType.Mult);
        Player.Modify(this, PlayerStat.MoveSpeed, GetMoveSpeedMultForLevel(Level), ModifierType.Mult);
    }

	public override string GetDescription(int newLevel)
	{
		return string.Format("+{0} bullet per shot but reduce attack speed by {1}% and move speed by {2}%", GetNumProjectilesForLevel(Level), GetAttackSpeedPercentForLevel(Level), GetMoveSpeedPercentForLevel(Level));
	}

	public override string GetUpgradeDescription(int newLevel)
    {
		return newLevel > 1 ? string.Format("+{0}→+{1} bullet per shot but reduce attack speed by {2}%→{3}% and move speed by {4}%→{5}%", GetNumProjectilesForLevel(newLevel - 1), GetNumProjectilesForLevel(newLevel), GetAttackSpeedPercentForLevel(newLevel - 1), GetAttackSpeedPercentForLevel(newLevel), GetMoveSpeedPercentForLevel(newLevel - 1), GetMoveSpeedPercentForLevel(newLevel)) : GetDescription(newLevel);
	}

	public float GetNumProjectilesForLevel(int level) { return level; }
	public float GetAttackSpeedMultForLevel(int level) 
	{ 
		switch(level)
		{
			case 1: default: return 0.65f;
			case 2: return 0.5f;
			case 3: return 0.35f;
			case 4: return 0.25f;
		}
	}
	public float GetAttackSpeedPercentForLevel(int level) 
	{
		switch ( level )
		{
			case 1: default: return 35;
			case 2: return 50;
			case 3: return 65;
			case 4: return 75;
		}
	}

	public float GetMoveSpeedMultForLevel( int level )
	{
		switch ( level )
		{
			case 1: default: return 1f - 0.15f;
			case 2: return 1f - 0.3f;
			case 3: return 1f - 0.45f;
			case 4: return 1f - 0.55f;
		}
	}
	public float GetMoveSpeedPercentForLevel( int level )
	{
		switch ( level )
		{
			case 1: default: return 15;
			case 2: return 30;
			case 3: return 45;
			case 4: return 55;
		}
	}
}