Spending/Upgrades/Meat/BaseMeatUpgrade.cs
namespace PlanetMeat;

public abstract class PercentageMeatUpgrade : BaseComponentUpgrade<MeatImprover, float>
{
	protected abstract ValueAggregator<float> Agg { get; }

	protected override float EffectBase => TargetComponent?.GetWithout( Agg ) ?? 0.0f;
	protected override float GetEffectAt( int rank ) => EffectPerRank.MultiplyCapped( rank );

	protected override void OnRankChanged()
	{
		TargetComponent?.Contribute( Agg, CurrentEffect );
	}

	public override string GetDisplayedEffectAt( int rank ) => PercentageEffectImprovement.GetDisplayedPercentage( GetOveralEffect( rank ), DecimalPlaces );
}

public abstract class IntMeatUpgrade : BaseComponentUpgrade<MeatImprover, int>
{
	protected abstract ValueAggregator<int> Agg { get; }

	protected override int EffectBase => TargetComponent?.GetWithout( Agg ) ?? 0;
	protected override int GetEffectAt( int rank ) => EffectPerRank.MultiplyCapped( rank );

	protected override void OnRankChanged()
	{
		TargetComponent?.Contribute( Agg, CurrentEffect );
	}
}