Decompiled source of FasterBossWait2 v1.1.9

EvenFasterBossWait.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
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.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("EvenFasterBossWait")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6a5c6aebb9dbedb597f46ed9edca8b69d77e2b77")]
[assembly: AssemblyProduct("EvenFasterBossWait")]
[assembly: AssemblyTitle("EvenFasterBossWait")]
[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 EvenFasterBossWait
{
	public static class Extensions
	{
		public static bool victimIsMiniboss(this DamageReport report)
		{
			return (report?.victimMaster?.isMiniboss()).GetValueOrDefault();
		}

		public static bool isMiniboss(this CharacterBody body)
		{
			return ((body == null) ? null : body.master?.isMiniboss()).GetValueOrDefault();
		}

		public static bool isMiniboss(this CharacterMaster master)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			return Hooks.Minibosses.Contains((master != null) ? master.masterIndex : MasterIndex.none);
		}

		public static EliteDef[] affixes(this CharacterBody body)
		{
			return body?.activeBuffsList?.ToList()?.FindAll(delegate(BuffIndex x)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				BuffDef buffDef = BuffCatalog.GetBuffDef(x);
				return buffDef != null && buffDef.isElite;
			}).ConvertAll((BuffIndex x) => BuffCatalog.GetBuffDef(x).eliteDef).ToArray() ?? Array.Empty<EliteDef>();
		}

		public static bool isT2(this EliteDef elite)
		{
			return (CombatDirector.eliteTiers?.First((EliteTierDef x) => x.eliteTypes.Contains(Elites.Poison))?.eliteTypes?.Contains(elite)).GetValueOrDefault();
		}
	}
	public class Hooks
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Action<Run> <>9__4_0;

			public static Predicate<Category> <>9__4_11;

			public static hook_GenerateDirectorCardWeightedSelection <>9__4_1;

			public static hook_OnEnable <>9__4_2;

			public static hook_FixedUpdate <>9__4_3;

			public static hook_OnDisable <>9__4_4;

			public static hook_OnEnable <>9__4_5;

			public static Func<EliteDef, bool> <>9__4_16;

			public static Func<EliteDef, bool> <>9__4_15;

			public static Action<DamageReport> <>9__4_6;

			public static Action<BossGroup> <>9__4_7;

			public static hook_OnDisable <>9__4_8;

			public static hook_ApplyRate <>9__4_9;

			public static hook_ApplyRadius <>9__4_10;

			internal void <Patch>b__4_0(Run _)
			{
				ActiveZones.Clear();
				BossKilled.Clear();
				ChargeCredit.Clear();
			}

			internal WeightedSelection<DirectorCard> <Patch>b__4_1(orig_GenerateDirectorCardWeightedSelection orig, DirectorCardCategorySelection self)
			{
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: 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_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				Category val = self.categories.ToList().Find((Category x) => x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3));
				if (!((object)(Category)(ref val)).Equals((object)default(Category)))
				{
					Minibosses.Clear();
					DirectorCard[] cards = val.cards;
					foreach (DirectorCard val2 in cards)
					{
						if (!val2.IsAvailable())
						{
							continue;
						}
						object obj;
						if (val2 == null)
						{
							obj = null;
						}
						else
						{
							SpawnCard spawnCard = val2.spawnCard;
							if (spawnCard == null)
							{
								obj = null;
							}
							else
							{
								GameObject prefab = spawnCard.prefab;
								obj = ((prefab != null) ? prefab.GetComponent<CharacterMaster>() : null);
							}
						}
						if (obj == null)
						{
							obj = null;
						}
						CharacterMaster val3 = (CharacterMaster)obj;
						if (!((Object)(object)val3 == (Object)null))
						{
							Minibosses.Add(val3.masterIndex);
						}
					}
					Main.Log.LogDebug((object)("Repopulated miniboss list with " + Minibosses.Count + " element(s)."));
				}
				return orig.Invoke(self);
			}

			internal bool <Patch>b__4_11(Category x)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				return x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3);
			}

			internal void <Patch>b__4_2(orig_OnEnable orig, OutsideInteractableLocker self)
			{
				if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
				{
					orig.Invoke(self);
				}
			}

			internal void <Patch>b__4_3(orig_FixedUpdate orig, OutsideInteractableLocker self)
			{
				if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
				{
					orig.Invoke(self);
				}
			}

			internal void <Patch>b__4_4(orig_OnDisable orig, OutsideInteractableLocker self)
			{
				if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
				{
					orig.Invoke(self);
				}
			}

			internal void <Patch>b__4_5(orig_OnEnable orig, HoldoutZoneController self)
			{
				//IL_028d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0297: Expected O, but got Unknown
				//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_02f1: Expected O, but got Unknown
				//IL_0654: Unknown result type (might be due to invalid IL or missing references)
				//IL_065e: Expected O, but got Unknown
				<>c__DisplayClass4_0 CS$<>8__locals0 = new <>c__DisplayClass4_0
				{
					self = self
				};
				if (Run.instance is InfiniteTowerRun)
				{
					return;
				}
				foreach (Main.HoldoutMultiplierInfo holdoutMultiplier in Main.HoldoutMultipliers)
				{
					if (((Object)((Component)CS$<>8__locals0.self).gameObject).name.Contains(holdoutMultiplier.name))
					{
						ActiveZones.Add(CS$<>8__locals0.self, holdoutMultiplier);
					}
				}
				if (!ActiveZones.ContainsKey(CS$<>8__locals0.self))
				{
					ActiveZones.Add(CS$<>8__locals0.self, Main.DefaultHoldoutInfo);
				}
				BossKilled.Add(CS$<>8__locals0.self, value: false);
				ChargeCredit.Add(CS$<>8__locals0.self, 0f);
				if (ActiveZones[CS$<>8__locals0.self].time >= 0f)
				{
					CS$<>8__locals0.self.baseChargeDuration = ActiveZones[CS$<>8__locals0.self].time * Mathf.Lerp(1f, Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount), ActiveZones[CS$<>8__locals0.self].mult);
				}
				if (ActiveZones[CS$<>8__locals0.self].area >= 0f)
				{
					CS$<>8__locals0.self.baseRadius = ActiveZones[CS$<>8__locals0.self].area * Mathf.Lerp(1f, Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount), ActiveZones[CS$<>8__locals0.self].mult);
				}
				if ((Object)(object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[CS$<>8__locals0.self].multBoss >= 0f)
				{
					CS$<>8__locals0.self.calcChargeRate += (CalcChargeRateDelegate)delegate(ref float rate)
					{
						if (BossKilled[CS$<>8__locals0.self])
						{
							rate *= ActiveZones[CS$<>8__locals0.self].multBoss;
						}
					};
				}
				if ((Object)(object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[CS$<>8__locals0.self].areaBoss >= 0f)
				{
					CS$<>8__locals0.self.calcRadius += (CalcRadiusDelegate)delegate(ref float radius)
					{
						if (BossKilled[CS$<>8__locals0.self])
						{
							radius *= ActiveZones[CS$<>8__locals0.self].areaBoss / ActiveZones[CS$<>8__locals0.self].area;
						}
					};
				}
				if (Main.DebugMode.Value)
				{
					Main.Log.LogInfo((object)("Holdout Zone Begin, boss: " + (object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != null));
					Main.Log.LogInfo((object)$"Zone Info ({ActiveZones[CS$<>8__locals0.self].name}): {ActiveZones[CS$<>8__locals0.self].time} time, {ActiveZones[CS$<>8__locals0.self].mult} mult, {ActiveZones[CS$<>8__locals0.self].area} area, {ActiveZones[CS$<>8__locals0.self].multBoss} multBoss, {ActiveZones[CS$<>8__locals0.self].areaBoss} areaBoss");
					Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop");
					Main.Log.LogInfo((object)$"Result: {CS$<>8__locals0.self.baseChargeDuration}(x{ActiveZones[CS$<>8__locals0.self].multBoss}b) time, {CS$<>8__locals0.self.baseRadius}(x{ActiveZones[CS$<>8__locals0.self].areaBoss / ActiveZones[CS$<>8__locals0.self].area}b) area");
				}
				CS$<>8__locals0.self.calcAccumulatedCharge += (CalcAccumulatedChargeDelegate)delegate(ref float charge)
				{
					if (ChargeCredit[CS$<>8__locals0.self] > 0f)
					{
						charge += ChargeCredit[CS$<>8__locals0.self];
						ChargeCredit[CS$<>8__locals0.self] = 0f;
					}
				};
				orig.Invoke(CS$<>8__locals0.self);
			}

			internal void <Patch>b__4_6(DamageReport report)
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Invalid comparison between Unknown and I4
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_0471: Unknown result type (might be due to invalid IL or missing references)
				if (report == null)
				{
					return;
				}
				CharacterBody victimBody = report.victimBody;
				if (victimBody == null)
				{
					return;
				}
				TeamComponent teamComponent = victimBody.teamComponent;
				if (teamComponent == null)
				{
					return;
				}
				_ = teamComponent.teamIndex;
				if (false || report == null)
				{
					return;
				}
				CharacterBody attackerBody = report.attackerBody;
				if (attackerBody == null)
				{
					return;
				}
				TeamComponent teamComponent2 = attackerBody.teamComponent;
				if (teamComponent2 == null)
				{
					return;
				}
				_ = teamComponent2.teamIndex;
				if (false || !TeamManager.IsTeamEnemy((TeamIndex)1, report.victimBody.teamComponent.teamIndex) || (int)report.attackerBody.teamComponent.teamIndex != 1)
				{
					return;
				}
				foreach (HoldoutZoneController key in ActiveZones.Keys)
				{
					if (report.victimIsBoss || key.baseChargeDuration <= 0f)
					{
						continue;
					}
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)("Kill Credited, base: " + ActiveZones[key].kill));
					}
					if (ActiveZones[key].kill == 0f)
					{
						continue;
					}
					float num = Main.Value.Value + report.victimBody.baseMaxHealth * Main.ValuePerHP.Value;
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)$"base: {Main.Value.Value}({Main.Value.Value}+{report.victimBody.baseMaxHealth}x{Main.ValuePerHP.Value})");
					}
					if (report.victimIsElite)
					{
						num += Main.EliteBonus.Value;
					}
					if (report.victimBody.affixes().Any((EliteDef x) => x.isT2()))
					{
						num += Main.EliteT2Bonus.Value;
					}
					if (report.victimIsMiniboss())
					{
						num += Main.MinibossBonus.Value;
					}
					if (report.victimIsChampion)
					{
						num += Main.BossBonus.Value;
					}
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)("bonuses: " + (report.victimIsElite ? $"+{Main.EliteBonus.Value} (elite)" : "") + (report.victimBody.affixes().Any((EliteDef x) => x.isT2()) ? $"+{Main.EliteT2Bonus.Value} (T2)" : "") + (report.victimIsMiniboss() ? $"+{Main.MinibossBonus.Value} (miniboss)" : "") + (report.victimIsChampion ? $"+{Main.BossBonus.Value} (champion)" : "")));
					}
					num *= ActiveZones[key].kill;
					if ((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key])
					{
						num *= Main.PreBossKillPenalty.Value;
					}
					if (!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition))
					{
						num *= Main.OutsideRangePenalty.Value;
					}
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)("multipliers: " + ActiveZones[key].kill + (((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) ? $"x{Main.PreBossKillPenalty.Value} (prebosskill)" : "") + ((!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) ? $"x{Main.OutsideRangePenalty.Value} (outsiderange)" : "") + (Main.UseFixedTime.Value ? $"x1s(out of {key.baseChargeDuration})" : "x1%")));
					}
					if (num == 0f)
					{
						break;
					}
					ChargeCredit[key] += num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f);
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)("Return:" + num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f)));
					}
					if (Main.CompensateKills.Value == 0f)
					{
						continue;
					}
					if (!Main.UseFixedTime.Value)
					{
						float num2 = 1f / key.baseChargeDuration;
						CalcChargeRateDelegate val = AccessTools.FieldRefAccess<CalcChargeRateDelegate>(typeof(HoldoutZoneController), "calcChargeRate").Invoke((object)key);
						if (val != null)
						{
							val.Invoke(ref num2);
						}
						num *= 0.01f / num2;
						if (Main.DebugMode.Value)
						{
							Main.Log.LogInfo((object)"ChargeRate accessed");
						}
					}
					if (Main.GeneralScalingCompensation.Value != 0f)
					{
						num /= Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value);
					}
					Run.instance.SetRunStopwatch(Run.instance.GetRunStopwatch() + num * Main.CompensateKills.Value);
					if (Main.DebugMode.Value)
					{
						Main.Log.LogInfo((object)"Time Compensated");
						Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop");
						Main.Log.LogInfo((object)$"Result: a{ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount))}, b{Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value)}({ActiveZones[key].mult} mult), charge{num}, d{Main.CompensateKills.Value}");
					}
				}
			}

			internal bool <Patch>b__4_16(EliteDef x)
			{
				return x.isT2();
			}

			internal bool <Patch>b__4_15(EliteDef x)
			{
				return x.isT2();
			}

			internal void <Patch>b__4_7(BossGroup group)
			{
				if ((Object)(object)TeleporterInteraction.instance?.bossGroup != (Object)null && (Object)(object)TeleporterInteraction.instance.bossGroup == (Object)(object)group && BossKilled.ContainsKey(TeleporterInteraction.instance.holdoutZoneController))
				{
					BossKilled[TeleporterInteraction.instance.holdoutZoneController] = true;
					if (Main.UnlockInteractablesPostBoss.Value && Object.op_Implicit((Object)(object)TeleporterInteraction.instance.outsideInteractableLocker))
					{
						((Behaviour)TeleporterInteraction.instance.outsideInteractableLocker).enabled = false;
					}
				}
			}

			internal void <Patch>b__4_8(orig_OnDisable orig, HoldoutZoneController self)
			{
				if (ActiveZones.ContainsKey(self))
				{
					ActiveZones.Remove(self);
				}
				if (BossKilled.ContainsKey(self))
				{
					BossKilled.Remove(self);
				}
				if (ChargeCredit.ContainsKey(self))
				{
					ChargeCredit.Remove(self);
				}
				orig.Invoke(self);
			}

			internal void <Patch>b__4_9(orig_ApplyRate orig, MonoBehaviour self, ref float rate)
			{
				//IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references)
				int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount;
				if (Main.FocusedConvergenceRateLimit.Value >= 0)
				{
					((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRateLimit.Value);
				}
				orig.Invoke(self, ref rate);
				((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount;
			}

			internal void <Patch>b__4_10(orig_ApplyRadius orig, MonoBehaviour self, ref float radius)
			{
				//IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references)
				int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount;
				if (Main.FocusedConvergenceRangeLimit.Value >= 0)
				{
					((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRangeLimit.Value);
				}
				orig.Invoke(self, ref radius);
				((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount;
			}
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass4_0
		{
			public HoldoutZoneController self;

			internal void <Patch>b__12(ref float rate)
			{
				if (BossKilled[self])
				{
					rate *= ActiveZones[self].multBoss;
				}
			}

			internal void <Patch>b__13(ref float radius)
			{
				if (BossKilled[self])
				{
					radius *= ActiveZones[self].areaBoss / ActiveZones[self].area;
				}
			}

			internal void <Patch>b__14(ref float charge)
			{
				if (ChargeCredit[self] > 0f)
				{
					charge += ChargeCredit[self];
					ChargeCredit[self] = 0f;
				}
			}
		}

		public static List<MasterIndex> Minibosses = new List<MasterIndex>();

		public static Dictionary<HoldoutZoneController, Main.HoldoutMultiplierInfo> ActiveZones = new Dictionary<HoldoutZoneController, Main.HoldoutMultiplierInfo>();

		public static Dictionary<HoldoutZoneController, bool> BossKilled = new Dictionary<HoldoutZoneController, bool>();

		public static Dictionary<HoldoutZoneController, float> ChargeCredit = new Dictionary<HoldoutZoneController, float>();

		public static void Patch()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//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
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Expected O, but got Unknown
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Expected O, but got Unknown
			Run.onRunStartGlobal += delegate
			{
				ActiveZones.Clear();
				BossKilled.Clear();
				ChargeCredit.Clear();
			};
			object obj = <>c.<>9__4_1;
			if (obj == null)
			{
				hook_GenerateDirectorCardWeightedSelection val = delegate(orig_GenerateDirectorCardWeightedSelection orig, DirectorCardCategorySelection self)
				{
					//IL_002b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0030: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: 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_0063: Unknown result type (might be due to invalid IL or missing references)
					//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
					Category val10 = self.categories.ToList().Find((Category x) => x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3));
					if (!((object)(Category)(ref val10)).Equals((object)default(Category)))
					{
						Minibosses.Clear();
						DirectorCard[] cards = val10.cards;
						foreach (DirectorCard val11 in cards)
						{
							if (val11.IsAvailable())
							{
								object obj9;
								if (val11 == null)
								{
									obj9 = null;
								}
								else
								{
									SpawnCard spawnCard = val11.spawnCard;
									if (spawnCard == null)
									{
										obj9 = null;
									}
									else
									{
										GameObject prefab = spawnCard.prefab;
										obj9 = ((prefab != null) ? prefab.GetComponent<CharacterMaster>() : null);
									}
								}
								if (obj9 == null)
								{
									obj9 = null;
								}
								CharacterMaster val12 = (CharacterMaster)obj9;
								if (!((Object)(object)val12 == (Object)null))
								{
									Minibosses.Add(val12.masterIndex);
								}
							}
						}
						Main.Log.LogDebug((object)("Repopulated miniboss list with " + Minibosses.Count + " element(s)."));
					}
					return orig.Invoke(self);
				};
				<>c.<>9__4_1 = val;
				obj = (object)val;
			}
			DirectorCardCategorySelection.GenerateDirectorCardWeightedSelection += (hook_GenerateDirectorCardWeightedSelection)obj;
			object obj2 = <>c.<>9__4_2;
			if (obj2 == null)
			{
				hook_OnEnable val2 = delegate(orig_OnEnable orig, OutsideInteractableLocker self)
				{
					if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
					{
						orig.Invoke(self);
					}
				};
				<>c.<>9__4_2 = val2;
				obj2 = (object)val2;
			}
			OutsideInteractableLocker.OnEnable += (hook_OnEnable)obj2;
			object obj3 = <>c.<>9__4_3;
			if (obj3 == null)
			{
				hook_FixedUpdate val3 = delegate(orig_FixedUpdate orig, OutsideInteractableLocker self)
				{
					if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
					{
						orig.Invoke(self);
					}
				};
				<>c.<>9__4_3 = val3;
				obj3 = (object)val3;
			}
			OutsideInteractableLocker.FixedUpdate += (hook_FixedUpdate)obj3;
			object obj4 = <>c.<>9__4_4;
			if (obj4 == null)
			{
				hook_OnDisable val4 = delegate(orig_OnDisable orig, OutsideInteractableLocker self)
				{
					if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid")))
					{
						orig.Invoke(self);
					}
				};
				<>c.<>9__4_4 = val4;
				obj4 = (object)val4;
			}
			OutsideInteractableLocker.OnDisable += (hook_OnDisable)obj4;
			object obj5 = <>c.<>9__4_5;
			if (obj5 == null)
			{
				hook_OnEnable val5 = delegate(orig_OnEnable orig, HoldoutZoneController self)
				{
					//IL_028d: Unknown result type (might be due to invalid IL or missing references)
					//IL_0297: Expected O, but got Unknown
					//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
					//IL_02f1: Expected O, but got Unknown
					//IL_0654: Unknown result type (might be due to invalid IL or missing references)
					//IL_065e: Expected O, but got Unknown
					if (!(Run.instance is InfiniteTowerRun))
					{
						foreach (Main.HoldoutMultiplierInfo holdoutMultiplier in Main.HoldoutMultipliers)
						{
							if (((Object)((Component)self).gameObject).name.Contains(holdoutMultiplier.name))
							{
								ActiveZones.Add(self, holdoutMultiplier);
							}
						}
						if (!ActiveZones.ContainsKey(self))
						{
							ActiveZones.Add(self, Main.DefaultHoldoutInfo);
						}
						BossKilled.Add(self, value: false);
						ChargeCredit.Add(self, 0f);
						if (ActiveZones[self].time >= 0f)
						{
							self.baseChargeDuration = ActiveZones[self].time * Mathf.Lerp(1f, Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount), ActiveZones[self].mult);
						}
						if (ActiveZones[self].area >= 0f)
						{
							self.baseRadius = ActiveZones[self].area * Mathf.Lerp(1f, Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount), ActiveZones[self].mult);
						}
						if ((Object)(object)((Component)self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[self].multBoss >= 0f)
						{
							self.calcChargeRate += (CalcChargeRateDelegate)delegate(ref float rate)
							{
								if (BossKilled[self])
								{
									rate *= ActiveZones[self].multBoss;
								}
							};
						}
						if ((Object)(object)((Component)self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[self].areaBoss >= 0f)
						{
							self.calcRadius += (CalcRadiusDelegate)delegate(ref float radius)
							{
								if (BossKilled[self])
								{
									radius *= ActiveZones[self].areaBoss / ActiveZones[self].area;
								}
							};
						}
						if (Main.DebugMode.Value)
						{
							Main.Log.LogInfo((object)("Holdout Zone Begin, boss: " + (object)((Component)self).gameObject.GetComponent<BossGroup>() != null));
							Main.Log.LogInfo((object)$"Zone Info ({ActiveZones[self].name}): {ActiveZones[self].time} time, {ActiveZones[self].mult} mult, {ActiveZones[self].area} area, {ActiveZones[self].multBoss} multBoss, {ActiveZones[self].areaBoss} areaBoss");
							Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop");
							Main.Log.LogInfo((object)$"Result: {self.baseChargeDuration}(x{ActiveZones[self].multBoss}b) time, {self.baseRadius}(x{ActiveZones[self].areaBoss / ActiveZones[self].area}b) area");
						}
						self.calcAccumulatedCharge += (CalcAccumulatedChargeDelegate)delegate(ref float charge)
						{
							if (ChargeCredit[self] > 0f)
							{
								charge += ChargeCredit[self];
								ChargeCredit[self] = 0f;
							}
						};
						orig.Invoke(self);
					}
				};
				<>c.<>9__4_5 = val5;
				obj5 = (object)val5;
			}
			HoldoutZoneController.OnEnable += (hook_OnEnable)obj5;
			GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Invalid comparison between Unknown and I4
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_0471: Unknown result type (might be due to invalid IL or missing references)
				if (report != null)
				{
					CharacterBody victimBody = report.victimBody;
					if (victimBody != null)
					{
						TeamComponent teamComponent = victimBody.teamComponent;
						if (teamComponent != null)
						{
							_ = teamComponent.teamIndex;
							if (0 == 0 && report != null)
							{
								CharacterBody attackerBody = report.attackerBody;
								if (attackerBody != null)
								{
									TeamComponent teamComponent2 = attackerBody.teamComponent;
									if (teamComponent2 != null)
									{
										_ = teamComponent2.teamIndex;
										if (0 == 0 && TeamManager.IsTeamEnemy((TeamIndex)1, report.victimBody.teamComponent.teamIndex) && (int)report.attackerBody.teamComponent.teamIndex == 1)
										{
											foreach (HoldoutZoneController key in ActiveZones.Keys)
											{
												if (!report.victimIsBoss && !(key.baseChargeDuration <= 0f))
												{
													if (Main.DebugMode.Value)
													{
														Main.Log.LogInfo((object)("Kill Credited, base: " + ActiveZones[key].kill));
													}
													if (ActiveZones[key].kill != 0f)
													{
														float num = Main.Value.Value + report.victimBody.baseMaxHealth * Main.ValuePerHP.Value;
														if (Main.DebugMode.Value)
														{
															Main.Log.LogInfo((object)$"base: {Main.Value.Value}({Main.Value.Value}+{report.victimBody.baseMaxHealth}x{Main.ValuePerHP.Value})");
														}
														if (report.victimIsElite)
														{
															num += Main.EliteBonus.Value;
														}
														if (report.victimBody.affixes().Any((EliteDef x) => x.isT2()))
														{
															num += Main.EliteT2Bonus.Value;
														}
														if (report.victimIsMiniboss())
														{
															num += Main.MinibossBonus.Value;
														}
														if (report.victimIsChampion)
														{
															num += Main.BossBonus.Value;
														}
														if (Main.DebugMode.Value)
														{
															Main.Log.LogInfo((object)("bonuses: " + (report.victimIsElite ? $"+{Main.EliteBonus.Value} (elite)" : "") + (report.victimBody.affixes().Any((EliteDef x) => x.isT2()) ? $"+{Main.EliteT2Bonus.Value} (T2)" : "") + (report.victimIsMiniboss() ? $"+{Main.MinibossBonus.Value} (miniboss)" : "") + (report.victimIsChampion ? $"+{Main.BossBonus.Value} (champion)" : "")));
														}
														num *= ActiveZones[key].kill;
														if ((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key])
														{
															num *= Main.PreBossKillPenalty.Value;
														}
														if (!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition))
														{
															num *= Main.OutsideRangePenalty.Value;
														}
														if (Main.DebugMode.Value)
														{
															Main.Log.LogInfo((object)("multipliers: " + ActiveZones[key].kill + (((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) ? $"x{Main.PreBossKillPenalty.Value} (prebosskill)" : "") + ((!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) ? $"x{Main.OutsideRangePenalty.Value} (outsiderange)" : "") + (Main.UseFixedTime.Value ? $"x1s(out of {key.baseChargeDuration})" : "x1%")));
														}
														if (num == 0f)
														{
															break;
														}
														ChargeCredit[key] += num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f);
														if (Main.DebugMode.Value)
														{
															Main.Log.LogInfo((object)("Return:" + num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f)));
														}
														if (Main.CompensateKills.Value != 0f)
														{
															if (!Main.UseFixedTime.Value)
															{
																float num2 = 1f / key.baseChargeDuration;
																CalcChargeRateDelegate val9 = AccessTools.FieldRefAccess<CalcChargeRateDelegate>(typeof(HoldoutZoneController), "calcChargeRate").Invoke((object)key);
																if (val9 != null)
																{
																	val9.Invoke(ref num2);
																}
																num *= 0.01f / num2;
																if (Main.DebugMode.Value)
																{
																	Main.Log.LogInfo((object)"ChargeRate accessed");
																}
															}
															if (Main.GeneralScalingCompensation.Value != 0f)
															{
																num /= Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value);
															}
															Run.instance.SetRunStopwatch(Run.instance.GetRunStopwatch() + num * Main.CompensateKills.Value);
															if (Main.DebugMode.Value)
															{
																Main.Log.LogInfo((object)"Time Compensated");
																Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop");
																Main.Log.LogInfo((object)$"Result: a{ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount))}, b{Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value)}({ActiveZones[key].mult} mult), charge{num}, d{Main.CompensateKills.Value}");
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			};
			BossGroup.onBossGroupDefeatedServer += delegate(BossGroup group)
			{
				if ((Object)(object)TeleporterInteraction.instance?.bossGroup != (Object)null && (Object)(object)TeleporterInteraction.instance.bossGroup == (Object)(object)group && BossKilled.ContainsKey(TeleporterInteraction.instance.holdoutZoneController))
				{
					BossKilled[TeleporterInteraction.instance.holdoutZoneController] = true;
					if (Main.UnlockInteractablesPostBoss.Value && Object.op_Implicit((Object)(object)TeleporterInteraction.instance.outsideInteractableLocker))
					{
						((Behaviour)TeleporterInteraction.instance.outsideInteractableLocker).enabled = false;
					}
				}
			};
			object obj6 = <>c.<>9__4_8;
			if (obj6 == null)
			{
				hook_OnDisable val6 = delegate(orig_OnDisable orig, HoldoutZoneController self)
				{
					if (ActiveZones.ContainsKey(self))
					{
						ActiveZones.Remove(self);
					}
					if (BossKilled.ContainsKey(self))
					{
						BossKilled.Remove(self);
					}
					if (ChargeCredit.ContainsKey(self))
					{
						ChargeCredit.Remove(self);
					}
					orig.Invoke(self);
				};
				<>c.<>9__4_8 = val6;
				obj6 = (object)val6;
			}
			HoldoutZoneController.OnDisable += (hook_OnDisable)obj6;
			FocusConvergenceController.cap = int.MaxValue;
			object obj7 = <>c.<>9__4_9;
			if (obj7 == null)
			{
				hook_ApplyRate val7 = delegate(orig_ApplyRate orig, MonoBehaviour self, ref float rate)
				{
					//IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references)
					int currentFocusConvergenceCount2 = ((FocusConvergenceController)self).currentFocusConvergenceCount;
					if (Main.FocusedConvergenceRateLimit.Value >= 0)
					{
						((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount2, Main.FocusedConvergenceRateLimit.Value);
					}
					orig.Invoke(self, ref rate);
					((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount2;
				};
				<>c.<>9__4_9 = val7;
				obj7 = (object)val7;
			}
			FocusConvergenceController.ApplyRate += (hook_ApplyRate)obj7;
			object obj8 = <>c.<>9__4_10;
			if (obj8 == null)
			{
				hook_ApplyRadius val8 = delegate(orig_ApplyRadius orig, MonoBehaviour self, ref float radius)
				{
					//IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references)
					int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount;
					if (Main.FocusedConvergenceRangeLimit.Value >= 0)
					{
						((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRangeLimit.Value);
					}
					orig.Invoke(self, ref radius);
					((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount;
				};
				<>c.<>9__4_10 = val8;
				obj8 = (object)val8;
			}
			FocusConvergenceController.ApplyRadius += (hook_ApplyRadius)obj8;
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("prodzpod.FasterBossWait2", "FasterBossWait2", "1.1.9")]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	public class Main : BaseUnityPlugin
	{
		public struct HoldoutMultiplierInfo
		{
			public string name;

			public float time;

			public float mult;

			public float multBoss;

			public float kill;

			public float area;

			public float areaBoss;
		}

		public enum StackingMode
		{
			Linear,
			Exponential,
			Hyperbolic,
			Asymptotic
		}

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

			public static hook_ShouldUpdateRunStopwatch <>9__78_0;

			internal bool <Awake>b__78_0(orig_ShouldUpdateRunStopwatch orig, Run self)
			{
				//IL_005b: 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)
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Unknown result type (might be due to invalid IL or missing references)
				bool result = orig.Invoke(self);
				TeleporterInteraction instance = TeleporterInteraction.instance;
				if (instance != null && instance.isCharged)
				{
					foreach (NetworkUser instances in NetworkUser.instancesList)
					{
						CharacterBody currentBody = instances.GetCurrentBody();
						if (!((Object)(object)currentBody == (Object)null))
						{
							Vector3 val = ((Component)TeleporterInteraction.instance).transform.position - currentBody.corePosition;
							if (((Vector3)(ref val)).magnitude > TeleporterTimestopArea.Value)
							{
								return result;
							}
						}
					}
					if (DebugMode.Value)
					{
						Log.LogInfo((object)"Time Stopped");
					}
					return false;
				}
				return result;
			}
		}

		public const string PluginGUID = "prodzpod.FasterBossWait2";

		public const string PluginAuthor = "prodzpod";

		public const string PluginName = "FasterBossWait2";

		public const string PluginVersion = "1.1.9";

		public static ManualLogSource Log;

		internal static PluginInfo pluginInfo;

		public static ConfigFile Config;

		public static ConfigEntry<bool> UseFixedTime;

		public static ConfigEntry<float> CompensateKills;

		public static ConfigEntry<float> GeneralScalingCompensation;

		public static ConfigEntry<float> Value;

		public static ConfigEntry<float> ValuePerHP;

		public static ConfigEntry<float> EliteBonus;

		public static ConfigEntry<float> EliteT2Bonus;

		public static ConfigEntry<float> VariantBonus;

		public static ConfigEntry<float> MinibossBonus;

		public static ConfigEntry<float> BossBonus;

		public static ConfigEntry<float> PreBossKillPenalty;

		public static ConfigEntry<float> OutsideRangePenalty;

		public static ConfigEntry<bool> UnlockInteractables;

		public static ConfigEntry<bool> UnlockInteractablesPostBoss;

		public static ConfigEntry<bool> UnlockVoidSeeds;

		public static ConfigEntry<StackingMode> ModePerPerson;

		public static ConfigEntry<float> ValuePerPerson;

		public static ConfigEntry<StackingMode> ModePerPersonArea;

		public static ConfigEntry<float> ValuePerPersonArea;

		public static ConfigEntry<StackingMode> ModePerStage;

		public static ConfigEntry<float> ValuePerStage;

		public static ConfigEntry<StackingMode> ModePerLoop;

		public static ConfigEntry<float> ValuePerLoop;

		public static ConfigEntry<int> FocusedConvergenceRateLimit;

		public static ConfigEntry<int> FocusedConvergenceRangeLimit;

		public static ConfigEntry<float> TeleporterTime;

		public static ConfigEntry<float> TeleporterMult;

		public static ConfigEntry<float> TeleporterKill;

		public static ConfigEntry<float> TeleporterArea;

		public static ConfigEntry<float> TeleporterMultBoss;

		public static ConfigEntry<float> TeleporterAreaBoss;

		public static ConfigEntry<float> TeleporterTimestopArea;

		public static ConfigEntry<float> PrimordialTime;

		public static ConfigEntry<float> PrimordialMult;

		public static ConfigEntry<float> PrimordialKill;

		public static ConfigEntry<float> PrimordialArea;

		public static ConfigEntry<float> PrimordialMultBoss;

		public static ConfigEntry<float> PrimordialAreaBoss;

		public static ConfigEntry<float> PillarMassTime;

		public static ConfigEntry<float> PillarMassMult;

		public static ConfigEntry<float> PillarMassKill;

		public static ConfigEntry<float> PillarMassArea;

		public static ConfigEntry<float> PillarDesignTime;

		public static ConfigEntry<float> PillarDesignMult;

		public static ConfigEntry<float> PillarDesignKill;

		public static ConfigEntry<float> PillarDesignArea;

		public static ConfigEntry<float> PillarBloodTime;

		public static ConfigEntry<float> PillarBloodMult;

		public static ConfigEntry<float> PillarBloodKill;

		public static ConfigEntry<float> PillarBloodArea;

		public static ConfigEntry<float> PillarSoulTime;

		public static ConfigEntry<float> PillarSoulMult;

		public static ConfigEntry<float> PillarSoulKill;

		public static ConfigEntry<float> PillarSoulArea;

		public static ConfigEntry<float> EndingTime;

		public static ConfigEntry<float> EndingMult;

		public static ConfigEntry<float> EndingKill;

		public static ConfigEntry<float> EndingArea;

		public static ConfigEntry<float> FieldTime;

		public static ConfigEntry<float> FieldMult;

		public static ConfigEntry<float> FieldKill;

		public static ConfigEntry<float> FieldArea;

		public static ConfigEntry<float> LocusTime;

		public static ConfigEntry<float> LocusMult;

		public static ConfigEntry<float> LocusKill;

		public static ConfigEntry<float> LocusArea;

		public static ConfigEntry<bool> DebugMode;

		public static List<HoldoutMultiplierInfo> HoldoutMultipliers;

		public static HoldoutMultiplierInfo DefaultHoldoutInfo = new HoldoutMultiplierInfo
		{
			name = "",
			time = -1f,
			mult = 1f,
			multBoss = -1f,
			kill = 1f,
			area = -1f,
			areaBoss = -1f
		};

		public void Awake()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_04b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bc: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			Log = ((BaseUnityPlugin)this).Logger;
			Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.FasterBossWait2.cfg"), true);
			UseFixedTime = Config.Bind<bool>("Kills to Time", "Use Fixed Time", true, "If true, value will be seconds instead of percent.");
			CompensateKills = Config.Bind<float>("Kills to Time", "Kill Compensation Ratio", 1f, "Time saved by kills multiplied by this amount will be added to run timer.");
			GeneralScalingCompensation = Config.Bind<float>("Kills to Time", "General Scaling Compensation Ratio", 1f, "0: Kill Compensation will account for total time. 1: Kill compensation will only account for time before general scaling is applied.");
			Value = Config.Bind<float>("Kills to Time", "Base Value", 1f, "Charge value per kill.");
			ValuePerHP = Config.Bind<float>("Kills to Time", "Additional Value Per HP", 0f, "Charge value per base HP of the enemy, takes elites into account but not ambient level.");
			EliteBonus = Config.Bind<float>("Kills to Time", "Elite Bonus Value", 1f, "Extra charge given for defeating an elite.");
			EliteT2Bonus = Config.Bind<float>("Kills to Time", "Elite T2 Bonus Value", 10f, "Extra charge given for defeating a tier 2 elite. stacks with general elite bonus.");
			VariantBonus = Config.Bind<float>("Kills to Time", "Variant Bonus Value", 1f, "Extra charge given for defeating a variant enemy, multiplied by experience multiplier.");
			MinibossBonus = Config.Bind<float>("Kills to Time", "Miniboss Bonus Value", 2f, "Extra charge given for defeating a miniboss.");
			BossBonus = Config.Bind<float>("Kills to Time", "Boss Bonus Value", 9f, "Extra charge given for defeating a champion.");
			PreBossKillPenalty = Config.Bind<float>("Kills to Time", "Pre Bosskill Penalty", 0f, "Every kill % before the boss is defeated will be multiplied by this amount.");
			OutsideRangePenalty = Config.Bind<float>("Kills to Time", "Outside Range Penalty", 1f, "Every kill % while you're outside the teleporter range will be multiplied by this amount.");
			UnlockInteractables = Config.Bind<bool>("Unlock Interactables", "Unlock Interactables", false, "Unlock interactables with a teleporter enabled.");
			UnlockInteractablesPostBoss = Config.Bind<bool>("Unlock Interactables", "Unlock Interactables Post Boss", false, "Unlock interactables with a teleporter enabled.");
			UnlockVoidSeeds = Config.Bind<bool>("Unlock Interactables", "Unlock Void Seeds", false, "Unlock interactables with void seed enabled.");
			ModePerPerson = Config.Bind<StackingMode>("General Scaling", "Per Person Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)");
			ValuePerPerson = Config.Bind<float>("General Scaling", "Multiplier Per Person", 1f, "For people who are well coordinated?? idk");
			ModePerPersonArea = Config.Bind<StackingMode>("General Scaling", "Per Person Area Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)");
			ValuePerPersonArea = Config.Bind<float>("General Scaling", "Area Multiplier Per Person", 1f, "For people who are well coordinated?? idk");
			ModePerStage = Config.Bind<StackingMode>("General Scaling", "Per Stage Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)");
			ValuePerStage = Config.Bind<float>("General Scaling", "Multiplier Per Stage", 1f, "multiplier per stage.");
			ModePerLoop = Config.Bind<StackingMode>("General Scaling", "Per Loop Multiplier Mode", StackingMode.Linear, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)");
			ValuePerLoop = Config.Bind<float>("General Scaling", "Multiplier Per Loop", 1f, "This is also a ChargeInHalf continuation");
			FocusedConvergenceRateLimit = Config.Bind<int>("General Scaling", "Focused Convergence Rate Max Stack", -1, "Set to -1 for infinite.");
			FocusedConvergenceRangeLimit = Config.Bind<int>("General Scaling", "Focused Convergence Range Max Stack", 3, "Set to -1 for infinite.");
			TeleporterTime = Config.Bind<float>("Zones", "Teleporter Base Charge Time", 90f, "Good ol' Teleporter.");
			TeleporterMult = Config.Bind<float>("Zones", "Teleporter Charge Multiplier", 1f, "General Scaling's effect on Teleporters. (except focused convergence)");
			TeleporterKill = Config.Bind<float>("Zones", "Teleporter Kills Multiplier", 1f, "Kills to Time's effect on Teleporters.");
			TeleporterArea = Config.Bind<float>("Zones", "Teleporter Base Area", 60f, "");
			TeleporterMultBoss = Config.Bind<float>("Zones", "Teleporter Charge Rate post Bosskill", 1f, "");
			TeleporterAreaBoss = Config.Bind<float>("Zones", "Teleporter Base Area post Bosskill", 60f, "");
			TeleporterTimestopArea = Config.Bind<float>("Zones", "Telepoter Time Stop Area", 12f, "Radius in meters. Set to 0 to disable.");
			DebugMode = Config.Bind<bool>("If some configs dont work enable this", "Debug Mode", false, "Enable Detailed Log Messages.");
			if (TeleporterTimestopArea.Value > 0f)
			{
				object obj = <>c.<>9__78_0;
				if (obj == null)
				{
					hook_ShouldUpdateRunStopwatch val = delegate(orig_ShouldUpdateRunStopwatch orig, Run self)
					{
						//IL_005b: 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)
						//IL_0067: Unknown result type (might be due to invalid IL or missing references)
						//IL_006c: Unknown result type (might be due to invalid IL or missing references)
						bool result = orig.Invoke(self);
						TeleporterInteraction instance = TeleporterInteraction.instance;
						if (instance != null && instance.isCharged)
						{
							foreach (NetworkUser instances in NetworkUser.instancesList)
							{
								CharacterBody currentBody = instances.GetCurrentBody();
								if (!((Object)(object)currentBody == (Object)null))
								{
									Vector3 val2 = ((Component)TeleporterInteraction.instance).transform.position - currentBody.corePosition;
									if (((Vector3)(ref val2)).magnitude > TeleporterTimestopArea.Value)
									{
										return result;
									}
								}
							}
							if (DebugMode.Value)
							{
								Log.LogInfo((object)"Time Stopped");
							}
							return false;
						}
						return result;
					};
					<>c.<>9__78_0 = val;
					obj = (object)val;
				}
				Run.ShouldUpdateRunStopwatch += (hook_ShouldUpdateRunStopwatch)obj;
			}
			PrimordialTime = Config.Bind<float>("Zones", "Primordial Teleporter Base Charge Time", 90f, "Primordial Teleporter, in case you want Stage 5 to be special.");
			PrimordialMult = Config.Bind<float>("Zones", "Primordial Teleporter Charge Multiplier", 1f, "General Scaling's effect on Primordial Teleporters. (except focused convergence)");
			PrimordialKill = Config.Bind<float>("Zones", "Primordial Teleporter Kills Multiplier", 0f, "Kills to Time's effect on Primordial Teleporters.");
			PrimordialArea = Config.Bind<float>("Zones", "Primordial Teleporter Base Area", 60f, "");
			PrimordialMultBoss = Config.Bind<float>("Zones", "Primordial Teleporter Charge Rate post Bosskill", 1f, "");
			PrimordialAreaBoss = Config.Bind<float>("Zones", "Primordial Teleporter Base Area post Bosskill", 60f, "");
			PillarMassTime = Config.Bind<float>("Zones", "Pillar of Mass Base Charge Time", 60f, "Who doesn't like Moon Pillars?");
			PillarMassMult = Config.Bind<float>("Zones", "Pillar of Mass Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)");
			PillarMassKill = Config.Bind<float>("Zones", "Pillar of Mass Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars.");
			PillarMassArea = Config.Bind<float>("Zones", "Pillar of Mass Base Area", 20f, "");
			PillarDesignTime = Config.Bind<float>("Zones", "Pillar of Design Base Charge Time", 30f, "Who doesn't like Moon Pillars?");
			PillarDesignMult = Config.Bind<float>("Zones", "Pillar of Design Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)");
			PillarDesignKill = Config.Bind<float>("Zones", "Pillar of Design Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars.");
			PillarDesignArea = Config.Bind<float>("Zones", "Pillar of Design Base Area", 20f, "");
			PillarSoulTime = Config.Bind<float>("Zones", "Pillar of Soul Base Charge Time", 30f, "Who doesn't like Moon Pillars?");
			PillarSoulMult = Config.Bind<float>("Zones", "Pillar of Soul Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)");
			PillarSoulKill = Config.Bind<float>("Zones", "Pillar of Soul Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars.");
			PillarSoulArea = Config.Bind<float>("Zones", "Pillar of Soul Base Area", 20f, "");
			PillarBloodTime = Config.Bind<float>("Zones", "Pillar of Blood Base Charge Time", 10f, "Who doesn't like Moon Pillars?");
			PillarBloodMult = Config.Bind<float>("Zones", "Pillar of Blood Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)");
			PillarBloodKill = Config.Bind<float>("Zones", "Pillar of Blood Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars.");
			PillarBloodArea = Config.Bind<float>("Zones", "Pillar of Blood Base Area", 20f, "");
			EndingTime = Config.Bind<float>("Zones", "The Final Spacecraft Base Charge Time", 120f, "And so they left...");
			EndingMult = Config.Bind<float>("Zones", "The Final Spacecraft Charge Multiplier", 0f, "General Scaling's effect on The Final Spacecraft. (except focused convergence)");
			EndingKill = Config.Bind<float>("Zones", "The Final Spacecraft Kills Multiplier", 2f, "Kills to Time's effect on The Final Spacecraft.");
			EndingArea = Config.Bind<float>("Zones", "The Final Spacecraft Base Area", 40f, "");
			FieldTime = Config.Bind<float>("Zones", "Void Field Base Charge Time", 60f, "Void Fields");
			FieldMult = Config.Bind<float>("Zones", "Void Field Charge Multiplier", 1f, "General Scaling's effect on Void Fields. (except focused convergence)");
			FieldKill = Config.Bind<float>("Zones", "Void Field Kills Multiplier", 1f, "Kills to Time's effect on Void Fields.");
			FieldArea = Config.Bind<float>("Zones", "Void Field Base Area", 15f, "");
			LocusTime = Config.Bind<float>("Zones", "Deep Void Beacon Base Charge Time", 90f, "Deep Void Beacons");
			LocusMult = Config.Bind<float>("Zones", "Deep Void Beacon Charge Multiplier", 1f, "General Scaling's effect on Deep Void Beacons. (except focused convergence)");
			LocusKill = Config.Bind<float>("Zones", "Deep Void Beacon Kills Multiplier", 1f, "Kills to Time's effect on Deep Void Beacons.");
			LocusArea = Config.Bind<float>("Zones", "Deep Void Beacon Base Area", 20f, "");
			HoldoutMultipliers = new List<HoldoutMultiplierInfo>(9)
			{
				new HoldoutMultiplierInfo
				{
					name = "Teleporter1",
					time = TeleporterTime.Value,
					mult = TeleporterMult.Value,
					multBoss = TeleporterMultBoss.Value,
					kill = TeleporterKill.Value,
					area = TeleporterArea.Value,
					areaBoss = TeleporterAreaBoss.Value
				},
				new HoldoutMultiplierInfo
				{
					name = "LunarTeleporter",
					time = PrimordialTime.Value,
					mult = PrimordialMult.Value,
					multBoss = PrimordialMultBoss.Value,
					kill = PrimordialKill.Value,
					area = PrimordialArea.Value,
					areaBoss = PrimordialAreaBoss.Value
				},
				new HoldoutMultiplierInfo
				{
					name = "MoonBatteryMass",
					time = PillarMassTime.Value,
					mult = PillarMassMult.Value,
					multBoss = -1f,
					kill = PillarMassKill.Value,
					area = PillarMassArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "MoonBatteryDesign",
					time = PillarDesignTime.Value,
					mult = PillarDesignMult.Value,
					multBoss = -1f,
					kill = PillarDesignKill.Value,
					area = PillarDesignArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "MoonBatteryBlood",
					time = PillarBloodTime.Value,
					mult = PillarBloodMult.Value,
					multBoss = -1f,
					kill = PillarBloodKill.Value,
					area = PillarBloodArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "MoonBatterySoul",
					time = PillarSoulTime.Value,
					mult = PillarSoulMult.Value,
					multBoss = -1f,
					kill = PillarSoulKill.Value,
					area = PillarSoulArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "HoldoutZone",
					time = EndingTime.Value,
					mult = EndingMult.Value,
					multBoss = -1f,
					kill = EndingKill.Value,
					area = EndingArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "NullSafeZone",
					time = FieldTime.Value,
					mult = FieldMult.Value,
					multBoss = -1f,
					kill = FieldKill.Value,
					area = FieldArea.Value,
					areaBoss = -1f
				},
				new HoldoutMultiplierInfo
				{
					name = "DeepVoidPortalBattery",
					time = LocusTime.Value,
					mult = LocusMult.Value,
					multBoss = -1f,
					kill = LocusKill.Value,
					area = LocusArea.Value,
					areaBoss = -1f
				}
			};
			Hooks.Patch();
		}

		public static float Calc(StackingMode mode, float value, float count)
		{
			switch (mode)
			{
			case StackingMode.Linear:
				return value * count + 1f;
			case StackingMode.Exponential:
				return Mathf.Pow(value, count);
			case StackingMode.Hyperbolic:
				return value * count / (count + 1f) + 1f;
			case StackingMode.Asymptotic:
				return (1f - value) * (1f - Mathf.Pow(2f, 0f - count)) + value;
			default:
				Log.LogError((object)"Invalid Mode??");
				return 0f;
			}
		}
	}
}