perks/PerkFireStack.cs

An Epic rarity perk called PerkFireStack that modifies player fire stacking behavior. It registers a perk with a name, icon and descriptions, increments a FireDmgStack stat by +1, and multiplies FireLifetime by a value computed from the perk level.

🐞 GetValue for the multiplier returns 0.9 + 0.2*level, so at level 1+ the Mult modifier exceeds 1 and increases FireLifetime instead of reducing it.
using System;
using Sandbox;

[Perk( Rarity.Epic, includedAtStart: false, locked: true, minUnlocksReq: 1, alwaysOfferDebug: false )]
public class PerkFireStack : Perk
{
	private enum Mod { FireLifetime };

	// todo: fire particle affect should change color when it stacks

	static PerkFireStack()
	{
		Register<PerkFireStack>(
			name: "Pyromaniac",
			imagePath: "textures/icons/vector/fire_dmg_stack.png",
			description: level => $"Your fire stacks\n-{(int)GetValue( level, Mod.FireLifetime, true )}% fire duration",
			upgradeDescription: level => $"Your fire stacks\n-{(int)GetValue( level - 1, Mod.FireLifetime, true )}%→-{(int)GetValue( level, Mod.FireLifetime, true )}% fire duration"
		);
	}

	public override void Start()
	{
		base.Start();
	}

	public override void Refresh()
	{
		base.Refresh();

		Player.Modify( this, PlayerStat.FireDmgStack, 1f, ModifierType.Add );
		Player.Modify( this, PlayerStat.FireLifetime, GetValue( Level, Mod.FireLifetime ), ModifierType.Mult );
	}

	private static float GetValue( int level, Mod mod, bool isPercent = false )
	{
		switch ( mod )
		{
			case Mod.FireLifetime:
			default:
				return isPercent
					? 100f - 20f * level
					: 1f - (0.100f - 0.20f * level);
		}
	}
}