Decompiled source of Downpour v1.0.12

Downpour.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using IL.RoR2;
using Inferno;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using R2API;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;

[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.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Downpour")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a440b19ca7c4f02af5970d07f89105d5a94e6d60")]
[assembly: AssemblyProduct("Downpour")]
[assembly: AssemblyTitle("Downpour")]
[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 Downpour
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("prodzpod.Downpour", "Downpour", "1.0.12")]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class DownpourPlugin : BaseUnityPlugin
	{
		public const string PluginGUID = "prodzpod.Downpour";

		public const string PluginAuthor = "prodzpod";

		public const string PluginName = "Downpour";

		public const string PluginVersion = "1.0.12";

		public static ManualLogSource Log;

		public static Harmony Harmony;

		internal static PluginInfo pluginInfo;

		public static ConfigFile Config;

		private static AssetBundle _assetBundle;

		public static ConfigEntry<bool> EnableRework;

		public static ConfigEntry<bool> EnableInferno;

		public static ConfigEntry<bool> EnableDownpour;

		public static ConfigEntry<bool> EnableBrimstone;

		public static ConfigEntry<bool> FasterSimulacrum;

		public static ConfigEntry<bool> GupNerf;

		public static ConfigEntry<float> ScalingDrizzle;

		public static ConfigEntry<float> ScalingMonsoon;

		public static ConfigEntry<float> ScalingInferno;

		public static ConfigEntry<float> ScalingMax;

		public static ConfigEntry<float> TempScaling;

		public static ConfigEntry<float> InitialScaling;

		public static ConfigEntry<float> StageScaling;

		public static ConfigEntry<float> SimulacrumBase;

		public static ConfigEntry<float> SimulacrumScaling;

		public static ConfigEntry<float> SimulacrumTempScaling;

		public static ConfigEntry<float> SimulacrumStageScaling;

		public static ConfigEntry<float> SimulacrumCountdown;

		public static ConfigEntry<float> SimulacrumBossHealth;

		public static ConfigEntry<float> ScalingDownpour;

		public static ConfigEntry<float> TempScalingDownpour;

		public static ConfigEntry<float> InitialScalingDownpour;

		public static ConfigEntry<float> StageScalingDownpour;

		public static ConfigEntry<float> SimulacrumBaseDownpour;

		public static ConfigEntry<float> SimulacrumScalingDownpour;

		public static ConfigEntry<float> SimulacrumTempScalingDownpour;

		public static ConfigEntry<float> SimulacrumStageScalingDownpour;

		public static ConfigEntry<float> SimulacrumCountdownDownpour;

		public static ConfigEntry<float> ScalingBrimstone;

		public static ConfigEntry<float> TempScalingBrimstone;

		public static ConfigEntry<float> InitialScalingBrimstone;

		public static ConfigEntry<float> StageScalingBrimstone;

		public static ConfigEntry<float> SimulacrumBaseBrimstone;

		public static ConfigEntry<float> SimulacrumScalingBrimstone;

		public static ConfigEntry<float> SimulacrumTempScalingBrimstone;

		public static ConfigEntry<float> SimulacrumStageScalingBrimstone;

		public static List<ConfigEntry<float>> AutoAdvance = new List<ConfigEntry<float>>();

		public static DifficultyDef Downpour;

		public static DifficultyIndex DownpourIndex;

		public static DifficultyDef Brimstone;

		public static DifficultyIndex BrimstoneIndex;

		public static List<DifficultyDef> DownpourList = new List<DifficultyDef>();

		public static List<DifficultyDef> BrimstoneList = new List<DifficultyDef>();

		public const bool DEBUG = false;

		public static AssetBundle AssetBundle
		{
			get
			{
				if ((Object)(object)_assetBundle == (Object)null)
				{
					_assetBundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(pluginInfo.Location), "downpour"));
				}
				return _assetBundle;
			}
		}

		public void Awake()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			Log = ((BaseUnityPlugin)this).Logger;
			Harmony = new Harmony("prodzpod.Downpour");
			Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.Downpour.cfg"), true);
			EnableRework = Config.Bind<bool>("Modules", "Enable All Difficulty Reworks", true, "Non-inferno, downpour, brimstone difficulty scaling will be reworked.");
			EnableInferno = Config.Bind<bool>("Modules", "Enable Inferno Reworks", true, "Inferno difficulty scaling will be reworked.");
			EnableDownpour = Config.Bind<bool>("Modules", "Enable Downpour Difficulty", true, "Downpour will be added.");
			EnableBrimstone = Config.Bind<bool>("Modules", "Enable Brimstone Difficulty", true, "Brimstone will be added.");
			FasterSimulacrum = Config.Bind<bool>("Modules", "Faster Simulacrum", true, "Force spawns more enemies upon all kill mid-wave.");
			GupNerf = Config.Bind<bool>("Modules", "Gup Rework", true, "Hopoo why (disables base regen and reduces health. Damage/speed increase for split versions instead.)");
			ScalingDrizzle = Config.Bind<float>("Difficulty Rework", "Drizzle Scaling Seconds", 600f, "Will be used with monsoon to calculate all difficulty.");
			ScalingMonsoon = Config.Bind<float>("Difficulty Rework", "Monsoon Scaling Seconds", 300f, "Will be used with drizzle to calculate all difficulty.");
			ScalingInferno = Config.Bind<float>("Difficulty Rework", "Inferno Scaling Seconds", 300f, "Special exception. set to 0 to disable.");
			ScalingMax = Config.Bind<float>("Difficulty Rework", "Max Scaling Seconds", 1200f, "Any def above it won't increase. Used to mitigate negative/zero.");
			TempScaling = Config.Bind<float>("Difficulty Rework", "Temporary Scaling Multiplier", 1f, "Scaling value that dissipates on next stage. Lower = harder.");
			InitialScaling = Config.Bind<float>("Difficulty Rework", "Initial Scaling", -0.5f, "Default: Monsoon starts as thunderstorm, and ends(stage 5) on typhoon");
			StageScaling = Config.Bind<float>("Downpour", "Stage Scaling Multiplier", 0.25f, "Default: rainstorm will become monsoon on stage 5.");
			SimulacrumBase = Config.Bind<float>("Difficulty Rework", "Simulacrum Scaling Seconds Base", 0f, "Base seconds to add/remove for simulacrum.");
			SimulacrumScaling = Config.Bind<float>("Difficulty Rework", "Simulacrum Scaling Multiplier", 2.5f, "Multiplied to normal game scaling time. Lower = harder");
			SimulacrumTempScaling = Config.Bind<float>("Difficulty Rework", "Simulacrum Temporary Scaling Multiplier", 0f, "Temporary scaling multiplier for simulacrum, takes simulacrum scaling.");
			SimulacrumStageScaling = Config.Bind<float>("Difficulty Rework", "Simulacrum Stage Scaling Multiplier", 1f, "Stage scaling multiplier for simulacrum, takes simulacrum scaling.");
			SimulacrumCountdown = Config.Bind<float>("Difficulty Rework", "Simulacrum Countdown", 3f, "Instead of the usual 10 seconds.");
			SimulacrumBossHealth = Config.Bind<float>("Difficulty Rework", "Simulacrum Special Boss Health before Wave 50", 0.33f, "It kills your run on full health");
			ScalingDownpour = Config.Bind<float>("Downpour", "Downpour Scaling Seconds", 180f, "Special exception. set to 0 to disable.");
			TempScalingDownpour = Config.Bind<float>("Downpour", "Downpour Temporary Scaling Multiplier", 0.5f, "Special exception.");
			InitialScalingDownpour = Config.Bind<float>("Downpour", "Downpour Initial Scaling", 2f, "Default: start identical to rainstorm.");
			StageScalingDownpour = Config.Bind<float>("Downpour", "Downpour Stage Scaling Multiplier", 0f, "Default: will become monsoon on stage 5.");
			SimulacrumBaseDownpour = Config.Bind<float>("Downpour", "Downpour Simulacrum Scaling Base", 0f, "Special exception.");
			SimulacrumScalingDownpour = Config.Bind<float>("Downpour", "Downpour Simulacrum Scaling Multiplier", 2.5f, "Special exception.");
			SimulacrumTempScalingDownpour = Config.Bind<float>("Downpour", "Downpour Simulacrum Temporary Scaling Multiplier", 2f, "Special exception.");
			SimulacrumStageScalingDownpour = Config.Bind<float>("Downpour", "Downpour Simulacrum Stage Scaling Multiplier", 1f, "Special exception.");
			SimulacrumCountdownDownpour = Config.Bind<float>("Downpour", "Downpour Simulacrum Countdown", 0f, "Instead of the usual 10 seconds.");
			ScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Scaling Seconds", 240f, "Special exception. set to 0 to disable.");
			TempScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Temporary Scaling Multiplier", 0.5f, "Special exception.");
			InitialScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Initial Scaling", 3f, "Default: start identical to rainstorm.");
			StageScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Stage Scaling Multiplier", 0f, "Default: will become monsoon on stage 5.");
			SimulacrumBaseBrimstone = Config.Bind<float>("Downpour", "Brimstone Simulacrum Scaling Seconds Base", 0f, "Special exception.");
			SimulacrumScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Simulacrum Scaling Seconds Multiplier", 2.5f, "Special exception.");
			SimulacrumTempScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Simulacrum Temporary Scaling Seconds Multiplier", 2f, "Special exception.");
			SimulacrumStageScalingBrimstone = Config.Bind<float>("Downpour", "Brimstone Simulacrum Temporary Stage Seconds Multiplier", 1f, "Special exception.");
			bool flag = false;
			if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
			{
				Options.Patch();
			}
			Harmony.PatchAll(typeof(Hooks.PatchOrder));
			if (EnableDownpour.Value)
			{
				AddDifficulty();
			}
			if (Chainloader.PluginInfos.ContainsKey("HIFU.Inferno") && EnableBrimstone.Value)
			{
				AddInfernoVariant();
			}
			Hooks.Patch();
			Run.onRunStartGlobal += Hooks.PatchRun;
			Run.onRunDestroyGlobal -= Hooks.PatchRun;
			Run.onRunStartGlobal += Hooks.PatchSimulacrum;
			Run.onRunDestroyGlobal -= Hooks.PatchSimulacrum;
			if (GupNerf.Value)
			{
				Hooks.PatchGup();
			}
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(Token.Patch));
		}

		public static void AddDifficulty()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			Downpour = new DifficultyDef(2f, "DOWNPOUR_NAME", "DOWNPOUR_ICON", "DOWNPOUR_DESC", Color32.op_Implicit(new Color32((byte)98, (byte)157, (byte)230, byte.MaxValue)), "DP", false);
			Downpour.iconSprite = AssetBundle.LoadAsset<Sprite>("Assets/downpour.png");
			Downpour.foundIconSprite = true;
			DownpourIndex = DifficultyAPI.AddDifficulty(Downpour);
			DownpourList.Add(Downpour);
		}

		public static void AddInfernoVariant()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			Brimstone = new DifficultyDef(3f, "BRIMSTONE_NAME", "BRIMSTONE_ICON", "BRIMSTONE_DESC", Color32.op_Implicit(new Color32((byte)213, (byte)145, (byte)242, byte.MaxValue)), "BS", false);
			Brimstone.iconSprite = AssetBundle.LoadAsset<Sprite>("Assets/brimstone.png");
			Brimstone.foundIconSprite = true;
			BrimstoneIndex = DifficultyAPI.AddDifficulty(Brimstone);
			DownpourList.Add(Brimstone);
			BrimstoneList.Add(Brimstone);
			Token.PatchBrimstone();
		}
	}
	public class Hooks
	{
		[HarmonyPatch(typeof(DifficultyAPI), "InitialiseRuleBookAndFinalizeList")]
		public class PatchOrder
		{
			public static void Postfix(ref RuleDef __result)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				Token.descs.Clear();
				foreach (RuleChoiceDef choice in __result.choices)
				{
					DifficultyDef difficultyDef = DifficultyCatalog.GetDifficultyDef(choice.difficultyIndex);
					Token.descs.Add(difficultyDef.descriptionToken, difficultyDef);
				}
				if (DownpourPlugin.EnableDownpour.Value || DownpourPlugin.EnableBrimstone.Value)
				{
					__result.choices.Sort((RuleChoiceDef x, RuleChoiceDef y) => GetSortValue(DifficultyCatalog.GetDifficultyDef(x.difficultyIndex)).CompareTo(GetSortValue(DifficultyCatalog.GetDifficultyDef(y.difficultyIndex))));
				}
			}

			public static float GetSortValue(DifficultyDef def)
			{
				return def.scalingValue + 5.9f * (float)((def.nameToken == "INFERNO_NAME") ? 1 : 0) + (float)(1000 * (DownpourPlugin.DownpourList.Contains(def) ? 1 : 0)) + (float)(1000 * (DownpourPlugin.BrimstoneList.Contains(def) ? 1 : 0));
			}
		}

		[CompilerGenerated]
		private static class <>O
		{
			public static hook_FixedUpdate <0>__Run_FixedUpdate;

			public static Manipulator <1>__Run_RecalculateDifficultyCoefficentInternal;

			public static Manipulator <2>__InfiniteTowerRun_RecalculateDifficultyCoefficentInternal;

			public static Func<float, Run, float> <3>__GetCoeff;

			public static Func<float, Run, float> <4>__GetAmbient;

			public static hook_Initialize <5>__InfiniteTowerWaveController_Initialize;

			public static hook_FixedUpdate <6>__InfiniteTowerWaveController_FixedUpdate;

			public static Action<CharacterBody> <7>__CharacterBody_OnBodyStartGlobal;
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Action<Run> <>9__5_0;

			public static Action<Stage> <>9__5_1;

			public static hook_OnRunAmbientLevelUp <>9__5_2;

			public static hook_OnCharacterLevelUp <>9__5_3;

			public static Func<Instruction, bool> <>9__8_0;

			public static Func<Instruction, bool> <>9__8_1;

			public static Func<Instruction, bool> <>9__8_2;

			public static Func<Instruction, bool> <>9__9_0;

			public static Func<Instruction, bool> <>9__9_1;

			public static Func<Run, float> <>9__9_2;

			public static Func<Instruction, bool> <>9__26_1;

			public static Func<ReadOnlyCollection<TeamComponent>, int, int> <>9__26_2;

			public static Manipulator <>9__26_0;

			internal void <Patch>b__5_0(Run run)
			{
				bool flag = false;
				lastStageTime = 0f;
				trueAmbientLevelFloor = -1;
				previousAmbientLevelFloor = -1;
				Run.ambientLevelCap = int.MaxValue;
			}

			internal void <Patch>b__5_1(Stage stage)
			{
				lastStageTime = Run.instance.GetRunStopwatch();
			}

			internal void <Patch>b__5_2(orig_OnRunAmbientLevelUp orig, Run run)
			{
				if (run.ambientLevelFloor <= 100)
				{
					orig.Invoke(run);
				}
			}

			internal void <Patch>b__5_3(orig_OnCharacterLevelUp orig, CharacterBody body)
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Invalid comparison between Unknown and I4
				if (body != null)
				{
					TeamComponent teamComponent = body.teamComponent;
					if (teamComponent != null)
					{
						_ = teamComponent.teamIndex;
						if (true && (int)body.teamComponent.teamIndex != 1 && Run.instance.ambientLevelFloor > 100)
						{
							return;
						}
					}
				}
				orig.Invoke(body);
			}

			internal bool <Run_RecalculateDifficultyCoefficentInternal>b__8_0(Instruction x)
			{
				return ILPatternMatchingExt.MatchStfld<Run>(x, "compensatedDifficultyCoefficient");
			}

			internal bool <Run_RecalculateDifficultyCoefficentInternal>b__8_1(Instruction x)
			{
				return ILPatternMatchingExt.MatchStfld<Run>(x, "difficultyCoefficient");
			}

			internal bool <Run_RecalculateDifficultyCoefficentInternal>b__8_2(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallOrCallvirt<Run>(x, "set_ambientLevel");
			}

			internal bool <InfiniteTowerRun_RecalculateDifficultyCoefficentInternal>b__9_0(Instruction x)
			{
				return ILPatternMatchingExt.MatchStfld<Run>(x, "difficultyCoefficient");
			}

			internal bool <InfiniteTowerRun_RecalculateDifficultyCoefficentInternal>b__9_1(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallOrCallvirt<Run>(x, "set_ambientLevel");
			}

			internal float <InfiniteTowerRun_RecalculateDifficultyCoefficentInternal>b__9_2(Run self)
			{
				return (self.compensatedDifficultyCoefficient - 1f) * 3f + 1f;
			}

			internal void <PatchGup>b__26_0(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_0039: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val = new ILCursor(il);
				val.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<TeamComponent>(x, "GetTeamMembers")
				});
				val.Emit(OpCodes.Dup);
				int index = val.Index;
				val.Index = index + 1;
				val.EmitDelegate<Func<ReadOnlyCollection<TeamComponent>, int, int>>((Func<ReadOnlyCollection<TeamComponent>, int, int>)delegate(ReadOnlyCollection<TeamComponent> list, int orig)
				{
					foreach (TeamComponent item in list)
					{
						if ((Object)(object)item.body != (Object)null && ((Object)item.body).name.Contains("GupBody"))
						{
							orig += 2;
						}
					}
					return orig;
				});
			}

			internal bool <PatchGup>b__26_1(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallOrCallvirt<TeamComponent>(x, "GetTeamMembers");
			}

			internal int <PatchGup>b__26_2(ReadOnlyCollection<TeamComponent> list, int orig)
			{
				foreach (TeamComponent item in list)
				{
					if ((Object)(object)item.body != (Object)null && ((Object)item.body).name.Contains("GupBody"))
					{
						orig += 2;
					}
				}
				return orig;
			}
		}

		public static float lastStageTime = 0f;

		public static int trueAmbientLevelFloor = -1;

		public static int previousAmbientLevelFloor = -1;

		public static bool onAmbientLevelUpEnabled = false;

		public static float targetTime = 0f;

		public static string[] targetStage = new string[5] { "golemplains", "goolake", "frozenwall", "shipgraveyard", "slumberingsatellite" };

		public static void Patch()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			Run.onRunStartGlobal += delegate
			{
				bool flag = false;
				lastStageTime = 0f;
				trueAmbientLevelFloor = -1;
				previousAmbientLevelFloor = -1;
				Run.ambientLevelCap = int.MaxValue;
			};
			Stage.onStageStartGlobal += delegate
			{
				lastStageTime = Run.instance.GetRunStopwatch();
			};
			object obj = <>c.<>9__5_2;
			if (obj == null)
			{
				hook_OnRunAmbientLevelUp val = delegate(orig_OnRunAmbientLevelUp orig, Run run)
				{
					if (run.ambientLevelFloor <= 100)
					{
						orig.Invoke(run);
					}
				};
				<>c.<>9__5_2 = val;
				obj = (object)val;
			}
			LevelUpEffectManager.OnRunAmbientLevelUp += (hook_OnRunAmbientLevelUp)obj;
			object obj2 = <>c.<>9__5_3;
			if (obj2 == null)
			{
				hook_OnCharacterLevelUp val2 = delegate(orig_OnCharacterLevelUp orig, CharacterBody body)
				{
					//IL_0011: Unknown result type (might be due to invalid IL or missing references)
					//IL_0020: Unknown result type (might be due to invalid IL or missing references)
					//IL_0026: Invalid comparison between Unknown and I4
					if (body != null)
					{
						TeamComponent teamComponent = body.teamComponent;
						if (teamComponent != null)
						{
							_ = teamComponent.teamIndex;
							if (true && (int)body.teamComponent.teamIndex != 1 && Run.instance.ambientLevelFloor > 100)
							{
								return;
							}
						}
					}
					orig.Invoke(body);
				};
				<>c.<>9__5_3 = val2;
				obj2 = (object)val2;
			}
			LevelUpEffectManager.OnCharacterLevelUp += (hook_OnCharacterLevelUp)obj2;
		}

		public static void PatchRun(Run run)
		{
			//IL_0024: 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_002f: Expected O, but got Unknown
			//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_0050: Expected O, but got Unknown
			bool flag = false;
			if (Enabled(run))
			{
				object obj = <>O.<1>__Run_RecalculateDifficultyCoefficentInternal;
				if (obj == null)
				{
					Manipulator val = Run_RecalculateDifficultyCoefficentInternal;
					<>O.<1>__Run_RecalculateDifficultyCoefficentInternal = val;
					obj = (object)val;
				}
				Run.RecalculateDifficultyCoefficentInternal += (Manipulator)obj;
				object obj2 = <>O.<2>__InfiniteTowerRun_RecalculateDifficultyCoefficentInternal;
				if (obj2 == null)
				{
					Manipulator val2 = InfiniteTowerRun_RecalculateDifficultyCoefficentInternal;
					<>O.<2>__InfiniteTowerRun_RecalculateDifficultyCoefficentInternal = val2;
					obj2 = (object)val2;
				}
				InfiniteTowerRun.RecalculateDifficultyCoefficentInternal += (Manipulator)obj2;
			}
		}

		public static void UnpatchRun(Run _)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			bool flag = false;
			object obj = <>O.<1>__Run_RecalculateDifficultyCoefficentInternal;
			if (obj == null)
			{
				Manipulator val = Run_RecalculateDifficultyCoefficentInternal;
				<>O.<1>__Run_RecalculateDifficultyCoefficentInternal = val;
				obj = (object)val;
			}
			Run.RecalculateDifficultyCoefficentInternal -= (Manipulator)obj;
			object obj2 = <>O.<2>__InfiniteTowerRun_RecalculateDifficultyCoefficentInternal;
			if (obj2 == null)
			{
				Manipulator val2 = InfiniteTowerRun_RecalculateDifficultyCoefficentInternal;
				<>O.<2>__InfiniteTowerRun_RecalculateDifficultyCoefficentInternal = val2;
				obj2 = (object)val2;
			}
			InfiniteTowerRun.RecalculateDifficultyCoefficentInternal -= (Manipulator)obj2;
		}

		public static void Run_RecalculateDifficultyCoefficentInternal(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStfld<Run>(x, "compensatedDifficultyCoefficient")
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<float, Run, float>>((Func<float, Run, float>)GetCoeff);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStfld<Run>(x, "difficultyCoefficient")
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<float, Run, float>>((Func<float, Run, float>)GetCoeff);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Run>(x, "set_ambientLevel")
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<float, Run, float>>((Func<float, Run, float>)GetAmbient);
		}

		public static void InfiniteTowerRun_RecalculateDifficultyCoefficentInternal(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStfld<Run>(x, "difficultyCoefficient")
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<float, Run, float>>((Func<float, Run, float>)GetCoeff);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Run>(x, "set_ambientLevel")
			});
			val.Emit(OpCodes.Pop);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<Run, float>>((Func<Run, float>)((Run self) => (self.compensatedDifficultyCoefficient - 1f) * 3f + 1f));
		}

		public static void Run_FixedUpdate(orig_FixedUpdate orig, Run self)
		{
			orig.Invoke(self);
			if (self.GetRunStopwatch() >= targetTime)
			{
				int num = (self.stageClearCount + 1) % 5;
				targetTime += DownpourPlugin.AutoAdvance[num].Value * 60f;
				Console.instance.SubmitCmd((NetworkUser)null, "next_stage " + targetStage[num], false);
			}
		}

		public static void PatchSimulacrum(Run run)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			if (run is InfiniteTowerRun)
			{
				object obj = <>O.<5>__InfiniteTowerWaveController_Initialize;
				if (obj == null)
				{
					hook_Initialize val = InfiniteTowerWaveController_Initialize;
					<>O.<5>__InfiniteTowerWaveController_Initialize = val;
					obj = (object)val;
				}
				InfiniteTowerWaveController.Initialize += (hook_Initialize)obj;
				object obj2 = <>O.<6>__InfiniteTowerWaveController_FixedUpdate;
				if (obj2 == null)
				{
					hook_FixedUpdate val2 = InfiniteTowerWaveController_FixedUpdate;
					<>O.<6>__InfiniteTowerWaveController_FixedUpdate = val2;
					obj2 = (object)val2;
				}
				InfiniteTowerWaveController.FixedUpdate += (hook_FixedUpdate)obj2;
				CharacterBody.onBodyStartGlobal += CharacterBody_OnBodyStartGlobal;
			}
		}

		public static void UnpatchSimulacrum(Run run)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			if (run is InfiniteTowerRun)
			{
				object obj = <>O.<5>__InfiniteTowerWaveController_Initialize;
				if (obj == null)
				{
					hook_Initialize val = InfiniteTowerWaveController_Initialize;
					<>O.<5>__InfiniteTowerWaveController_Initialize = val;
					obj = (object)val;
				}
				InfiniteTowerWaveController.Initialize -= (hook_Initialize)obj;
				object obj2 = <>O.<6>__InfiniteTowerWaveController_FixedUpdate;
				if (obj2 == null)
				{
					hook_FixedUpdate val2 = InfiniteTowerWaveController_FixedUpdate;
					<>O.<6>__InfiniteTowerWaveController_FixedUpdate = val2;
					obj2 = (object)val2;
				}
				InfiniteTowerWaveController.FixedUpdate -= (hook_FixedUpdate)obj2;
				CharacterBody.onBodyStartGlobal -= CharacterBody_OnBodyStartGlobal;
			}
		}

		public static void InfiniteTowerWaveController_Initialize(orig_Initialize orig, InfiniteTowerWaveController self, int index, Inventory inv, GameObject target)
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			if (DownpourPlugin.FasterSimulacrum.Value)
			{
				self.wavePeriodSeconds = 30f / Mathf.Clamp(GetScale(DifficultyCatalog.GetDifficultyDef(Run.instance.selectedDifficulty), Run.instance.GetRunStopwatch(), simulacrum: true), 1f, 10f);
				self.squadDefeatGracePeriod = 0f;
				self.secondsBeforeSuddenDeath = 180f;
				self.secondsBeforeFailsafe = 10f;
			}
			self.secondsAfterWave = (int)(DownpourPlugin.DownpourList.Contains(DifficultyCatalog.GetDifficultyDef(Run.instance.selectedDifficulty)) ? DownpourPlugin.SimulacrumCountdownDownpour.Value : DownpourPlugin.SimulacrumCountdown.Value);
			orig.Invoke(self, index, inv, target);
		}

		public static void InfiniteTowerWaveController_FixedUpdate(orig_FixedUpdate orig, InfiniteTowerWaveController self)
		{
			orig.Invoke(self);
			if (DownpourPlugin.FasterSimulacrum.Value && (Object)(object)self.combatSquad != (Object)null && self.combatSquad.memberCount == 0 && !self.haveAllEnemiesBeenDefeated)
			{
				self.totalWaveCredits -= self.creditsPerSecond;
				CombatDirector combatDirector = self.combatDirector;
				combatDirector.monsterCredit += self.creditsPerSecond;
				self.combatDirector.monsterSpawnTimer = 0f;
			}
		}

		public static void CharacterBody_OnBodyStartGlobal(CharacterBody body)
		{
			if ((((Object)body).name.Contains("Brother") || ((Object)body).name.Contains("TitanGold") || ((Object)body).name.Contains("EquipmentDrone") || ((Object)body).name.Contains("SuperRoboBallBoss")) && ((InfiniteTowerRun)/*isinst with value type is only supported in some contexts*/).waveIndex < 50)
			{
				body.baseMaxHealth *= DownpourPlugin.SimulacrumBossHealth.Value;
				body.RecalculateStats();
				body.healthComponent.Networkhealth = body.maxHealth;
			}
		}

		public static bool Enabled(Run run)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			return Enabled(DifficultyCatalog.GetDifficultyDef(run.selectedDifficulty), run is InfiniteTowerRun);
		}

		public static bool Enabled(DifficultyDef def, bool isSimulacrum)
		{
			if (!DownpourPlugin.DownpourList.Contains(def))
			{
				if (def.nameToken == "SUNNY_NAME")
				{
					return false;
				}
				if (def.nameToken == "INFERNO_NAME")
				{
					if (!DownpourPlugin.EnableInferno.Value)
					{
						return false;
					}
				}
				else if (!DownpourPlugin.EnableRework.Value)
				{
					return false;
				}
			}
			DownpourPlugin.Log.LogDebug((object)("Downpour is enabled for " + Language.GetString(def.nameToken)));
			return true;
		}

		public static float GetCoeff(float _, Run self)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			float runStopwatch = self.GetRunStopwatch();
			float num = Mathf.Floor(runStopwatch * 0.01666667f);
			DifficultyDef difficultyDef = DifficultyCatalog.GetDifficultyDef(self.selectedDifficulty);
			float num2 = 0.3f * (float)self.participatingPlayerCount + 0.7f;
			float stageScale = GetStageScale(difficultyDef, (self is InfiniteTowerRun) ? (((InfiniteTowerRun)((self is InfiniteTowerRun) ? self : null)).waveIndex / 5) : self.stageClearCount, self.participatingPlayerCount, self is InfiniteTowerRun);
			float scale = GetScale(difficultyDef, runStopwatch, self is InfiniteTowerRun);
			return Mathf.Clamp((stageScale * num + num2) * scale, 0f, 715827900f);
		}

		public static float GetAmbient(float _, Run self)
		{
			float num = 0.3f * (float)self.participatingPlayerCount + 0.7f;
			return (self.difficultyCoefficient - num) * 3f + 1f;
		}

		public static float GetScale(DifficultyDef def, float sec, bool simulacrum = false)
		{
			if (def == null)
			{
				return 1f;
			}
			float num;
			float num2;
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				num = DownpourPlugin.ScalingBrimstone.Value;
				if (simulacrum)
				{
					num = (num + DownpourPlugin.SimulacrumBaseBrimstone.Value) * DownpourPlugin.SimulacrumScalingBrimstone.Value;
				}
				num2 = num * DownpourPlugin.TempScalingBrimstone.Value;
				if (simulacrum)
				{
					num2 *= DownpourPlugin.SimulacrumTempScalingBrimstone.Value;
				}
			}
			else if (DownpourPlugin.DownpourList.Contains(def))
			{
				num = DownpourPlugin.ScalingDownpour.Value;
				if (simulacrum)
				{
					num = (num + DownpourPlugin.SimulacrumBaseDownpour.Value) * DownpourPlugin.SimulacrumScalingDownpour.Value;
				}
				num2 = num * DownpourPlugin.TempScalingDownpour.Value;
				if (simulacrum)
				{
					num2 *= DownpourPlugin.SimulacrumTempScalingDownpour.Value;
				}
			}
			else if (def.nameToken == "INFERNO_NAME")
			{
				num = DownpourPlugin.ScalingInferno.Value;
				if (simulacrum)
				{
					num = (num + DownpourPlugin.SimulacrumBase.Value) * DownpourPlugin.SimulacrumScaling.Value;
				}
				num2 = num * DownpourPlugin.TempScaling.Value;
				if (simulacrum)
				{
					num2 *= DownpourPlugin.SimulacrumTempScaling.Value;
				}
			}
			else
			{
				float num3 = (DownpourPlugin.ScalingDrizzle.Value - DownpourPlugin.ScalingMonsoon.Value) / 2f;
				float num4 = DownpourPlugin.ScalingDrizzle.Value + num3;
				num = Mathf.Max(DownpourPlugin.ScalingMax.Value, num4 - num3 * def.scalingValue);
				if (simulacrum)
				{
					num = (num + DownpourPlugin.SimulacrumBase.Value) * DownpourPlugin.SimulacrumScaling.Value;
				}
				num2 = num * DownpourPlugin.TempScaling.Value;
				if (simulacrum)
				{
					num2 *= DownpourPlugin.SimulacrumTempScaling.Value;
				}
			}
			return GetScaleInternal(num, num2, sec);
		}

		public static float GetScaleInternal(float diff, float temp, float sec)
		{
			return Mathf.Pow(1.15f, ((diff == 0f) ? 0f : (sec / diff)) + ((temp == 0f) ? 0f : ((sec - lastStageTime) / temp)));
		}

		public static float GetStageScale(DifficultyDef def, int stage, int people, bool simulacrum = false)
		{
			if (def == null)
			{
				return 1f;
			}
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				return GetStageScaleInternal(DownpourPlugin.InitialScalingBrimstone.Value + (float)stage * DownpourPlugin.StageScalingBrimstone.Value, people) * (simulacrum ? DownpourPlugin.SimulacrumStageScalingBrimstone.Value : 1f);
			}
			if (DownpourPlugin.DownpourList.Contains(def))
			{
				return GetStageScaleInternal(DownpourPlugin.InitialScalingDownpour.Value + (float)stage * DownpourPlugin.StageScalingDownpour.Value, people) * (simulacrum ? DownpourPlugin.SimulacrumStageScalingDownpour.Value : 1f);
			}
			return GetStageScaleInternal(def.scalingValue + DownpourPlugin.InitialScaling.Value + (float)stage * DownpourPlugin.StageScaling.Value, people) * (simulacrum ? DownpourPlugin.SimulacrumStageScaling.Value : 1f);
		}

		public static float GetStageScaleInternal(float coeff, int people)
		{
			return 0.0506f * coeff * Mathf.Pow((float)people, 0.2f);
		}

		public static void PatchGup()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			string[] array = new string[3] { "Gup", "Geep", "Gip" };
			foreach (string text in array)
			{
				CharacterBody component = Addressables.LoadAssetAsync<GameObject>((object)("RoR2/DLC1/Gup/" + text + "Body.prefab")).WaitForCompletion().GetComponent<CharacterBody>();
				component.baseMaxHealth *= 0.75f;
				component.levelMaxHealth *= 0.75f;
				component.baseRegen = 0f;
				component.levelRegen = 0f;
				if (text != "Gup")
				{
					component.baseDamage *= 1.3333334f;
					component.levelDamage *= 1.3333334f;
					component.baseMoveSpeed *= 1.5f;
					component.levelMoveSpeed *= 1.5f;
				}
			}
			object obj = <>c.<>9__26_0;
			if (obj == null)
			{
				Manipulator val = delegate(ILContext il)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0008: Expected O, but got Unknown
					//IL_0039: Unknown result type (might be due to invalid IL or missing references)
					ILCursor val2 = new ILCursor(il);
					val2.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<TeamComponent>(x, "GetTeamMembers")
					});
					val2.Emit(OpCodes.Dup);
					int index = val2.Index;
					val2.Index = index + 1;
					val2.EmitDelegate<Func<ReadOnlyCollection<TeamComponent>, int, int>>((Func<ReadOnlyCollection<TeamComponent>, int, int>)delegate(ReadOnlyCollection<TeamComponent> list, int orig)
					{
						foreach (TeamComponent item in list)
						{
							if ((Object)(object)item.body != (Object)null && ((Object)item.body).name.Contains("GupBody"))
							{
								orig += 2;
							}
						}
						return orig;
					});
				};
				<>c.<>9__26_0 = val;
				obj = (object)val;
			}
			MasterSummon.Perform += (Manipulator)obj;
		}
	}
	public class Options
	{
		public static void Patch()
		{
			ModSettingsManager.SetModIcon(DownpourPlugin.AssetBundle.LoadAsset<Sprite>("Assets/iconDownpour.png"), "prodzpod.Downpour", "Downpour");
			AddOption(DownpourPlugin.EnableRework, restart: true);
			AddOption(DownpourPlugin.EnableInferno, restart: true);
			AddOption(DownpourPlugin.EnableDownpour, restart: true);
			AddOption(DownpourPlugin.EnableBrimstone, restart: true);
			AddOption(DownpourPlugin.FasterSimulacrum, restart: true);
			AddOption(DownpourPlugin.ScalingDrizzle, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.ScalingMonsoon, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.ScalingInferno, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.ScalingMax, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.TempScaling, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.InitialScaling, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.StageScaling, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumBase, -600f, 600f, 15f);
			AddOption(DownpourPlugin.SimulacrumScaling, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumTempScaling, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumStageScaling, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumCountdown, 0f, 20f, 1f);
			AddOption(DownpourPlugin.SimulacrumBossHealth, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.ScalingDownpour, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.TempScalingDownpour, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.InitialScalingDownpour, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.StageScalingDownpour, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumBaseDownpour, -600f, 600f, 15f);
			AddOption(DownpourPlugin.SimulacrumScalingDownpour, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumTempScalingDownpour, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumStageScalingDownpour, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.ScalingBrimstone, 0f, 1200f, 15f);
			AddOption(DownpourPlugin.TempScalingBrimstone, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.InitialScalingBrimstone, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.StageScalingBrimstone, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumBaseBrimstone, -600f, 600f, 15f);
			AddOption(DownpourPlugin.SimulacrumScalingBrimstone, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumTempScalingBrimstone, 0f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumStageScalingBrimstone, -5f, 5f, 0.05f);
			AddOption(DownpourPlugin.SimulacrumCountdownDownpour, 0f, 20f, 1f);
			bool flag = false;
		}

		public static void AddOption(ConfigEntry<bool> entry, bool restart = false)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry, restart), "prodzpod.Downpour", "Downpour");
		}

		public static void AddOption(ConfigEntry<float> entry, float min, float max, float step)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			StepSliderConfig val = new StepSliderConfig();
			((SliderConfig)val).max = max;
			((SliderConfig)val).min = min;
			val.increment = step;
			ModSettingsManager.AddOption((BaseOption)new StepSliderOption(entry, val), "prodzpod.Downpour", "Downpour");
		}
	}
	public class Token
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_GetLocalizedStringByToken <>9__1_0;

			public static hook_GetLocalizedStringByToken <>9__2_0;

			internal string <Patch>b__1_0(orig_GetLocalizedStringByToken orig, Language self, string token)
			{
				if (descs.ContainsKey(token))
				{
					return GetDescription(orig.Invoke(self, token), descs[token]);
				}
				return orig.Invoke(self, token);
			}

			internal string <PatchBrimstone>b__2_0(orig_GetLocalizedStringByToken orig, Language self, string token)
			{
				if (token == "BRIMSTONE_DESC")
				{
					string text = "<style=cStack>>Player Health Regeneration: <style=cDeath>-40%</style>\n";
					if (Main.Scaling.Value > 0f && Main.Scaling.Value != 100f)
					{
						text = text + ">Difficulty Scaling: <style=" + ((Main.Scaling.Value < 100f) ? "cIsHealing" : "cDeath") + ">" + PercentFormat((Main.Scaling.Value - 100f) / 100f) + "% + Endless</style>\n";
					}
					if (Main.LevelAttackSpeed.Value > 0f || Main.LevelMoveSpeed.Value > 0f || Main.LevelRegen.Value > 0f)
					{
						text += ">Enemy Stats: <style=cDeath>Constantly Increasing</style>\n";
					}
					if (Main.ProjectileSpeed.Value > 1f)
					{
						text = text + ">Enemy Projectile Speed: <style=cDeath>+" + (Main.ProjectileSpeed.Value - 1f) * 100f + "%</style>\n";
					}
					if (Main.EnableCDirector.Value)
					{
						text += ">Combat Director: <style=cDeath>Resourceful</style>\n";
					}
					if (Main.LevelDiffBoost.Value > 0f)
					{
						text += ">Starting Difficulty: <style=cDeath>Increased</style>\n";
					}
					if (Main.EnableSkills.Value || Main.EnableStats.Value)
					{
						text += ">Enemy Abilities: <style=cDeath>Improved</style>\n";
					}
					if (Main.EnableAI.Value)
					{
						text = text + ">Enemy AI: <style=cDeath>Refined" + ((Main.AIScaling.Value > 0f) ? " + Evolving</style>\n" : "</style>\n");
					}
					if ((float)Main.MonsterLimit.Value != 40f)
					{
						text = text + ">Enemy Cap: <style=cDeath>" + (((float)Main.MonsterLimit.Value > 40f) ? "+" : "") + ((float)Main.MonsterLimit.Value - 40f) * 2.5f + "%</style>\n";
					}
					if (Main.AllyPermanentDamage.Value > 0f)
					{
						text += ">Allies receive <style=cDeath>permanent damage</style>\n";
					}
					return orig.Invoke(self, token).Replace("{INFERNO}", text + "</style>");
				}
				return orig.Invoke(self, token);
			}
		}

		public static Dictionary<string, DifficultyDef> descs = new Dictionary<string, DifficultyDef>();

		public static List<string> extraSpaces = new List<string> { "INFERNO_NAME", "BRIMSTONE_NAME", "CALYPSO_NAME", "TEMPEST_NAME", "SCYLLA_NAME", "SS2_DIFFICULTY_TYPHOON_DESC" };

		public static void Patch()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			object obj = <>c.<>9__1_0;
			if (obj == null)
			{
				hook_GetLocalizedStringByToken val = (orig_GetLocalizedStringByToken orig, Language self, string token) => descs.ContainsKey(token) ? GetDescription(orig.Invoke(self, token), descs[token]) : orig.Invoke(self, token);
				<>c.<>9__1_0 = val;
				obj = (object)val;
			}
			Language.GetLocalizedStringByToken += (hook_GetLocalizedStringByToken)obj;
		}

		public static void PatchBrimstone()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			object obj = <>c.<>9__2_0;
			if (obj == null)
			{
				hook_GetLocalizedStringByToken val = delegate(orig_GetLocalizedStringByToken orig, Language self, string token)
				{
					if (token == "BRIMSTONE_DESC")
					{
						string text = "<style=cStack>>Player Health Regeneration: <style=cDeath>-40%</style>\n";
						if (Main.Scaling.Value > 0f && Main.Scaling.Value != 100f)
						{
							text = text + ">Difficulty Scaling: <style=" + ((Main.Scaling.Value < 100f) ? "cIsHealing" : "cDeath") + ">" + PercentFormat((Main.Scaling.Value - 100f) / 100f) + "% + Endless</style>\n";
						}
						if (Main.LevelAttackSpeed.Value > 0f || Main.LevelMoveSpeed.Value > 0f || Main.LevelRegen.Value > 0f)
						{
							text += ">Enemy Stats: <style=cDeath>Constantly Increasing</style>\n";
						}
						if (Main.ProjectileSpeed.Value > 1f)
						{
							text = text + ">Enemy Projectile Speed: <style=cDeath>+" + (Main.ProjectileSpeed.Value - 1f) * 100f + "%</style>\n";
						}
						if (Main.EnableCDirector.Value)
						{
							text += ">Combat Director: <style=cDeath>Resourceful</style>\n";
						}
						if (Main.LevelDiffBoost.Value > 0f)
						{
							text += ">Starting Difficulty: <style=cDeath>Increased</style>\n";
						}
						if (Main.EnableSkills.Value || Main.EnableStats.Value)
						{
							text += ">Enemy Abilities: <style=cDeath>Improved</style>\n";
						}
						if (Main.EnableAI.Value)
						{
							text = text + ">Enemy AI: <style=cDeath>Refined" + ((Main.AIScaling.Value > 0f) ? " + Evolving</style>\n" : "</style>\n");
						}
						if ((float)Main.MonsterLimit.Value != 40f)
						{
							text = text + ">Enemy Cap: <style=cDeath>" + (((float)Main.MonsterLimit.Value > 40f) ? "+" : "") + ((float)Main.MonsterLimit.Value - 40f) * 2.5f + "%</style>\n";
						}
						if (Main.AllyPermanentDamage.Value > 0f)
						{
							text += ">Allies receive <style=cDeath>permanent damage</style>\n";
						}
						return orig.Invoke(self, token).Replace("{INFERNO}", text + "</style>");
					}
					return orig.Invoke(self, token);
				};
				<>c.<>9__2_0 = val;
				obj = (object)val;
			}
			Language.GetLocalizedStringByToken += (hook_GetLocalizedStringByToken)obj;
		}

		public static string GetDescription(string orig, DifficultyDef def)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			PreGameController instance = PreGameController.instance;
			int num;
			if (instance != null)
			{
				_ = instance.gameModeIndex;
				if (true)
				{
					num = (GameModeCatalog.GetGameModeName(PreGameController.instance.gameModeIndex).Contains("InfiniteTowerRun") ? 1 : 0);
					goto IL_0032;
				}
			}
			num = 0;
			goto IL_0032;
			IL_0032:
			bool flag = (byte)num != 0;
			if (!Hooks.Enabled(def, flag))
			{
				return orig;
			}
			DownpourPlugin.Log.LogDebug((object)("Applying downpour description for Difficulty " + def.nameToken));
			Match match = Regex.Match(orig.ToLower(), ">\\s*difficulty\\s*scaling:\\s*<style=\\w+>.+?</style>");
			string text = orig;
			int num2;
			if (match.Success)
			{
				num2 = match.Index;
				text = orig.Slice(0, match.Index) + orig.Slice(match.Index + match.Length);
			}
			else
			{
				num2 = orig.IndexOf("\n\n") + 2;
				if (num2 == 1)
				{
					num2 = orig.IndexOf("\r\n\r\n") + 4;
					if (num2 == 3)
					{
						text += "\n\n";
						num2 = text.Length;
					}
				}
			}
			string text2 = "<style=cStack>";
			string text3 = ((def.nameToken == "INFERNO_NAME" || def.nameToken == "BRIMSTONE_NAME") ? "cDeath" : "cIsHealth");
			float baseScaling = GetBaseScaling(def);
			if (baseScaling != 0f)
			{
				text2 = text2 + ">Difficulty Scaling: <style=" + ((baseScaling < 0f) ? "cIsHealing" : text3) + ">" + PercentFormat(baseScaling) + "%</style>\n";
			}
			float stageScaling = GetStageScaling(def, flag);
			if (stageScaling != 0f)
			{
				text2 = text2 + ">Linear Difficulty Scaling: <style=" + ((stageScaling < 0f) ? "cIsHealing" : text3) + ">" + PercentFormat(stageScaling) + "% per stage</style>\n";
			}
			float scaling = GetScaling(def, flag);
			if (scaling != 0f)
			{
				text2 += string.Format(">Exponential Difficulty Scaling:\n    <style={0}>x115% every {1} minute{2}</style>\n", text3, scaling / 60f, (scaling > 60f) ? "s" : "");
			}
			float tempScaling = GetTempScaling(def, flag);
			if (tempScaling != 0f)
			{
				text2 += string.Format(">Temporary Difficulty Scaling:\n    <style={0}>x115% every {1} minute{2}, resets every stage</style>\n", text3, tempScaling / 60f, (tempScaling > 60f) ? "s" : "");
			}
			if (extraSpaces.Contains(def.nameToken))
			{
				text2 = text2.Substring(0, text2.Length - 1);
			}
			text2 += "</style>";
			return text.Slice(0, num2) + text2 + text.Slice(num2);
		}

		public static string PercentFormat(float val)
		{
			return ((val > 0f) ? "+" : "") + val * 100f;
		}

		public static float GetBaseScaling(DifficultyDef def, bool simulacrum = false)
		{
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				return (DownpourPlugin.InitialScalingBrimstone.Value - 2f) * 0.5f;
			}
			if (DownpourPlugin.DownpourList.Contains(def))
			{
				return (DownpourPlugin.InitialScalingDownpour.Value - 2f) * 0.5f;
			}
			return (def.scalingValue + DownpourPlugin.InitialScaling.Value - 2f) * 0.5f;
		}

		public static float GetStageScaling(DifficultyDef def, bool simulacrum = false)
		{
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				return DownpourPlugin.StageScalingBrimstone.Value * (simulacrum ? DownpourPlugin.SimulacrumStageScalingBrimstone.Value : 1f);
			}
			if (DownpourPlugin.DownpourList.Contains(def))
			{
				return DownpourPlugin.StageScalingDownpour.Value * (simulacrum ? DownpourPlugin.SimulacrumStageScalingDownpour.Value : 1f);
			}
			return DownpourPlugin.StageScaling.Value * (simulacrum ? DownpourPlugin.SimulacrumStageScaling.Value : 1f) * 0.25f;
		}

		public static float GetScaling(DifficultyDef def, bool simulacrum = false)
		{
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				return GetScalingInternal(DownpourPlugin.ScalingBrimstone.Value, simulacrum, DownpourPlugin.SimulacrumBaseBrimstone.Value, DownpourPlugin.SimulacrumScalingBrimstone.Value);
			}
			if (DownpourPlugin.DownpourList.Contains(def))
			{
				return GetScalingInternal(DownpourPlugin.ScalingDownpour.Value, simulacrum, DownpourPlugin.SimulacrumBaseDownpour.Value, DownpourPlugin.SimulacrumScalingDownpour.Value);
			}
			if (def.nameToken == "INFERNO_NAME")
			{
				return GetScalingInternal(DownpourPlugin.ScalingInferno.Value, simulacrum, DownpourPlugin.SimulacrumBase.Value, DownpourPlugin.SimulacrumScaling.Value);
			}
			float num = (DownpourPlugin.ScalingDrizzle.Value - DownpourPlugin.ScalingMonsoon.Value) / 2f;
			float num2 = DownpourPlugin.ScalingDrizzle.Value + num;
			return GetScalingInternal(Mathf.Min(DownpourPlugin.ScalingMax.Value, num2 - num * def.scalingValue), simulacrum, DownpourPlugin.SimulacrumBase.Value, DownpourPlugin.SimulacrumScaling.Value);
		}

		public static float GetScalingInternal(float orig, bool simulacrum, float simulinit, float simulmult)
		{
			if (simulacrum)
			{
				return (orig + simulinit) * simulmult;
			}
			return orig;
		}

		public static float GetTempScaling(DifficultyDef def, bool simulacrum = false)
		{
			if (DownpourPlugin.BrimstoneList.Contains(def))
			{
				return GetScalingInternal(DownpourPlugin.ScalingBrimstone.Value, simulacrum, DownpourPlugin.SimulacrumBaseBrimstone.Value, DownpourPlugin.SimulacrumScalingBrimstone.Value) * DownpourPlugin.TempScalingBrimstone.Value * (simulacrum ? DownpourPlugin.SimulacrumTempScalingBrimstone.Value : 1f);
			}
			if (DownpourPlugin.DownpourList.Contains(def))
			{
				return GetScalingInternal(DownpourPlugin.ScalingDownpour.Value, simulacrum, DownpourPlugin.SimulacrumBaseDownpour.Value, DownpourPlugin.SimulacrumScalingDownpour.Value) * DownpourPlugin.TempScalingDownpour.Value * (simulacrum ? DownpourPlugin.SimulacrumTempScalingDownpour.Value : 1f);
			}
			if (def.nameToken == "INFERNO_NAME")
			{
				return GetScalingInternal(DownpourPlugin.ScalingInferno.Value, simulacrum, DownpourPlugin.SimulacrumBase.Value, DownpourPlugin.SimulacrumScaling.Value) * DownpourPlugin.TempScaling.Value * (simulacrum ? DownpourPlugin.SimulacrumTempScaling.Value : 1f);
			}
			float num = (DownpourPlugin.ScalingDrizzle.Value - DownpourPlugin.ScalingMonsoon.Value) / 2f;
			float num2 = DownpourPlugin.ScalingDrizzle.Value + num;
			return GetScalingInternal(Mathf.Min(DownpourPlugin.ScalingMax.Value, num2 - num * def.scalingValue), simulacrum, DownpourPlugin.SimulacrumBase.Value, DownpourPlugin.SimulacrumScaling.Value) * DownpourPlugin.TempScaling.Value * (simulacrum ? DownpourPlugin.SimulacrumTempScaling.Value : 1f);
		}
	}
	public static class Extension
	{
		public static string Slice(this string orig, int begin, int length = -1)
		{
			if (begin >= orig.Length)
			{
				return "";
			}
			begin = (begin % orig.Length + orig.Length) % orig.Length;
			if (length < 0 || begin + length >= orig.Length)
			{
				return orig.Substring(begin);
			}
			return orig.Substring(begin, length);
		}
	}
}