Decompiled source of StackCalculator v1.0.4

Stack_Calculator.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using On.RoR2.UI;
using RoR2;
using RoR2.UI;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("Stack Calculator")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Stack Calculator")]
[assembly: AssemblyTitle("Stack Calculator")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace StackCalculator
{
	internal static class Log
	{
		private static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[BepInPlugin("com.yourname.stackcalculator", "Stack Calculator", "1.0.0")]
	public class StackCalculator : BaseUnityPlugin
	{
		public void Awake()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Stack Calculator Plugin loaded!");
			ItemIcon.SetItemIndex += new hook_SetItemIndex(ItemIcon_SetItemIndex);
		}

		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)284))
			{
				LogAllItemsInInventory();
			}
		}

		private void LogAllItemsInInventory()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			CharacterMaster master = LocalUserManager.GetFirstLocalUser().cachedMasterController.master;
			if (!Object.op_Implicit((Object)(object)master) || !Object.op_Implicit((Object)(object)master.inventory))
			{
				return;
			}
			foreach (ItemIndex item in master.inventory.itemAcquisitionOrder)
			{
				ItemDef itemDef = ItemCatalog.GetItemDef(item);
				if ((Object)(object)itemDef != (Object)null)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Item: " + ((Object)itemDef).name + " - " + Language.GetString(itemDef.descriptionToken)));
				}
			}
		}

		private string GetBlockChance(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "0%";
			}
			double num = 0.15 * (double)itemCount / (0.15 * (double)itemCount + 1.0);
			return $"{num * 100.0:F1}%";
		}

		private string GetStunGrenadeChance(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "0%";
			}
			double num = 0.05 * (double)itemCount / (0.05 * (double)itemCount + 1.0);
			return $"{num * 100.0:F1}%";
		}

		private string GetBandolierChance(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "0%";
			}
			double num = 1.0 - Math.Pow(1.0 / (1.0 + (double)itemCount), 0.33);
			return $"{num * 100.0:F1}%";
		}

		private string GetFuelCellCooldownReduction(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "0%";
			}
			double num = 1.0 - Math.Pow(0.85, itemCount);
			return $"{num * 100.0:F1}%";
		}

		private string GetExecuteThreshold(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "0%";
			}
			double num = 0.13 * (double)itemCount / (0.13 * (double)itemCount + 1.0);
			return $"{num * 100.0:F1}%";
		}

		private string GetStealthKitRechargeTime(int itemCount)
		{
			if (itemCount <= 0)
			{
				return "30s";
			}
			double num = 30.0 * Math.Pow(0.5, itemCount - 1);
			return $"{num:F1}s";
		}

		private string GetCustomDescription(ItemDef itemDef, int itemCount)
		{
			switch (((Object)itemDef).name)
			{
			case "ChainLightning":
			{
				int num136 = 3 + 2 * (itemCount - 1);
				float num137 = 20f + 2f * (float)(itemCount - 1);
				return $"Targets: {num136}, Range: {num137}m";
			}
			case "Syringe":
			{
				float num135 = 15f * (float)itemCount;
				return $"Attack Speed: {num135}%";
			}
			case "BossDamageBonus":
			{
				float num134 = 20f * (float)itemCount;
				return $"Damage: {num134}%";
			}
			case "SecondarySkillMagazine":
			{
				int num133 = 1 + itemCount;
				return $"Charges: {num133}";
			}
			case "FlatHealth":
			{
				int num132 = 25 * itemCount;
				return $"HP Increase: {num132}";
			}
			case "Firework":
			{
				int num131 = 8 + 4 * (itemCount - 1);
				return $"Fireworks: {num131}";
			}
			case "Mushroom":
			{
				float num129 = 4.5f + 2.25f * (float)(itemCount - 1);
				float num130 = 3f + 1.5f * (float)(itemCount - 1);
				return $"Healing: {num129}% Radius: {num130}m";
			}
			case "HealWhileSafe":
			{
				float num128 = 3f * (float)itemCount;
				return $"Regen: {num128} hp/s";
			}
			case "Crowbar":
			{
				float num127 = 75f * (float)itemCount;
				return $"Damage: {num127}%";
			}
			case "SprintBonus":
			{
				float num126 = 25f * (float)itemCount;
				return $"Sprint Speed: {num126}%";
			}
			case "NearbyDamageBonus":
			{
				float num125 = 20f * (float)itemCount;
				return $"Damage: {num125}%";
			}
			case "IgniteOnKill":
			{
				int num123 = 12 + 4 * (itemCount - 1);
				float num124 = 150f + 75f * (float)(itemCount - 1);
				return $"Radius: {num123}m, Damage: {num124}%";
			}
			case "CritGlasses":
			{
				float num122 = 10f * (float)itemCount;
				return $"Crit: {num122}%";
			}
			case "Medkit":
			{
				float num120 = 20f;
				float num121 = 5f * (float)itemCount;
				return $"Heal: {num120} + {num121}% of max HP";
			}
			case "Tooth":
			{
				float num119 = 8f + 2f * (float)itemCount;
				return $"HP per orb: {num119}%";
			}
			case "Hoof":
			{
				float num118 = 14f * (float)itemCount;
				return $"Speed: {num118}%";
			}
			case "PersonalShield":
			{
				float num117 = 8f * (float)itemCount;
				return $"Shield: {num117}% of max health";
			}
			case "ArmorPlate":
			{
				int num116 = 5 * itemCount;
				return $"Damage Reduction: {num116}";
			}
			case "StickyBomb":
			{
				float num115 = 5f * (float)itemCount;
				return $"Chance: {num115}%";
			}
			case "StunChanceOnHit":
				return "Stun Chance: " + GetStunGrenadeChance(itemCount);
			case "BarrierOnKill":
			{
				int num114 = 15 * itemCount;
				return $"Barrier HP: {num114}";
			}
			case "Bear":
				return "Chance: " + GetBlockChance(itemCount);
			case "BleedOnHit":
			{
				float num113 = 10f * (float)itemCount;
				return $"Chance: {num113}%";
			}
			case "WardOnLevel":
			{
				float num112 = 16f + 8f * (float)(itemCount - 1);
				return $"Radius: {num112}m";
			}
			case "Missile":
			{
				int num111 = 300 + 300 * (itemCount - 1);
				return $"Damage: {num111}%";
			}
			case "Bandolier":
				return "Chance: " + GetBandolierChance(itemCount);
			case "WarCryOnMultiKill":
			{
				int num110 = 6 + 4 * (itemCount - 1);
				return $"Duration: {num110}s";
			}
			case "SlowOnHit":
			{
				int num109 = 2 + 2 * (itemCount - 1);
				return $"Duration: {num109}s";
			}
			case "DeathMark":
			{
				int num108 = 7 + 7 * (itemCount - 1);
				return $"Duration: {num108}s";
			}
			case "EquipmentMagazine":
			{
				string fuelCellCooldownReduction = GetFuelCellCooldownReduction(itemCount);
				return $"Additional Charges: {itemCount}, Cooldown Reduction: {fuelCellCooldownReduction}";
			}
			case "BonusGoldPackOnKill":
			{
				float num107 = 4 * itemCount;
				return $"Chance: {num107}%";
			}
			case "HealOnCrit":
			{
				int num106 = 8 + 4 * (itemCount - 1);
				return $"HP per hit: {num106}";
			}
			case "Feather":
				return $"Jump Count: {itemCount}";
			case "Infusion":
			{
				int num105 = 100 * itemCount;
				return $"Health Increase: {num105}";
			}
			case "FireRing":
			{
				int num104 = 300 + 300 * (itemCount - 1);
				return $"Damage: {num104}%";
			}
			case "Seed":
				return $"HP per hit: {itemCount}";
			case "TPHealingNova":
				return $"Novas: {itemCount}";
			case "ExecuteLowHealthElite":
			{
				string executeThreshold = GetExecuteThreshold(itemCount);
				return "HP: " + executeThreshold;
			}
			case "Phasing":
			{
				string stealthKitRechargeTime = GetStealthKitRechargeTime(itemCount);
				return "Cooldown: " + stealthKitRechargeTime + ".";
			}
			case "AttackSpeedOnCrit":
			{
				int num103 = 24 * itemCount;
				return $"Max Attk Speed: {num103}%";
			}
			case "Thorns":
			{
				int num101 = 5 + 2 * (itemCount - 1);
				int num102 = 25 + 10 * (itemCount - 1);
				return $"Targets: {num101}, Radius: {num102}m";
			}
			case "SprintOutOfCombat":
			{
				float num100 = 30 + 30 * (itemCount - 1);
				return $"Movement Speed: {num100}%";
			}
			case "SprintArmor":
			{
				int num99 = 30 + 30 * (itemCount - 1);
				return $"Armor: {num99}";
			}
			case "IceRing":
			{
				int num97 = 250 + 250 * (itemCount - 1);
				int num98 = 3 + 3 * (itemCount - 1);
				return $"Damage: {num97}%, Duration: {num98}s";
			}
			case "Squid":
			{
				int num96 = 100 + 100 * (itemCount - 1);
				return $"Attack Speed: {num96}%";
			}
			case "EnergizedOnEquipmentUse":
			{
				int num95 = 8 + 4 * (itemCount - 1);
				return $"Duration: {num95}s";
			}
			case "JumpBoost":
			{
				int num94 = 10 + 10 * (itemCount - 1);
				return $"Distance: {num94}m";
			}
			case "ExplodeOnDeath":
			{
				float num92 = 12f + 2.4f * (float)(itemCount - 1);
				int num93 = 350 + 280 * (itemCount - 1);
				return $"Radius: {num92:F1}m, Damage: {num93}%";
			}
			case "Clover":
				return $"Rolls: {itemCount}";
			case "BarrierOnOverHeal":
			{
				float num91 = 50 + 50 * (itemCount - 1);
				return $"Barrier: {num91}%";
			}
			case "AlienHead":
			{
				float num90 = 25 * itemCount;
				return $"Reduction: {num90}%";
			}
			case "KillEliteFrenzy":
			{
				int num89 = 4 + 4 * (itemCount - 1);
				return $"Duration: {num89}s";
			}
			case "Behemoth":
			{
				float num88 = 4f + 2.5f * (float)(itemCount - 1);
				return $"Radius: {num88}m";
			}
			case "Dagger":
			{
				int num87 = 150 + 150 * (itemCount - 1);
				return $"Damage: {num87}%";
			}
			case "CaptainDefenseMatrix":
				return $"Projectiles: {itemCount}";
			case "Icicle":
			{
				int num86 = 18 + 12 * (itemCount - 1);
				return $"Max Radius: {num86}m";
			}
			case "FallBoots":
			{
				float num85 = 10f / (float)itemCount;
				return $"Cooldown: {num85:F1}s";
			}
			case "GhostOnKill":
			{
				int num84 = 30 + 30 * (itemCount - 1);
				return $"Duration: {num84}s";
			}
			case "UtilitySkillMagazine":
			{
				int num83 = 2 + 2 * (itemCount - 1);
				return $"Charges: {num83}";
			}
			case "Plant":
			{
				float num82 = 10f + 5f * (float)(itemCount - 1);
				return $"Radius: {num82}m";
			}
			case "NovaOnHeal":
			{
				int num81 = 100 + 100 * (itemCount - 1);
				return $"Stores {num81}% of healing as Soul Energy";
			}
			case "IncreaseHealing":
			{
				int num80 = 100 + 100 * (itemCount - 1);
				return $"Healing: +{num80}%";
			}
			case "LaserTurbine":
			{
				int num77 = 300 + 300 * (itemCount - 1);
				int num78 = 1000 + 1000 * (itemCount - 1);
				int num79 = 300 + 300 * (itemCount - 1);
				return $"Launch Damage: {num77}% base, Explode Damage: {num78}% base, Return Damage: {num79}% base";
			}
			case "BounceNearby":
			{
				float num75 = 100f * (1f - 1f / (1f + 0.2f * (float)itemCount));
				int num76 = 10 + 5 * (itemCount - 1);
				return $"Chance: {num75:F1}%, Targets: {num76}";
			}
			case "ArmorReductionOnHit":
			{
				int num74 = 8 + 8 * (itemCount - 1);
				return $"Duration: {num74}s";
			}
			case "Talisman":
			{
				int num73 = 4 + 2 * (itemCount - 1);
				return $"Cooldown: {num73}s";
			}
			case "ShockNearby":
			{
				int num72 = 3 + 2 * (itemCount - 1);
				return $"Targets: {num72}";
			}
			case "HeadHunter":
			{
				int num71 = 8 + 5 * (itemCount - 1);
				return $"Duration: {num71}s";
			}
			case "OutOfCombatArmor":
			{
				int num70 = 100 + 100 * (itemCount - 1);
				return $"Armor: {num70}";
			}
			case "GoldOnHurt":
			{
				int num69 = 3 + 3 * (itemCount - 1);
				return $"Gold: {num69}";
			}
			case "FragileDamageBonus":
			{
				float num68 = 20 + 20 * (itemCount - 1);
				return $"Damage: {num68}%";
			}
			case "AttackSpeedAndMoveSpeed":
			{
				float num66 = 7.5f + 7.5f * (float)(itemCount - 1);
				float num67 = 7 + 7 * (itemCount - 1);
				return $"Attack Speed: {num66:F1}% Movement speed: {num67}%.";
			}
			case "StrengthenBurn":
			{
				int num65 = 300 + 300 * (itemCount - 1);
				return $"Damage: +{num65}%";
			}
			case "PrimarySkillShuriken":
			{
				int num63 = 400 + 100 * (itemCount - 1);
				int num64 = 3 + (itemCount - 1);
				return $"Damage: {num63}% Max: {num64}.";
			}
			case "MoveSpeedOnKill":
			{
				float num62 = 1f + 0.5f * (float)(itemCount - 1);
				return $"Duration {num62:F1}s";
			}
			case "LightningStrikeOnHit":
			{
				int num61 = 500 + 500 * (itemCount - 1);
				return $"Damage: {num61}%";
			}
			case "MinorConstructOnKill":
			{
				int num60 = 4 + 4 * (itemCount - 1);
				return $"Max: {num60}.";
			}
			case "RoboBallBuddy":
			{
				int num59 = 100 + 100 * (itemCount - 1);
				return $"Damage: {num59}%";
			}
			case "NovaOnLowHealth":
			{
				float num58 = 30f / (float)(itemCount + 1);
				return $"Cooldown {num58:F1}";
			}
			case "TitanGoldDuringTP":
			{
				int num56 = 100 + 50 * (itemCount - 1);
				int num57 = 100 + 100 * (itemCount - 1);
				return $"Damage: {num56}% Health: {num57}%";
			}
			case "ShinyPearl":
			{
				int num55 = 10 + 10 * (itemCount - 1);
				return $"Increase: {num55}%.";
			}
			case "SprintWisp":
			{
				int num54 = 300 + 300 * (itemCount - 1);
				return $"Damage: {num54}%";
			}
			case "SiphonOnLowHealth":
			{
				int num53 = 1 + (itemCount - 1);
				return $"Max Tethered: {num53}";
			}
			case "FireballsOnHit":
			{
				int num52 = 300 + 300 * (itemCount - 1);
				return $"Damage: {num52}%";
			}
			case "Pearl":
			{
				int num51 = 10 + 10 * (itemCount - 1);
				return $"Increase: {num51}%";
			}
			case "ParentEgg":
			{
				int num50 = 15 + 15 * (itemCount - 1);
				return $"Heal {num50} on hurt.";
			}
			case "BeetleGland":
			{
				int num49 = 1 + (itemCount - 1);
				return $"Max: {num49}";
			}
			case "BleedOnHitAndExplode":
			{
				int num47 = 400 + 400 * (itemCount - 1);
				int num48 = 15 + 15 * (itemCount - 1);
				return $"Explosion damage: {num47}% and {num48}% of their max health.";
			}
			case "Knurl":
			{
				int num45 = 40 + 40 * (itemCount - 1);
				float num46 = 1.6f + 1.6f * (float)(itemCount - 1);
				return $"Health increase: {num45}, Regen increase: {num46} hp/s.";
			}
			case "GoldOnHit":
			{
				int num44 = 2 + 2 * (itemCount - 1);
				return $"30% chance on hit to gain {num44} gold.";
			}
			case "RepeatHeal":
			{
				float num43 = 0.1f / (float)itemCount;
				return $"Heals 100% more over time, max 10% of your health per second, reduces to {num43 * 100f:F1}% per stack.";
			}
			case "RandomDamageZone":
			{
				int num41 = 3 - (int)(1.5 * (double)(itemCount - 1));
				int num42 = 3 + (itemCount - 1);
				return $"Every {num41} seconds, gain an orbiting bomb (max {num42}), detonates on impact for 360% damage.";
			}
			case "LunarSpecialReplacement":
			{
				int num39 = 10 + 10 * (itemCount - 1);
				int num40 = 8 + 8 * (itemCount - 1);
				return $"Dealing damage adds a stack of Ruin for {num39}s. Recharges every {num40}s.";
			}
			case "RandomlyLunar":
			{
				int num38 = 5 + 5 * (itemCount - 1);
				return $"Items have a {num38}% chance to become Lunar items.";
			}
			case "FocusConvergence":
			{
				float num36 = 90f / (1f + 0.3f * (float)itemCount);
				float num37 = 1f / (2f * (float)itemCount);
				return $"Teleporters charge {num36:F1}% faster, zone size reduced to {num37 * 100f:F1}% of original.";
			}
			case "AutoCastEquipment":
			{
				float num35 = 0.5f * (float)Math.Pow(0.85, itemCount - 1);
				return $"Reduces Equipment cooldown by {num35 * 100f:F1}%.";
			}
			case "LunarSecondaryReplacement":
			{
				int num34 = 5 + 5 * (itemCount - 1);
				return $"Recharge: {num34}s.";
			}
			case "HalfAttackSpeedHalfCooldowns":
			{
				float num32 = (float)Math.Pow(0.5, itemCount);
				float num33 = 1f / (float)(itemCount + 1);
				return $"Decreases skill cooldowns by {num32 * 100f:F1}%, attack speed reduced to {num33 * 100f:F1}%.";
			}
			case "LunarBadLuck":
			{
				int num30 = 2 + (itemCount - 1);
				int num31 = 1 + (itemCount - 1);
				return $"Reduces skill cooldowns by {num30}s, increases unfavorable outcomes by {num31}.";
			}
			case "LunarDagger":
			{
				float num28 = (float)Math.Pow(2.0, itemCount);
				float num29 = (float)Math.Pow(0.5, itemCount);
				return $"Increases damage by {num28 * 100f:F1}%, reduces health by {num29 * 100f:F1}%.";
			}
			case "HalfSpeedDoubleHealth":
			{
				int num26 = 100 + 100 * (itemCount - 1);
				float num27 = (float)Math.Pow(0.5, itemCount);
				return $"Increases max health by {num26}%, reduces movement speed by {num27 * 100f:F1}%.";
			}
			case "LunarUtilityReplacement":
			{
				float num24 = 18.2f + 18.2f * (float)(itemCount - 1);
				int num25 = 3 + 3 * (itemCount - 1);
				return $"Heal {num24}% of max health over {num25}s.";
			}
			case "ShieldOnly":
			{
				float num23 = 50 + 25 * (itemCount - 1);
				return $"Increases maximum health by {num23}%.";
			}
			case "LunarPrimaryReplacement":
			{
				int num21 = 12 + 12 * (itemCount - 1);
				float num22 = 2 + 2 * (itemCount - 1);
				return $"Fire tracking shards, holds up to {num21} charges, reloads every {num22}s.";
			}
			case "CloverVoid":
			{
				int num20 = 3 + 3 * (itemCount - 1);
				return $"Upgrades: {num20}";
			}
			case "CritGlassesVoid":
			{
				float num19 = 0.5f + 0.5f * (float)(itemCount - 1);
				return $"Chance: {num19:F1}%";
			}
			case "EquipmentMagazineVoid":
				return $"Special Charges: {itemCount}";
			case "BleedOnHitVoid":
			{
				int num18 = 10 + 10 * (itemCount - 1);
				return $"Chance: {num18:F1}%";
			}
			case "VoidMegaCrabItem":
			{
				float num16 = 60f / (1f + 0.5f * (float)(itemCount - 1));
				int num17 = 1 + (itemCount - 1);
				return $"Spawnrate: {num16:F1}s, Max: {num17}";
			}
			case "MissileVoid":
			{
				float num14 = 10 + 10 * (itemCount - 1);
				int num15 = 40 + 40 * (itemCount - 1);
				return $"Gain a shield for {num14}% of max your health. Damage: {num15}%";
			}
			case "ChainLightningVoid":
			{
				int num13 = 3 + 3 * (itemCount - 1);
				return $"Chains Lightning: {num13} times.";
			}
			case "BearVoid":
			{
				float num12 = 15f * (float)Math.Pow(0.9, itemCount);
				return $"Cooldown: {num12:F1} seconds.";
			}
			case "ElementalRingVoid":
			{
				float num10 = 20f;
				int num11 = 100 + 100 * (itemCount - 1);
				return $"Damage: {num11}% Cooldown: {num10}s";
			}
			case "SlowOnHitVoid":
			{
				int num8 = 5 + 5 * (itemCount - 1);
				int num9 = 1 + (itemCount - 1);
				return $"Duration: {num9}s";
			}
			case "ExplodeOnDeathVoid":
			{
				float num6 = 12f + 2.4f * (float)(itemCount - 1);
				int num7 = 260 + 156 * (itemCount - 1);
				return $"Radius: {num6}m, Damage: {num7}%";
			}
			case "MushroomVoid":
			{
				int num5 = 2 + 2 * (itemCount - 1);
				return $"Heals for {num5}%";
			}
			case "RandomEquipmentTrigger":
				return $"Triggers random equipment {itemCount} time(s).";
			case "PermanentDebuffOnHit":
			{
				int num4 = 2 * itemCount;
				return $"Reduces enemy armor by {num4}.";
			}
			case "MoreMissile":
			{
				int num3 = 50 * itemCount;
				return $"Damage: {num3}%.";
			}
			case "ImmuneToDebuff":
				return $"Prevents {itemCount} debuff(s).";
			case "DroneWeapons":
			{
				int num2 = 50 * itemCount;
				return $"Attack Speed: {num2}%";
			}
			case "CritDamage":
			{
				int num = 100 * itemCount;
				return $"Critical strikes deal an additional {num}% damage.";
			}
			default:
				return "";
			}
		}

		private void ItemIcon_SetItemIndex(orig_SetItemIndex orig, ItemIcon self, ItemIndex newItemIndex, int newItemCount)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, newItemIndex, newItemCount);
			if (!Object.op_Implicit((Object)(object)self.tooltipProvider))
			{
				return;
			}
			ItemDef itemDef = ItemCatalog.GetItemDef(newItemIndex);
			if (!((Object)(object)itemDef != (Object)null))
			{
				return;
			}
			ItemInventoryDisplay componentInParent = ((Component)self).GetComponentInParent<ItemInventoryDisplay>();
			if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent.inventory != (Object)null)
			{
				int itemCount = componentInParent.inventory.GetItemCount(itemDef.itemIndex);
				string customDescription = GetCustomDescription(itemDef, itemCount);
				if (!string.IsNullOrEmpty(customDescription))
				{
					string @string = Language.GetString(itemDef.descriptionToken);
					string relevantStats = GetRelevantStats(componentInParent.inventory, ((Object)itemDef).name);
					self.tooltipProvider.overrideBodyText = @string + "\n" + customDescription + relevantStats;
				}
			}
		}

		private string GetRelevantStats(Inventory inventory, string itemName)
		{
			string text = "";
			if (itemName == "CritGlasses" || itemName == "HealOnCrit" || itemName == "AttackSpeedOnCrit")
			{
				text = text + "\n" + CalculateTotalCritChance(inventory);
			}
			switch (itemName)
			{
			default:
				if (!(itemName == "HalfAttackSpeedHalfCooldowns"))
				{
					break;
				}
				goto case "Syringe";
			case "Syringe":
			case "AttackSpeedOnCrit":
			case "AttackSpeedAndMoveSpeed":
				text = text + "\n" + CalculateTotalAttackSpeed(inventory);
				break;
			}
			switch (itemName)
			{
			default:
				if (!(itemName == "LunarUtilityReplacement"))
				{
					break;
				}
				goto case "Hoof";
			case "Hoof":
			case "SprintBonus":
			case "SprintOutOfCombat":
			case "AttackSpeedAndMoveSpeed":
			case "HalfSpeedDoubleHealth":
				text = text + "\n" + CalculateTotalMovementSpeed(inventory);
				break;
			}
			return text;
		}

		private string CalculateTotalMovementSpeed(Inventory inventory)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			int itemCount = inventory.GetItemCount(ItemCatalog.FindItemIndex("Hoof"));
			int itemCount2 = inventory.GetItemCount(ItemCatalog.FindItemIndex("SprintBonus"));
			int itemCount3 = inventory.GetItemCount(ItemCatalog.FindItemIndex("SprintOutOfCombat"));
			int itemCount4 = inventory.GetItemCount(ItemCatalog.FindItemIndex("AttackSpeedAndMoveSpeed"));
			int itemCount5 = inventory.GetItemCount(ItemCatalog.FindItemIndex("HalfSpeedDoubleHealth"));
			int itemCount6 = inventory.GetItemCount(ItemCatalog.FindItemIndex("LunarUtilityReplacement"));
			double num = 14 * itemCount + 25 * itemCount2 + 30 * itemCount3 + 7 * itemCount4;
			double num2 = 50 * itemCount5;
			num -= num2;
			return $"Total Movement Speed: {num}%";
		}

		private string CalculateTotalCritChance(Inventory inventory)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			int itemCount = inventory.GetItemCount(ItemCatalog.FindItemIndex("CritGlasses"));
			int itemCount2 = inventory.GetItemCount(ItemCatalog.FindItemIndex("HealOnCrit"));
			int itemCount3 = inventory.GetItemCount(ItemCatalog.FindItemIndex("AttackSpeedOnCrit"));
			int itemCount4 = inventory.GetItemCount(ItemCatalog.FindItemIndex("BleedOnHitAndExplode"));
			double num = 10 * itemCount + 5 * itemCount2 + 5 * itemCount3 + 5 * itemCount4;
			return $"Total Crit Chance: {num}%";
		}

		private string CalculateTotalAttackSpeed(Inventory inventory)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			int itemCount = inventory.GetItemCount(ItemCatalog.FindItemIndex("Syringe"));
			int itemCount2 = inventory.GetItemCount(ItemCatalog.FindItemIndex("AttackSpeedOnCrit"));
			int itemCount3 = inventory.GetItemCount(ItemCatalog.FindItemIndex("AttackSpeedAndMoveSpeed"));
			int itemCount4 = inventory.GetItemCount(ItemCatalog.FindItemIndex("HalfAttackSpeedHalfCooldowns"));
			double num = (double)(15 * itemCount + 12 * itemCount2) + 7.5 * (double)itemCount3;
			double num2 = 50 * itemCount4;
			num *= Math.Pow(0.5, itemCount4);
			return $"Total Attack Speed: {num}%";
		}
	}
}