Decompiled source of UltraTweaker v1.1.2

plugins/UltraTweaker/UltraTweaker.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
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 HarmonyLib;
using Microsoft.CodeAnalysis;
using TMPro;
using UltraTweaker.Handlers;
using UltraTweaker.SettingUI;
using UltraTweaker.SettingUI.UIElements;
using UltraTweaker.SettingUI.UIElements.Impl;
using UltraTweaker.Subsettings;
using UltraTweaker.Subsettings.Impl;
using UltraTweaker.Tweaks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("UltraTweaker")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Tweaks your Ultra.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+0bf1468427ab9448bed0f0fef4007e7629d7a1cf")]
[assembly: AssemblyProduct("UltraTweaker")]
[assembly: AssemblyTitle("UltraTweaker")]
[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 UltraTweaker
{
	[BepInPlugin("waffle.ultrakill.ultratweaker", "UltraTweaker", "1.1.2")]
	public class UltraTweaker : BaseUnityPlugin
	{
		public const string GUID = "waffle.ultrakill.ultratweaker";

		public const string Name = "UltraTweaker";

		public const string Version = "1.1.2";

		public static Dictionary<Type, Tweak> AllTweaks = new Dictionary<Type, Tweak>();

		internal static List<Assembly> AssembliesToCheck = new List<Assembly> { Assembly.GetExecutingAssembly() };

		public static void AddAssembly(Assembly asm)
		{
			AssembliesToCheck.Add(asm);
			Tweak.RefreshTweakHolder();
			SaveHandler.LoadData();
		}

		public void Start()
		{
			Debug.Log((object)"UltraTweaker v1.1.2 has started.");
			AssetHandler.LoadBundle();
			Tweak.CreateTweakHolder();
			SaveHandler.LoadData();
			SettingUIHandler.Patch();
			MutatorHandler.Patch();
		}

		public void OnDestroy()
		{
			SaveHandler.SaveData();
		}
	}
	public static class PathUtils
	{
		public static string GameDirectory()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Invalid comparison between Unknown and I4
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Invalid comparison between Unknown and I4
			string text = Application.dataPath;
			if ((int)Application.platform == 1)
			{
				text = Utility.ParentDirectory(text, 2);
			}
			else if ((int)Application.platform == 2)
			{
				text = Utility.ParentDirectory(text, 1);
			}
			return text;
		}

		public static string ModPath(Assembly asm = null)
		{
			if (asm == null)
			{
				asm = Assembly.GetExecutingAssembly();
			}
			return asm.Location.Substring(0, asm.Location.LastIndexOf(Path.DirectorySeparatorChar));
		}
	}
	public static class GameObjectUtils
	{
		public static GameObject ChildByName(this GameObject from, string name)
		{
			List<GameObject> list = new List<GameObject>();
			int i;
			for (i = 0; i < from.transform.childCount; i++)
			{
				list.Add(((Component)from.transform.GetChild(i)).gameObject);
			}
			if (i == 0)
			{
				return null;
			}
			for (int j = 0; j < list.Count; j++)
			{
				if (((Object)list[j]).name == name)
				{
					return list[j];
				}
			}
			return null;
		}

		public static List<GameObject> FindSceneObjects(string sceneName)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			List<GameObject> list = new List<GameObject>();
			GameObject[] array = Object.FindObjectsOfType<GameObject>();
			foreach (GameObject val in array)
			{
				Scene scene = val.scene;
				if (((Scene)(ref scene)).name == sceneName)
				{
					list.Add(val);
				}
			}
			return list;
		}

		public static List<GameObject> ChildrenList(this GameObject from)
		{
			List<GameObject> list = new List<GameObject>();
			for (int i = 0; i < from.transform.childCount; i++)
			{
				list.Add(((Component)from.transform.GetChild(i)).gameObject);
			}
			return list;
		}
	}
	public class UltrakillUtils
	{
		public static GameObject NearestEnemy(Vector3 point, float maxDistance)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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)
			float num = maxDistance;
			GameObject result = null;
			GameObject[] array = GameObject.FindGameObjectsWithTag("Enemy");
			GameObject[] array2 = array;
			foreach (GameObject val in array2)
			{
				if ((Object)(object)val.GetComponent<EnemyIdentifier>() != (Object)null && !val.GetComponent<EnemyIdentifier>().dead && Vector3.Distance(point, val.transform.position) < num)
				{
					num = Vector3.Distance(point, val.transform.position);
					result = val;
				}
			}
			return result;
		}
	}
	public class DisableDoubleRender : MonoBehaviour
	{
		private EnemyIdentifier eid;

		private DoubleRender[] dr;

		public void Start()
		{
			eid = null;
			dr = null;
		}

		public void Update()
		{
			if (dr == null && dr == null)
			{
				dr = ((Component)this).GetComponentsInChildren<DoubleRender>(true);
			}
			if (dr != null && dr.Length != 0)
			{
				DoubleRender[] array = dr;
				foreach (DoubleRender val in array)
				{
					val.currentCam.RemoveCommandBuffer((CameraEvent)16, val.cb);
				}
			}
		}
	}
}
namespace UltraTweaker.Tweaks
{
	public class Metadata : Attribute
	{
		public string Name { get; private set; }

		public string ID { get; private set; }

		public string Description { get; private set; }

		public Metadata(string Name, string ID, string Description = "")
		{
			this.Name = Name;
			this.ID = ID;
			this.Description = Description;
		}
	}
	public class TweakMetadata : Metadata
	{
		public string PageId { get; private set; }

		public int InsertAt { get; private set; }

		public Sprite Icon { get; private set; }

		public bool AllowCG { get; private set; }

		public bool IsMutator { get; private set; }

		public TweakMetadata(string Name, string ID, string Description = "", string PageId = "waffle.ultrakill.ultratweaker.misc", int InsertAt = 0, string IconName = null, bool AllowCG = true, bool IsMutator = false)
			: base(Name, ID, Description)
		{
			if (IconName != null)
			{
				Icon = AssetHandler.GetCachedAsset<Sprite>(IconName);
			}
			this.PageId = PageId;
			this.InsertAt = InsertAt;
			this.AllowCG = AllowCG;
			this.IsMutator = IsMutator;
		}
	}
	public class Tweak : MonoBehaviour
	{
		private static GameObject _tweakHolder;

		public Dictionary<string, Subsetting> Subsettings = new Dictionary<string, Subsetting>();

		public static Dictionary<Type, Tweak> TypeToTweak = new Dictionary<Type, Tweak>();

		private bool _isEnabled = false;

		private TweakUIElement _element;

		public bool IsEnabled
		{
			get
			{
				return _isEnabled;
			}
			set
			{
				if (_isEnabled != value)
				{
					_isEnabled = value;
					if (!value)
					{
						Debug.Log((object)("Disabling tweak " + ((object)this).GetType().Name + "."));
						OnTweakDisabled();
					}
					else
					{
						Debug.Log((object)("Enabling tweak " + ((object)this).GetType().Name + "."));
						OnTweakEnabled();
					}
				}
			}
		}

		public TweakUIElement Element
		{
			get
			{
				if (_element == null)
				{
					_element = new TweakUIElement(this);
				}
				return _element;
			}
		}

		public static void CreateTweakHolder()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			_tweakHolder = new GameObject("UT Tweak Holder - don't destroy!");
			Object.DontDestroyOnLoad((Object)(object)_tweakHolder);
			foreach (Assembly item in UltraTweaker.AssembliesToCheck)
			{
				Debug.Log((object)("Searching " + item.GetName().Name + " for tweaks."));
				foreach (TypeInfo item2 in item.DefinedTypes.Where((TypeInfo type) => type.IsDefined(typeof(Metadata), inherit: false)))
				{
					Debug.Log((object)("Found tweak; " + item2.Name + "."));
					Tweak tweak = (Tweak)(object)_tweakHolder.AddComponent((Type)item2);
					((Behaviour)tweak).enabled = false;
					UltraTweaker.AllTweaks.Add(item2, tweak);
				}
			}
		}

		public static void RefreshTweakHolder()
		{
			foreach (Assembly item in UltraTweaker.AssembliesToCheck)
			{
				Debug.Log((object)("Searching " + item.GetName().Name + " for tweaks."));
				foreach (TypeInfo item2 in item.DefinedTypes.Where((TypeInfo type) => type.IsDefined(typeof(Metadata), inherit: false)))
				{
					if (!UltraTweaker.AllTweaks.ContainsKey(item2))
					{
						Debug.Log((object)("Found tweak; " + item2.Name + "."));
						Tweak tweak = (Tweak)(object)_tweakHolder.AddComponent((Type)item2);
						((Behaviour)tweak).enabled = false;
						UltraTweaker.AllTweaks.Add(item2, tweak);
					}
				}
			}
		}

		public static T GetInstance<T>() where T : Tweak
		{
			return TypeToTweak[typeof(T)] as T;
		}

		public virtual void OnTweakEnabled()
		{
			SceneManager.sceneLoaded += OnSceneLoad;
			if (!TypeToTweak.ContainsKey(((object)this).GetType()))
			{
				TypeToTweak.Add(((object)this).GetType(), this);
			}
			((Behaviour)this).enabled = true;
		}

		public virtual void OnTweakDisabled()
		{
			SceneManager.sceneLoaded -= OnSceneLoad;
			((Behaviour)this).enabled = false;
		}

		public virtual void OnSubsettingUpdate()
		{
		}

		public virtual void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
		}

		public static bool IsGameplayScene()
		{
			string[] source = new string[6] { "Intro", "Bootstrap", "Main Menu", "Level 2-S", "Intermission1", "Intermission2" };
			return !source.Contains(SceneHelper.CurrentScene);
		}

		public void SetControls(bool active)
		{
			_element.SetControlsActive(active);
			foreach (Subsetting value in Subsettings.Values)
			{
				value.Element.SetControlsActive(active);
			}
		}
	}
}
namespace UltraTweaker.Tweaks.Impl
{
	public class CGUtils : Tweak
	{
		private GameObject _originalPanel;

		private GameObject _panel;

		private Text _waves;

		private Text _enemies;

		private Text _time;

		private Text _kills;

		private Text _style;

		private StatsManager _sm;

		private LevelStatsEnabler _lse;

		private float _minutes;

		private float _seconds;

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			if (SceneHelper.CurrentScene == "Endless")
			{
				Create();
			}
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			if ((Object)(object)_panel != (Object)null)
			{
				Object.Destroy((Object)(object)_panel);
			}
		}

		public void Create()
		{
			_lse = ((Component)MonoSingleton<CanvasController>.Instance).gameObject.GetComponentInChildren<LevelStatsEnabler>(true);
			_sm = MonoSingleton<StatsManager>.Instance;
			if ((Object)(object)_originalPanel == (Object)null)
			{
				_originalPanel = AssetHandler.Bundle.LoadAsset<GameObject>("Cybergrind Stats.prefab");
			}
			_panel = Object.Instantiate<GameObject>(_originalPanel, ((Component)_lse).transform);
			_waves = _panel.ChildByName("Waves Title").ChildByName("Waves").GetComponent<Text>();
			_enemies = _panel.ChildByName("Enemies Title").ChildByName("Enemies").GetComponent<Text>();
			_time = _panel.ChildByName("Time Title").ChildByName("Time").GetComponent<Text>();
			_kills = _panel.ChildByName("Kills Title").ChildByName("Kills").GetComponent<Text>();
			_style = _panel.ChildByName("Style Title").ChildByName("Style").GetComponent<Text>();
			_waves.text = "0";
			_enemies.text = "0";
			_time.text = "00:00.000";
			_kills.text = "0";
			_style.text = "0";
			_panel.SetActive(false);
		}

		public void Update()
		{
			if (SceneHelper.CurrentScene == "Endless" && (Object)(object)_lse != (Object)null)
			{
				if (!((Component)_lse).gameObject.activeSelf)
				{
					((Component)_lse).gameObject.SetActive(true);
				}
				if ((Object)(object)_lse.levelStats != (Object)(object)_panel)
				{
					_lse.levelStats = _panel;
				}
				EndlessGrid instance = MonoSingleton<EndlessGrid>.Instance;
				_waves.text = instance.currentWave.ToString();
				_enemies.text = (instance.tempEnemyAmount - instance.anw.deadEnemies).ToString();
				_kills.text = _sm.kills.ToString();
				_style.text = _sm.stylePoints.ToString();
				_seconds = _sm.seconds;
				_minutes = 0f;
				while (_seconds >= 60f)
				{
					_seconds -= 60f;
					_minutes += 1f;
				}
				_time.text = _minutes + ":" + _seconds.ToString("00.000");
			}
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			if (SceneHelper.CurrentScene == "Endless")
			{
				Create();
			}
		}
	}
	[TweakMetadata("Close Quarters", "waffle.ultrakill.ultratweaker.mutator_close_quarters", "Blesses enemies when far.", "waffle.ultrakill.ultratweaker.mutators", 0, "Cross", true, true)]
	public class CloseQuarters : Tweak
	{
		public static class DistancePatches
		{
			[HarmonyPatch(typeof(EnemyIdentifier), "Awake")]
			[HarmonyPostfix]
			public static void AddComp(EnemyIdentifier __instance)
			{
				((Component)__instance).gameObject.AddComponent<BlessWhenFar>();
			}
		}

		public class BlessWhenFar : MonoBehaviour
		{
			private EnemyIdentifier eid;

			public void Start()
			{
				eid = ((Component)this).GetComponent<EnemyIdentifier>();
			}

			public void Update()
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				if (Vector3.Distance(((Component)this).transform.position, ((Component)MonoSingleton<NewMovement>.Instance).transform.position) > (float)Tweak.GetInstance<CloseQuarters>().Subsettings["enemy_distance"].GetValue<int>())
				{
					if (!eid.blessed)
					{
						eid.Bless(false);
					}
				}
				else if (eid.blessed)
				{
					eid.Unbless(false);
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_close_quarters");

		public CloseQuarters()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"enemy_distance",
				new IntSubsetting(this, new Metadata("Distance", "enemy_distance", "Distance to bless at."), new SliderIntSubsettingElement("{0}m"), 15, 30, 5)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(DistancePatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Explode On Death", "waffle.ultrakill.ultratweaker.explode_self", "Explode and destroy everything when you die.", "waffle.ultrakill.ultratweaker.fun", 1, null, true, false)]
	public class ExplodeOnDeath : Tweak
	{
		public static class ExplosionPatches
		{
			[HarmonyPatch(typeof(NewMovement), "GetHurt")]
			[HarmonyPostfix]
			private static void ExplodeOnDeath()
			{
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: 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_0051: Unknown result type (might be due to invalid IL or missing references)
				if (MonoSingleton<NewMovement>.Instance.dead)
				{
					GameObject explosion = MonoSingleton<GunSetter>.Instance.shotgunPump[0].LoadAssetAsync<GameObject>().WaitForCompletion().GetComponent<Shotgun>()
						.explosion;
					GameObject val = Object.Instantiate<GameObject>(explosion, ((Component)MonoSingleton<NewMovement>.Instance).transform.position, ((Component)MonoSingleton<NewMovement>.Instance).transform.rotation);
					Explosion[] componentsInChildren = val.GetComponentsInChildren<Explosion>();
					foreach (Explosion val2 in componentsInChildren)
					{
						val2.enemyDamageMultiplier = 15f;
						val2.maxSize *= 15f;
						val2.damage = 0;
					}
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.explode_self");

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(ExplosionPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Fall Damage", "waffle.ultrakill.ultratweaker.mutator_fall_damage", "Take damage when you hit the floor too hard.", "waffle.ultrakill.ultratweaker.mutators", 1, "Bone", true, true)]
	public class FallDamage : Tweak
	{
		public class CheckVelocityOnHit : MonoBehaviour
		{
			private float Stored;

			private static GameObject LastCrunch;

			public void Start()
			{
				Immunity = true;
				((MonoBehaviour)this).Invoke("RemoveImmunity", 2f);
			}

			public void OnCollisionEnter(Collision col)
			{
				//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)
				if (!Immunity && (col.gameObject.layer == 8 || col.gameObject.layer == 24) && (col.gameObject.CompareTag("Floor") || col.gameObject.CompareTag("Moving")) && Stored <= -40f && (!MonoSingleton<NewMovement>.Instance.stillHolding || MonoSingleton<NewMovement>.Instance.boostCharge <= 100f))
				{
					float num = -(int)Stored;
					LastCrunch = Object.Instantiate<GameObject>(CrunchSound, ((Component)MonoSingleton<NewMovement>.Instance).transform.position, Quaternion.identity, ((Component)this).transform);
					LastCrunch.GetComponent<AudioSource>().volume = 0.2f - Stored / 100f;
					if (MonoSingleton<NewMovement>.Instance.hp != 1 && num >= 100f)
					{
						num = 99f;
					}
					MonoSingleton<NewMovement>.Instance.GetHurt((int)num, false, 0f, false, true, 0.35f, false);
					((MonoBehaviour)this).Invoke("DestroyCrunch", 2f);
					MonoSingleton<CameraController>.Instance.CameraShake(num / 30f);
				}
			}

			public void LateUpdate()
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				Stored = ((Component)this).GetComponent<Rigidbody>().velocity.y;
			}

			private void DestroyCrunch()
			{
				Object.Destroy((Object)(object)LastCrunch);
			}

			public void RemoveImmunity()
			{
				Immunity = false;
			}
		}

		public static GameObject CrunchSound;

		public static bool Immunity;

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			if ((Object)(object)CrunchSound == (Object)null)
			{
				CrunchSound = AssetHandler.Bundle.LoadAsset<GameObject>("CrunchSound.prefab");
			}
		}

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

		private void Update()
		{
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null && (Object)(object)((Component)MonoSingleton<NewMovement>.Instance).gameObject.GetComponent<CheckVelocityOnHit>() == (Object)null)
			{
				((Component)MonoSingleton<NewMovement>.Instance).gameObject.AddComponent<CheckVelocityOnHit>();
			}
		}
	}
	[TweakMetadata("Floor Is Lava", "waffle.ultrakill.ultratweaker.mutator_floor_is_lava", "Take damage when on the floor.", "waffle.ultrakill.ultratweaker.mutators", 2, "Lava", true, true)]
	public class FloorIsLava : Tweak
	{
		private float _toRemove = 0f;

		private float _onFloorFor;

		public FloorIsLava()
		{
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"damage_after",
					new FloatSubsetting(this, new Metadata("Damage After", "damage_after", "Time before damage starts."), new SliderFloatSubsettingElement("{0}s"), 0.1f, 5f, 0f)
				},
				{
					"damage_per_second",
					new IntSubsetting(this, new Metadata("Damage Per Second", "damage_per_second", "Damage per second."), new SliderIntSubsettingElement(), 25, 100, 0)
				}
			};
		}

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

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

		private void Update()
		{
			if (!((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null))
			{
				return;
			}
			if (MonoSingleton<NewMovement>.Instance.gc.touchingGround)
			{
				_onFloorFor += Time.deltaTime;
			}
			else
			{
				_onFloorFor = 0f;
			}
			if (MonoSingleton<StatsManager>.Instance.timer && _onFloorFor > Subsettings["damage_after"].GetValue<float>())
			{
				_toRemove += Time.deltaTime * (float)Subsettings["damage_per_second"].GetValue<int>();
				if ((int)_toRemove >= 1)
				{
					NewMovement instance = MonoSingleton<NewMovement>.Instance;
					instance.hp -= (int)_toRemove;
					_toRemove -= (int)_toRemove;
				}
				if (MonoSingleton<NewMovement>.Instance.hp <= 0 && !MonoSingleton<NewMovement>.Instance.dead)
				{
					MonoSingleton<NewMovement>.Instance.GetHurt(int.MaxValue, false, 1f, true, true, 0.35f, false);
				}
			}
		}
	}
	[TweakMetadata("Skull Florpification", "waffle.ultrakill.ultratweaker.florpify_:3", "Replace skulls with Florp.", "waffle.ultrakill.ultratweaker.fun", 0, null, true, false)]
	public class Florpify : Tweak
	{
		public static class FlorpyPatches
		{
			[HarmonyPatch(typeof(Skull), "Start")]
			[HarmonyPostfix]
			private static void CreateFlorpy(Skull __instance)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				Renderer component = ((Component)__instance).gameObject.GetComponent<Renderer>();
				if ((Object)(object)component != (Object)null)
				{
					component.enabled = false;
					GameObject val = Object.Instantiate<GameObject>(_florps[((Component)__instance).GetComponent<ItemIdentifier>().itemType], ((Component)component).transform);
					val.GetComponentInChildren<Renderer>().material.shader = component.material.shader;
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.florpify_:3");

		private static Dictionary<ItemType, GameObject> _florps;

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			if (_florps == null)
			{
				_florps = new Dictionary<ItemType, GameObject>
				{
					{
						(ItemType)1,
						AssetHandler.Bundle.LoadAsset<GameObject>("Blue Florp")
					},
					{
						(ItemType)2,
						AssetHandler.Bundle.LoadAsset<GameObject>("Red Florp")
					}
				};
			}
			_harmony.PatchAll(typeof(FlorpyPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Force Gun Panel", "waffle.ultrakill.ultratweaker.force_gun", "Makes the gun panel always appear. So that you can use the other Rail charge indicator.", "waffle.ultrakill.ultratweaker.hud", 3, null, true, false)]
	public class ForceGunPanel : Tweak
	{
		public static class ForceGunPatches
		{
			[HarmonyPatch(typeof(GunControl), "Start")]
			[HarmonyPostfix]
			private static void PatchGunPanel(GunControl __instance)
			{
				if (Tweak.IsGameplayScene())
				{
					__instance.gunPanel[0].SetActive(true);
				}
			}

			[HarmonyPatch(typeof(GunSetter), "ResetWeapons")]
			[HarmonyPostfix]
			private static void PatchGunPanelSetter(GunSetter __instance)
			{
				if (Tweak.IsGameplayScene())
				{
					MonoSingleton<GunControl>.Instance.gunPanel[0].SetActive(true);
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.force_gun");

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(ForceGunPatches));
			if (Tweak.IsGameplayScene())
			{
				MonoSingleton<GunControl>.Instance.gunPanel[0].SetActive(true);
			}
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
			MonoSingleton<GunControl>.Instance.gunPanel[0].SetActive(false);
		}
	}
	[TweakMetadata("FPS Counter", "waffle.ultrakill.ultratweaker.fps_meter", "Shows a counter with your frames per second.", "waffle.ultrakill.ultratweaker.hud", 2, null, true, false)]
	public class FPSCount : Tweak
	{
		private GameObject _originalCounter;

		private GameObject _counter;

		private Text _text;

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			if ((Object)(object)_originalCounter == (Object)null)
			{
				_originalCounter = AssetHandler.Bundle.LoadAsset<GameObject>("FPS");
			}
			CreateCounter();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			Object.Destroy((Object)(object)_counter);
		}

		public void CreateCounter()
		{
			if ((Object)(object)MonoSingleton<CanvasController>.Instance != (Object)null)
			{
				_counter = Object.Instantiate<GameObject>(_originalCounter, ((Component)MonoSingleton<CanvasController>.Instance).transform);
				_text = _counter.ChildByName("Count").GetComponent<Text>();
			}
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			CreateCounter();
		}

		public void Update()
		{
			if ((Object)(object)_text != (Object)null)
			{
				float num = 1f / Time.unscaledDeltaTime;
				_text.text = $"FPS: {(int)num}";
			}
		}
	}
	[TweakMetadata("Fragility", "waffle.ultrakill.ultratweaker.mutator_fragility", "Change your max health.", "waffle.ultrakill.ultratweaker.mutators", 3, "Fragility", true, true)]
	public class Fragility : Tweak
	{
		public static class FragilityPatches
		{
			[HarmonyPatch(typeof(NewMovement), "Update")]
			[HarmonyPostfix]
			private static void LimitHp(NewMovement __instance)
			{
				int value = Tweak.GetInstance<Fragility>().Subsettings["max_health"].GetValue<int>();
				if (__instance.antiHp < (float)(100 - value))
				{
					__instance.antiHp = 100 - value;
				}
				if (__instance.hp > value)
				{
					__instance.hp = value;
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_fragility");

		public Fragility()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"max_health",
				new IntSubsetting(this, new Metadata("Max Health", "max_health", "Maximum player health."), new SliderIntSubsettingElement(), 25, 100, 1)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(FragilityPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Fresh", "waffle.ultrakill.ultratweaker.mutator_fresh", "Hurts you if you're not stylish.", "waffle.ultrakill.ultratweaker.mutators", 4, "Fresh", true, true)]
	public class Fresh : Tweak
	{
		private float _toRemove = 0f;

		public Fresh()
		{
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"fresh",
					new IntSubsetting(this, new Metadata("FRESH", "fresh", "HP drained per second on Fresh."), new SliderIntSubsettingElement(), 0, 100, 0)
				},
				{
					"used",
					new IntSubsetting(this, new Metadata("USED", "used", "HP drained per second on Used."), new SliderIntSubsettingElement(), 0, 100, 4)
				},
				{
					"stale",
					new IntSubsetting(this, new Metadata("STALE", "stale", "HP drained per second on Stale."), new SliderIntSubsettingElement(), 0, 100, 8)
				},
				{
					"dull",
					new IntSubsetting(this, new Metadata("DULL", "dull", "HP drained per second on Dull."), new SliderIntSubsettingElement(), 0, 100, 12)
				}
			};
		}

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

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

		public void Update()
		{
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			Dictionary<StyleFreshnessState, float> dictionary = new Dictionary<StyleFreshnessState, float>
			{
				{
					(StyleFreshnessState)0,
					Subsettings["fresh"].GetValue<int>()
				},
				{
					(StyleFreshnessState)1,
					Subsettings["used"].GetValue<int>()
				},
				{
					(StyleFreshnessState)2,
					Subsettings["stale"].GetValue<int>()
				},
				{
					(StyleFreshnessState)3,
					Subsettings["dull"].GetValue<int>()
				}
			};
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null && MonoSingleton<StatsManager>.Instance.timer && MonoSingleton<GunControl>.Instance.activated)
			{
				_toRemove += dictionary[MonoSingleton<StyleHUD>.Instance.GetFreshnessState(MonoSingleton<GunControl>.Instance.currentWeapon)] * Time.deltaTime;
				if ((int)_toRemove >= 1)
				{
					NewMovement instance = MonoSingleton<NewMovement>.Instance;
					instance.hp -= (int)_toRemove;
					_toRemove -= (int)_toRemove;
				}
				if (MonoSingleton<NewMovement>.Instance.hp <= 0 && !MonoSingleton<NewMovement>.Instance.dead)
				{
					MonoSingleton<NewMovement>.Instance.GetHurt(int.MaxValue, false, 1f, true, true, 0.35f, false);
				}
			}
		}
	}
	[TweakMetadata("Fuel Leak", "waffle.ultrakill.ultratweaker.mutator_fuel_leak", "Lose health over time.", "waffle.ultrakill.ultratweaker.mutators", 5, "Leak", true, true)]
	public class FuelLeak : Tweak
	{
		private float _toRemove = 0f;

		public FuelLeak()
		{
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"drain",
				new IntSubsetting(this, new Metadata("Damage Per Second", "drain", "HP drained per second."), new SliderIntSubsettingElement(), 0, 25, 1)
			} };
		}

		public void Update()
		{
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null && MonoSingleton<StatsManager>.Instance.timer && MonoSingleton<GunControl>.Instance.activated)
			{
				_toRemove += Time.deltaTime * (float)Subsettings["drain"].GetValue<int>();
				if ((int)_toRemove >= 1)
				{
					NewMovement instance = MonoSingleton<NewMovement>.Instance;
					instance.hp -= (int)_toRemove;
					_toRemove -= (int)_toRemove;
				}
				if (MonoSingleton<NewMovement>.Instance.hp <= 0 && !MonoSingleton<NewMovement>.Instance.dead)
				{
					MonoSingleton<NewMovement>.Instance.GetHurt(int.MaxValue, false, 1f, true, true, 0.35f, false);
				}
			}
		}
	}
	[TweakMetadata("Hitstop", "waffle.ultrakill.ultratweaker.hitstop", "Change hitstop duration, change the parry flash.", "waffle.ultrakill.ultratweaker.misc", 0, null, true, false)]
	public class Hitstop : Tweak
	{
		public static class HitstopPatches
		{
			[HarmonyPatch(typeof(TimeController), "HitStop")]
			[HarmonyPrefix]
			private static void PatchHitstop(ref float length)
			{
				length *= (float)Tweak.GetInstance<Hitstop>().Subsettings["hitstop_length"].GetValue<int>() / 100f;
			}

			[HarmonyPatch(typeof(TimeController), "TrueStop")]
			[HarmonyPrefix]
			private static void PatchTruestop(ref float length)
			{
				length *= (float)Tweak.GetInstance<Hitstop>().Subsettings["truestop_length"].GetValue<int>() / 100f;
			}

			[HarmonyPatch(typeof(TimeController), "SlowDown")]
			[HarmonyPrefix]
			private static void PatchSlowdown(ref float amount)
			{
				amount *= (float)Tweak.GetInstance<Hitstop>().Subsettings["slowdown_length"].GetValue<int>() / 100f;
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.hitstop");

		public Hitstop()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"hitstop_length",
					new IntSubsetting(this, new Metadata("Hitstop Length", "hitstop_length", "How long hitstop lasts."), new SliderIntSubsettingElement("{0}%"), 100, 200, 0)
				},
				{
					"truestop_length",
					new IntSubsetting(this, new Metadata("Truestop Length", "truestop_length", "How long truestop lasts."), new SliderIntSubsettingElement("{0}%"), 100, 200, 0)
				},
				{
					"slowdown_length",
					new IntSubsetting(this, new Metadata("Slowdown Length", "slowdown_length", "How long slowdown lasts."), new SliderIntSubsettingElement("{0}%"), 100, 200, 0)
				}
			};
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(HitstopPatches));
			OnSubsettingUpdate();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Ice", "waffle.ultrakill.ultratweaker.mutator_ice", "Become slippery.", "waffle.ultrakill.ultratweaker.mutators", 6, "Ice", false, true)]
	public class Ice : Tweak
	{
		public static class IcePatches
		{
			[HarmonyPatch(typeof(NewMovement), "Start")]
			[HarmonyPostfix]
			public static void IcePlayer(NewMovement __instance)
			{
				__instance.modForcedFrictionMultip = Tweak.GetInstance<Ice>().Subsettings["slippyness"].GetValue<float>();
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_ice");

		public Ice()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"slippyness",
				new FloatSubsetting(this, new Metadata("Friction", "slippyness", "How grippy you are."), new SliderFloatSubsettingElement("{0}", 2), 0.1f, 0.5f, 0f)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(IcePatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
			MonoSingleton<NewMovement>.Instance.modForcedFrictionMultip = 1f;
		}

		public override void OnSubsettingUpdate()
		{
			MonoSingleton<NewMovement>.Instance.modForcedFrictionMultip = Tweak.GetInstance<Ice>().Subsettings["slippyness"].GetValue<float>();
		}
	}
	[TweakMetadata("Mitosis", "waffle.ultrakill.ultratweaker.mutator_mitosis", "Duplicates enemies.", "waffle.ultrakill.ultratweaker.mutators", 7, "Mitosis", false, true)]
	public class Mitosis : Tweak
	{
		public static class MitosisPatches
		{
			[HarmonyPatch(typeof(EnemyIdentifier), "Start")]
			[HarmonyPrefix]
			public static void HmmTodayIWillUndergoMitosis(EnemyIdentifier __instance)
			{
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)((Component)__instance).gameObject).name.Contains("(MITOSISED)"))
				{
					for (int i = 0; i < Tweak.GetInstance<Mitosis>().Subsettings["enemy_amount"].GetValue<int>() - 1; i++)
					{
						GameObject val = Object.Instantiate<GameObject>(((Component)__instance).gameObject, ((Component)__instance).transform.parent);
						((Object)val).name = ((Object)((Component)__instance).gameObject).name + "(MITOSISED)";
						val.transform.position = ((Component)__instance).transform.position;
						val.GetComponent<EnemyIdentifier>().blessed = false;
					}
				}
			}

			[HarmonyPatch(typeof(ActivateNextWave), "Awake")]
			[HarmonyPostfix]
			public static void IncreaseAnw(ActivateNextWave __instance)
			{
				GoreZone componentInParent = ((Component)__instance).gameObject.GetComponentInParent<GoreZone>();
				if ((Object)(object)componentInParent == (Object)null)
				{
					Debug.Log((object)("No GoreZone found in hierarchy of " + ((Object)((Component)__instance).gameObject).name));
					return;
				}
				Debug.Log((object)string.Format("{0} | {1} / {2} / {3}", __instance.enemyCount, ((Object)(object)((Component)componentInParent).transform.parent == (Object)null) ? "orphan" : ((Object)((Component)componentInParent).transform.parent).name, ((Object)((Component)componentInParent).transform).name, ((Object)((Component)__instance).gameObject).name));
				if (((Object)((Component)componentInParent).gameObject).name.Contains("(Clone)"))
				{
					__instance.enemyCount *= Tweak.GetInstance<Mitosis>().Subsettings["enemy_amount"].GetValue<int>();
					DeathMarker[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<DeathMarker>(true);
					foreach (DeathMarker val in componentsInChildren)
					{
						__instance.enemyCount--;
					}
					Debug.Log((object)$"{__instance.enemyCount} | Whar?");
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_mitosis");

		public static List<ActivateNextWave> AlreadyMultiplied = new List<ActivateNextWave>();

		public Mitosis()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"enemy_amount",
				new IntSubsetting(this, new Metadata("Amount", "enemy_amount", "The amount of enemies to clone"), new SliderIntSubsettingElement(), 2, 10, 2)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			AlreadyMultiplied.Clear();
			_harmony.PatchAll(typeof(MitosisPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			AlreadyMultiplied.Clear();
		}
	}
	[TweakMetadata("Sandify", "waffle.ultrakill.ultratweaker.mutator_sandify", "Cover enemies in sand.", "waffle.ultrakill.ultratweaker.mutators", 8, "Sandify", true, true)]
	public class Sandify : Tweak
	{
		public static class SandifyPatches
		{
			[HarmonyPatch(typeof(EnemyIdentifier), "Awake")]
			[HarmonyPostfix]
			public static void MakeSandy(EnemyIdentifier __instance)
			{
				__instance.sandified = true;
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_sandify");

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(SandifyPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Speed", "waffle.ultrakill.ultratweaker.mutator_speed", "Speed up yourself, and enemies", "waffle.ultrakill.ultratweaker.mutators", 9, "Speed", false, true)]
	public class Speed : Tweak
	{
		public static class SpeedPatches
		{
			[HarmonyPatch(typeof(NewMovement), "Start")]
			[HarmonyPostfix]
			public static void SpeedPlayer(NewMovement __instance)
			{
				_startSpeed = __instance.walkSpeed;
				__instance.walkSpeed = _startSpeed * Tweak.GetInstance<Speed>().Subsettings["player_speed_mult"].GetValue<float>();
			}

			[HarmonyPatch(typeof(EnemyIdentifier), "Start")]
			[HarmonyPostfix]
			public static void SpeedEnemy(EnemyIdentifier __instance)
			{
				float value = Tweak.GetInstance<Speed>().Subsettings["enemy_speed_mult"].GetValue<float>();
				if (!__instance.speedBuff)
				{
					((Component)__instance).gameObject.AddComponent<DisableDoubleRender>();
					__instance.SpeedBuff(value);
				}
				else
				{
					__instance.speedBuffModifier *= value;
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_speed");

		private static float _startSpeed;

		public Speed()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"player_speed_mult",
					new FloatSubsetting(this, new Metadata("Player Speed", "player_speed_mult", "Speed multiplier for the player."), new SliderFloatSubsettingElement("{0}x"), 2f, 10f, 0f)
				},
				{
					"enemy_speed_mult",
					new FloatSubsetting(this, new Metadata("Enemy Speed", "enemy_speed_mult", "Speed multiplier for the enemies."), new SliderFloatSubsettingElement("{0}x"), 2f, 10f, 0f)
				}
			};
		}

		public override void OnSubsettingUpdate()
		{
			MonoSingleton<NewMovement>.Instance.walkSpeed = _startSpeed * Subsettings["player_speed_mult"].GetValue<float>();
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null)
			{
				_startSpeed = MonoSingleton<NewMovement>.Instance.walkSpeed;
				MonoSingleton<NewMovement>.Instance.walkSpeed = _startSpeed * Tweak.GetInstance<Speed>().Subsettings["player_speed_mult"].GetValue<float>();
			}
			_harmony.PatchAll(typeof(SpeedPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null)
			{
				MonoSingleton<NewMovement>.Instance.walkSpeed = _startSpeed;
			}
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Stat Panels", "waffle.ultrakill.ultratweaker.stat_panels", "Various info panels.", "waffle.ultrakill.ultratweaker.hud", 1, null, true, false)]
	public class StatPanels : Tweak
	{
		public class Hit
		{
			public DateTime time;

			public float dmg;

			public Hit(float dmg)
			{
				this.dmg = dmg;
				time = DateTime.Now;
			}
		}

		public class PanelPatches
		{
			[HarmonyPatch(typeof(EnemyIdentifier), "DeliverDamage")]
			[HarmonyPrefix]
			private static void SetHealthBefore(EnemyIdentifier __instance, out float __state)
			{
				__state = __instance.health;
			}

			[HarmonyPatch(typeof(EnemyIdentifier), "DeliverDamage")]
			[HarmonyPostfix]
			private static void DoHealthAfter(EnemyIdentifier __instance, float __state)
			{
				float num = __instance.health;
				if (num < 0f)
				{
					num = 0f;
				}
				float num2 = __state - num;
				if (num2 != 0f)
				{
					HitsSecond.Add(new Hit(num2));
				}
			}
		}

		private Harmony harmony = new Harmony("waffle.ultrakill.ultratweaker.stat_panels");

		private GameObject _originalPanels;

		private GameObject _currentPanels;

		private GameObject _dps;

		private Text _dpsText;

		private GameObject _speed;

		private Text _speedText;

		private GameObject _info;

		private Text _hpText;

		private Text _staminaText;

		private GameObject _weapons;

		private Image _gunImage;

		private Image _punchImage;

		private Slider _railSlider;

		public static List<Hit> HitsSecond = new List<Hit>();

		public StatPanels()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"info",
					new BoolSubsetting(this, new Metadata("Info Panel", "info", "Shows your health and stamina."), new BoolSubsettingElement(), defaultValue: false)
				},
				{
					"weapons",
					new BoolSubsetting(this, new Metadata("Weapon Panel", "weapons", "Shows your weapon, fist, and rail charge."), new BoolSubsettingElement(), defaultValue: false)
				},
				{
					"dps",
					new BoolSubsetting(this, new Metadata("DPS Panel", "dps", "Shows your damage per second."), new BoolSubsettingElement(), defaultValue: false)
				},
				{
					"speed",
					new BoolSubsetting(this, new Metadata("Speed Panel", "speed", "Shows your speed."), new BoolSubsettingElement(), defaultValue: false)
				},
				{
					"speed_mode",
					new IntSubsetting(this, new Metadata("Speed: Mode", "speed_mode", "Should it show total speed, or speed in each direction?"), new DropdownIntSubsettingElement(new List<string> { "(x) m/s", "(x, y, z) m/s" }), 0, 1, 0)
				},
				{
					"size",
					new IntSubsetting(this, new Metadata("Size", "size", "How big the panels are."), new SliderIntSubsettingElement("{0}%"), 100, 200, 0)
				}
			};
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			harmony.PatchAll(typeof(PanelPatches));
			Create();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			Object.Destroy((Object)(object)_currentPanels);
			harmony.UnpatchSelf();
		}

		public override void OnSubsettingUpdate()
		{
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)MonoSingleton<CanvasController>.Instance != (Object)null) || !Tweak.IsGameplayScene() || !((Object)(object)_currentPanels != (Object)null))
			{
				return;
			}
			_dps.SetActive(Subsettings["dps"].GetValue<bool>());
			_speed.SetActive(Subsettings["speed"].GetValue<bool>());
			_info.SetActive(Subsettings["info"].GetValue<bool>());
			_weapons.SetActive(Subsettings["weapons"].GetValue<bool>());
			foreach (GameObject item in _currentPanels.ChildrenList())
			{
				int num = 0;
				foreach (GameObject item2 in item.ChildrenList())
				{
					if (item2.activeSelf)
					{
						num++;
					}
				}
				if (num == 0)
				{
					item.SetActive(false);
				}
				else
				{
					item.SetActive(true);
				}
			}
			_currentPanels.transform.SetAsFirstSibling();
			_currentPanels.transform.localScale = Vector3.one * (float)Subsettings["size"].GetValue<int>() / 100f;
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			Create();
		}

		private void Create()
		{
			if ((Object)(object)MonoSingleton<CanvasController>.Instance != (Object)null && Tweak.IsGameplayScene())
			{
				if ((Object)(object)_originalPanels == (Object)null)
				{
					_originalPanels = AssetHandler.Bundle.LoadAsset<GameObject>("All Panels.prefab");
				}
				_currentPanels = Object.Instantiate<GameObject>(_originalPanels, ((Component)MonoSingleton<CanvasController>.Instance).transform);
				_dps = _currentPanels.ChildByName("Top Row").ChildByName("DPS");
				_speed = _currentPanels.ChildByName("Top Row").ChildByName("Speed");
				_info = _currentPanels.ChildByName("Bottom Row").ChildByName("Info");
				_weapons = _currentPanels.ChildByName("Bottom Row").ChildByName("Weapons");
				_dpsText = _dps.ChildByName("DPS").GetComponent<Text>();
				_speedText = _speed.ChildByName("SPEED").GetComponent<Text>();
				_hpText = _info.ChildByName("HP").GetComponent<Text>();
				_staminaText = _info.ChildByName("Stamina").GetComponent<Text>();
				_gunImage = _weapons.ChildByName("Gun").GetComponent<Image>();
				_punchImage = _weapons.ChildByName("Fist").GetComponent<Image>();
				_railSlider = _weapons.ChildByName("Slider").GetComponent<Slider>();
				OnSubsettingUpdate();
			}
		}

		private float CalculateDps()
		{
			float num = 0f;
			for (int i = 0; i < HitsSecond.Count; i++)
			{
				Hit hit = HitsSecond[i];
				if ((DateTime.Now - hit.time).TotalSeconds > 1.0)
				{
					HitsSecond.RemoveAt(i);
					i--;
					continue;
				}
				float dmg = hit.dmg;
				if (dmg < 1000000f && dmg > 0f)
				{
					num += dmg;
				}
			}
			return num;
		}

		public void Update()
		{
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_currentPanels != (Object)null))
			{
				return;
			}
			if (_info.activeSelf && (Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null)
			{
				string text = "";
				string text2 = "";
				if (MonoSingleton<NewMovement>.Instance.antiHp != 0f)
				{
					text += "<color=#7C7A7B>";
					text2 += "</color>";
				}
				_hpText.text = $"{MonoSingleton<NewMovement>.Instance.hp}{text} / {100.0 - Math.Round(MonoSingleton<NewMovement>.Instance.antiHp, 0)}{text2}";
				_staminaText.text = (MonoSingleton<NewMovement>.Instance.boostCharge / 100f).ToString("0.00") + " / 3.00";
			}
			if (_weapons.activeSelf && (Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null && (Object)(object)MonoSingleton<WeaponHUD>.Instance != (Object)null && (Object)(object)MonoSingleton<WeaponCharges>.Instance != (Object)null && (Object)(object)MonoSingleton<FistControl>.Instance != (Object)null)
			{
				_gunImage.sprite = MonoSingleton<WeaponHUD>.Instance.img.sprite;
				((Graphic)_gunImage).color = ((Graphic)MonoSingleton<WeaponHUD>.Instance.img).color;
				_punchImage.sprite = MonoSingleton<FistControl>.Instance.fistIcon.sprite;
				((Graphic)_punchImage).color = ((Graphic)MonoSingleton<FistControl>.Instance.fistIcon).color;
				_railSlider.value = MonoSingleton<WeaponCharges>.Instance.raicharge;
			}
			if (_dps.activeSelf)
			{
				_dpsText.text = Math.Round(CalculateDps(), 2).ToString();
			}
			if (_speed.activeSelf)
			{
				Vector3 val;
				if (Subsettings["speed_mode"].GetValue<int>() == 0)
				{
					_speedText.fontSize = 72;
					Text speedText = _speedText;
					val = MonoSingleton<NewMovement>.Instance.rb.velocity;
					speedText.text = Math.Round(((Vector3)(ref val)).magnitude, 2).ToString();
				}
				else
				{
					_speedText.fontSize = 42;
					Vector3 velocity = MonoSingleton<NewMovement>.Instance.rb.velocity;
					val = new Vector3(velocity.x, velocity.y, velocity.z);
					string text3 = ((object)(Vector3)(ref val)).ToString();
					text3 = text3.Replace("(", "").Replace(")", "").Replace(", ", "\n");
					_speedText.text = text3;
				}
			}
		}
	}
	[TweakMetadata("Submerged", "waffle.ultrakill.ultratweaker.mutator_submerged", "Everything is underwater.", "waffle.ultrakill.ultratweaker.mutators", 10, "Submerged", false, true)]
	public class Submerged : Tweak
	{
		public static class SubmergedPatches
		{
			[HarmonyPatch(typeof(NewMovement), "Start")]
			[HarmonyPostfix]
			public static void SpawnWater()
			{
				MakeWater();
			}

			[HarmonyPatch(typeof(Water), "Start")]
			[HarmonyPrefix]
			public static void DisableOtherWaters(Water __instance)
			{
				if (((Object)((Component)__instance).gameObject).name != "UT WATER!!!")
				{
					((Behaviour)__instance).enabled = false;
				}
			}

			[HarmonyPatch(typeof(BloodsplatterManager), "GetGore", new Type[]
			{
				typeof(GoreType),
				typeof(bool),
				typeof(bool),
				typeof(bool),
				typeof(EnemyIdentifier)
			})]
			[HarmonyPrefix]
			public static void MakeUnderwater(ref bool isUnderwater)
			{
				isUnderwater = true;
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_submerged");

		private static GameObject _water;

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(SubmergedPatches));
			MakeWater();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
			if ((Object)(object)_water != (Object)null)
			{
				Object.Destroy((Object)(object)_water);
			}
		}

		public static void MakeWater()
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			if (Tweak.IsGameplayScene())
			{
				_water = GameObject.CreatePrimitive((PrimitiveType)3);
				((Object)_water).name = "UT WATER!!!";
				_water.AddComponent<Rigidbody>();
				_water.GetComponent<Rigidbody>().isKinematic = true;
				_water.GetComponent<Collider>().isTrigger = true;
				_water.AddComponent<Water>();
				_water.GetComponent<Water>().bubblesParticle = new GameObject();
				_water.GetComponent<Water>().clr = new Color(0f, 0.5f, 1f);
				((Renderer)_water.GetComponent<MeshRenderer>()).enabled = false;
				_water.transform.localScale = Vector3.one * 1E+10f;
			}
		}
	}
	[TweakMetadata("Tankify", "waffle.ultrakill.ultratweaker.mutator_tankify", "Change enemy health.", "waffle.ultrakill.ultratweaker.mutators", 11, "Tankify", false, true)]
	public class Tankify : Tweak
	{
		public static class TankifyPatches
		{
			[HarmonyPatch(typeof(EnemyIdentifier), "Start")]
			[HarmonyPostfix]
			public static void IncreaseHealth(EnemyIdentifier __instance)
			{
				float value = Tweak.GetInstance<Tankify>().Subsettings["multiplier"].GetValue<float>();
				if (!__instance.healthBuff)
				{
					((Component)__instance).gameObject.AddComponent<DisableDoubleRender>();
					__instance.HealthBuff(value);
				}
				else
				{
					__instance.healthBuffModifier *= value;
				}
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.mutator_tankify");

		public Tankify()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"multiplier",
				new FloatSubsetting(this, new Metadata("Health Multplier", "multiplier", "Enemy health multiplier."), new SliderFloatSubsettingElement(), 2f, 10f, 0f)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(TankifyPatches));
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("UI Scale", "waffle.ultrakill.ultratweaker.ui_scale", "Change the size of your HUD and UI.", "waffle.ultrakill.ultratweaker.hud", 0, null, true, false)]
	public class UIScale : Tweak
	{
		public static class UIScalePatches
		{
			[HarmonyPatch(typeof(CanvasController), "Awake")]
			[HarmonyPostfix]
			private static void PatchCanvasScale(CanvasController __instance)
			{
				UpdateCanvas();
			}

			[HarmonyPatch(typeof(HudController), "Start")]
			[HarmonyPostfix]
			private static void PatchHUDScale(HudController __instance)
			{
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_0076: Unknown result type (might be due to invalid IL or missing references)
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0099: Unknown result type (might be due to invalid IL or missing references)
				//IL_009e: Unknown result type (might be due to invalid IL or missing references)
				if (((Object)((Component)__instance).gameObject).name == "HUD")
				{
					_info = ((Component)__instance).gameObject.ChildByName("GunCanvas");
					_style = ((Component)__instance).gameObject.ChildByName("StyleCanvas");
					_results = ((Component)__instance).gameObject.ChildByName("FinishCanvas");
					if (DoesntKnowOriginal)
					{
						OriginalInfoScale = _info.transform.localScale;
						OriginalStyleScale = _style.transform.localScale;
						OriginalResultsScale = _results.transform.localScale;
						DoesntKnowOriginal = false;
					}
					UpdateHUD();
				}
			}

			[HarmonyPatch(typeof(BossBarManager), "RecalculateStretch")]
			[HarmonyPostfix]
			private static void SetBossBarSize(BossBarManager __instance)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				((Component)__instance).transform.localScale = Vector3.one * ((float)Tweak.GetInstance<UIScale>().Subsettings["bossbar_hud_scale"].GetValue<int>() / 100f);
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.ui_scale");

		public static bool DoesntKnowOriginal = true;

		public static Vector3 OriginalInfoScale;

		public static Vector3 OriginalStyleScale;

		public static Vector3 OriginalResultsScale;

		private static GameObject _info;

		private static GameObject _style;

		private static GameObject _results;

		public UIScale()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"info_hud_scale",
					new IntSubsetting(this, new Metadata("Info HUD Scale", "info_hud_scale", "The size of the info, e.g. health and stamina."), new SliderIntSubsettingElement("{0}%"), 100, 110, 0)
				},
				{
					"style_hud_scale",
					new IntSubsetting(this, new Metadata("Style HUD Scale", "style_hud_scale", "The size of the style panel."), new SliderIntSubsettingElement("{0}%"), 100, 110, 0)
				},
				{
					"finalrank_hud_scale",
					new IntSubsetting(this, new Metadata("End HUD Scale", "finalrank_hud_scale", "The size of the panel that shows your final rank."), new SliderIntSubsettingElement("{0}%"), 100, 110, 0)
				},
				{
					"bossbar_hud_scale",
					new IntSubsetting(this, new Metadata("Boss Bar Scale", "bossbar_hud_scale", "The size of the boss bar."), new SliderIntSubsettingElement("{0}%"), 100, 100, 0)
				},
				{
					"canvas_scale",
					new IntSubsetting(this, new Metadata("Canvas Scale", "canvas_scale", "The size of the info, e.g. health and stamina."), new SliderIntSubsettingElement("{0}%"), 100, 100, 25)
				}
			};
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			DoesntKnowOriginal = true;
			_harmony.PatchAll(typeof(UIScalePatches));
			UpdateHUD();
			UpdateCanvas();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			UpdateHUD(toDefault: true);
			UpdateCanvas(toDefault: true);
			_harmony.UnpatchSelf();
		}

		public override void OnSubsettingUpdate()
		{
			UpdateHUD();
			UpdateCanvas();
		}

		public static void UpdateHUD(bool toDefault = false)
		{
			//IL_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			if (((Object)(object)_info == (Object)null || (Object)(object)_style == (Object)null || (Object)(object)_results == (Object)null) && Object.FindObjectsOfType<HudController>() != null)
			{
				HudController[] array = Object.FindObjectsOfType<HudController>();
				foreach (HudController val in array)
				{
					if (((Object)((Component)val).gameObject).name == "HUD")
					{
						_info = ((Component)val).gameObject.ChildByName("GunCanvas");
						_style = ((Component)val).gameObject.ChildByName("StyleCanvas");
						_results = ((Component)val).gameObject.ChildByName("FinishCanvas");
						if (DoesntKnowOriginal)
						{
							OriginalInfoScale = _info.transform.localScale;
							OriginalStyleScale = _style.transform.localScale;
							OriginalResultsScale = _results.transform.localScale;
							DoesntKnowOriginal = false;
						}
					}
				}
			}
			if (!((Object)(object)_info == (Object)null) && !((Object)(object)_style == (Object)null) && !((Object)(object)_results == (Object)null))
			{
				float num = Tweak.GetInstance<UIScale>().Subsettings["info_hud_scale"].GetValue<int>();
				float num2 = Tweak.GetInstance<UIScale>().Subsettings["style_hud_scale"].GetValue<int>();
				float num3 = Tweak.GetInstance<UIScale>().Subsettings["finalrank_hud_scale"].GetValue<int>();
				if (!toDefault)
				{
					_info.transform.localScale = OriginalInfoScale * (num / 100f);
					_style.transform.localScale = OriginalStyleScale * (num2 / 100f);
					_results.transform.localScale = OriginalResultsScale * (num3 / 100f);
				}
				else
				{
					_info.transform.localScale = OriginalInfoScale;
					_style.transform.localScale = OriginalStyleScale;
					_results.transform.localScale = OriginalResultsScale;
				}
			}
		}

		public static void UpdateCanvas(bool toDefault = false)
		{
			float num = Tweak.GetInstance<UIScale>().Subsettings["canvas_scale"].GetValue<int>();
			if (num != 100f)
			{
				GameObject gameObject = ((Component)MonoSingleton<CanvasController>.Instance).gameObject;
				gameObject.GetComponent<CanvasScaler>().uiScaleMode = (ScaleMode)0;
				gameObject.GetComponent<CanvasScaler>().scaleFactor = (float)(1920 / Screen.width) * 1.5f;
				if (!toDefault)
				{
					CanvasScaler component = gameObject.GetComponent<CanvasScaler>();
					component.scaleFactor *= num / 100f;
				}
			}
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			DoesntKnowOriginal = true;
		}
	}
	[TweakMetadata("Ultrahot", "waffle.ultrakill.ultratweaker.mutator_ultrahot", "Time moves when you move.", "waffle.ultrakill.ultratweaker.mutators", 12, "Ultrahot", false, true)]
	public class Ultrahot : Tweak
	{
		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
		}

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

		public void Update()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (Tweak.IsGameplayScene())
			{
				float num = 20f;
				float num2 = 0.01f;
				float num3 = 1.25f;
				float num4 = 15f;
				Vector3 velocity = MonoSingleton<NewMovement>.Instance.rb.velocity;
				float num5 = ((Vector3)(ref velocity)).magnitude / num;
				num5 = Mathf.Clamp(num5, num2, num3);
				Time.timeScale = Mathf.Lerp(Time.timeScale, num5, Time.deltaTime * num4);
			}
		}
	}
	[TweakMetadata("Unobtrusive Blood", "waffle.ultrakill.ultratweaker.unobtrusive_blood", "Make the screen blood more transparent, or gone.", "waffle.ultrakill.ultratweaker.hud", 3, null, true, false)]
	public class UnobtrusiveBlood : Tweak
	{
		public static class UnobtrusiveBloodPatches
		{
			[HarmonyPatch(typeof(ScreenBlood), "Start")]
			[HarmonyPostfix]
			private static void ChangeOpacity(ScreenBlood __instance)
			{
				__instance.clr.a = (float)Tweak.GetInstance<UnobtrusiveBlood>().Subsettings["transparency"].GetValue<int>() / 100f;
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.unobtrusive_blood");

		public UnobtrusiveBlood()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting> { 
			{
				"transparency",
				new IntSubsetting(this, new Metadata("Blood Opacity", "transparency", "How transparent the blood is."), new SliderIntSubsettingElement("{0}%"), 44, 100, 0)
			} };
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(UnobtrusiveBloodPatches));
			OnSubsettingUpdate();
		}

		public override void OnTweakDisabled()
		{
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
		}
	}
	[TweakMetadata("Viewmodel Transform", "waffle.ultrakill.ultratweaker.viewmodel_transform", "Resize, change the FOV of, and otherwise tweak the viewmodel.", "waffle.ultrakill.ultratweaker.misc", 1, null, true, false)]
	public class ViewmodelTransform : Tweak
	{
		public static class ViewmodelPatches
		{
			[HarmonyPatch(typeof(FistControl), "Update")]
			[HarmonyPostfix]
			private static void FistSize(FistControl __instance)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				if (((Component)__instance).transform.localScale == Vector3.one)
				{
					float num = Tweak.GetInstance<ViewmodelTransform>().Subsettings["viewmodel_size_multiplier"].GetValue<int>();
				}
			}

			[HarmonyPatch(typeof(WeaponPos), "CheckPosition")]
			[HarmonyPostfix]
			private static void PatchWeaponScale_Check(WeaponPos __instance)
			{
				//IL_0083: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_0143: Unknown result type (might be due to invalid IL or missing references)
				//IL_0100: Unknown result type (might be due to invalid IL or missing references)
				if (((Component)__instance).GetComponent<WeaponIdentifier>().duplicate)
				{
					return;
				}
				if (((Object)((Component)__instance).gameObject).name.Contains("Revolver"))
				{
					if (!_originalScale.ContainsKey(((Component)__instance).gameObject))
					{
						_originalScale.Add(((Component)__instance).gameObject, ((Component)__instance).gameObject.transform.localScale);
					}
					((Component)__instance).gameObject.transform.localScale = _originalScale[((Component)__instance).gameObject] * (float)Tweak.GetInstance<ViewmodelTransform>().Subsettings["viewmodel_size_multiplier"].GetValue<int>() / 100f;
					return;
				}
				foreach (GameObject item in ((Component)__instance).gameObject.ChildrenList())
				{
					if (!_originalScale.ContainsKey(item))
					{
						_originalScale.Add(item, item.transform.localScale);
					}
					item.transform.localScale = _originalScale[item] * (float)Tweak.GetInstance<ViewmodelTransform>().Subsettings["viewmodel_size_multiplier"].GetValue<int>() / 100f;
				}
			}

			[HarmonyPatch(typeof(GunControl), "Start")]
			[HarmonyPostfix]
			private static void BobAndTilt()
			{
				UpdateBobAndTilt();
			}
		}

		private Harmony _harmony = new Harmony("waffle.ultrakill.ultratweaker.viewmodel_transform");

		private static Dictionary<GameObject, Vector3> _originalScale = new Dictionary<GameObject, Vector3>();

		public ViewmodelTransform()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			Subsettings = new Dictionary<string, Subsetting>
			{
				{
					"viewmodel_fov",
					new IntSubsetting(this, new Metadata("FOV", "viewmodel_fov", "What is the FOV of the viewmodel?"), new SliderIntSubsettingElement(), 90, 150, 50)
				},
				{
					"viewmodel_size_multiplier",
					new IntSubsetting(this, new Metadata("Size", "viewmodel_size_multiplier", "How big is the viewmodel?"), new SliderIntSubsettingElement("{0}%"), 100, 125, 0)
				},
				{
					"viewmodel_bob",
					new BoolSubsetting(this, new Metadata("Bobbing", "viewmodel_bob", "Does the viewmodel bob when you walk?"), new BoolSubsettingElement(), defaultValue: true)
				},
				{
					"viewmodel_tilt",
					new BoolSubsetting(this, new Metadata("Aim-assist Tilt", "viewmodel_tilt", "Does the viewmodel tilt with aim-assist?"), new BoolSubsettingElement(), defaultValue: true)
				}
			};
		}

		public override void OnTweakEnabled()
		{
			base.OnTweakEnabled();
			_harmony.PatchAll(typeof(ViewmodelPatches));
			if ((Object)(object)MonoSingleton<GunControl>.Instance != (Object)null && (Object)(object)MonoSingleton<FistControl>.Instance != (Object)null)
			{
				UpdateBobAndTilt();
			}
		}

		public override void OnTweakDisabled()
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			base.OnTweakDisabled();
			_harmony.UnpatchSelf();
			if ((Object)(object)MonoSingleton<GunControl>.Instance != (Object)null && (Object)(object)MonoSingleton<FistControl>.Instance != (Object)null)
			{
				((Component)MonoSingleton<NewMovement>.Instance).gameObject.ChildByName("Main Camera").ChildByName("HUD Camera").GetComponent<Camera>()
					.fieldOfView = 90f;
				((Component)MonoSingleton<FistControl>.Instance).transform.localScale = Vector3.one;
				((Behaviour)((Component)MonoSingleton<GunControl>.Instance).GetComponent<WalkingBob>()).enabled = true;
				((Behaviour)((Component)MonoSingleton<GunControl>.Instance).GetComponent<RotateToFaceFrustumTarget>()).enabled = true;
			}
			foreach (GameObject key in _originalScale.Keys)
			{
				key.transform.localScale = _originalScale[key];
			}
			_originalScale.Clear();
		}

		public override void OnSceneLoad(Scene scene, LoadSceneMode mode)
		{
			_originalScale.Clear();
		}

		public void LateUpdate()
		{
			if ((Object)(object)MonoSingleton<NewMovement>.Instance != (Object)null)
			{
				((Component)MonoSingleton<NewMovement>.Instance).gameObject.ChildByName("Main Camera").ChildByName("HUD Camera").GetComponent<Camera>()
					.fieldOfView = Subsettings["viewmodel_fov"].GetValue<int>();
			}
		}

		public override void OnSubsettingUpdate()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			UpdateBobAndTilt();
			if ((Object)(object)MonoSingleton<GunControl>.Instance != (Object)null && (Object)(object)MonoSingleton<FistControl>.Instance != (Object)null)
			{
				if ((Object)(object)MonoSingleton<GunControl>.Instance.currentWeapon != (Object)null && (Object)(object)MonoSingleton<GunControl>.Instance.currentWeapon.GetComponent<WeaponPos>() != (Object)null)
				{
					MonoSingleton<GunControl>.Instance.currentWeapon.GetComponent<WeaponPos>().CheckPosition();
				}
				UpdateBobAndTilt();
				((Component)MonoSingleton<FistControl>.Instance).transform.localScale = Vector3.one;
			}
		}

		public static void UpdateBobAndTilt()
		{
			if ((Object)(object)MonoSingleton<GunControl>.Instance != (Object)null)
			{
				((Behaviour)((Component)MonoSingleton<GunControl>.Instance).GetComponent<WalkingBob>()).enabled = Tweak.GetInstance<ViewmodelTransform>().Subsettings["viewmodel_bob"].GetValue<bool>();
				((Behaviour)((Component)MonoSingleton<GunControl>.Instance).GetComponent<RotateToFaceFrustumTarget>()).enabled = Tweak.GetInstance<ViewmodelTransform>().Subsettings["viewmodel_tilt"].GetValue<bool>();
			}
		}
	}
}
namespace UltraTweaker.Subsettings
{
	public abstract class Subsetting
	{
		public Tweak Parent;

		public Metadata Metadata;

		public SubsettingUIElement Element;

		public Subsetting(Tweak parent, Metadata metadata, SubsettingUIElement element)
		{
			Parent = parent;
			Metadata = metadata;
			Element = element;
			Element.Subsetting = this;
		}

		public T GetValue<T>()
		{
			return ((TypedSubsetting<T>)this).Value;
		}

		public virtual string Serialize()
		{
			return "";
		}

		public abstract void Deserialize(string str);

		public abstract void ResetValue();
	}
	public class TypedSubsetting<T> : Subsetting
	{
		public T Value;

		public T DefaultValue;

		public override void Deserialize(string str)
		{
		}

		public TypedSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element)
			: base(parent, metadata, element)
		{
		}

		public override void ResetValue()
		{
			Value = DefaultValue;
		}
	}
}
namespace UltraTweaker.Subsettings.Impl
{
	public class BoolSubsetting : TypedSubsetting<bool>
	{
		public BoolSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element, bool defaultValue)
			: base(parent, metadata, element)
		{
			DefaultValue = defaultValue;
			Value = defaultValue;
		}

		public override void Deserialize(string str)
		{
			Value = Convert.ToBoolean(str);
		}

		public override string Serialize()
		{
			return Value.ToString();
		}
	}
	public class CommentSubsetting : TypedSubsetting<string>
	{
		public Action Action;

		public string ButtonText;

		public CommentSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element, Action action = null, string buttonText = "")
			: base(parent, metadata, element)
		{
			Action = action;
			ButtonText = buttonText;
		}

		public override string Serialize()
		{
			return "";
		}
	}
	public class FloatSubsetting : TypedSubsetting<float>
	{
		public float MaxValue;

		public float MinValue;

		public FloatSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element, float defaultValue, float maxValue, float minValue)
			: base(parent, metadata, element)
		{
			DefaultValue = defaultValue;
			MaxValue = maxValue;
			MinValue = minValue;
			Value = defaultValue;
		}

		public override void Deserialize(string str)
		{
			Value = float.Parse(str, CultureInfo.GetCultureInfo("en-GB"));
		}

		public override string Serialize()
		{
			return Value.ToString();
		}
	}
	public class IntSubsetting : TypedSubsetting<int>
	{
		public int MaxValue;

		public int MinValue;

		public IntSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element, int defaultValue, int maxValue, int minValue)
			: base(parent, metadata, element)
		{
			DefaultValue = defaultValue;
			MaxValue = maxValue;
			MinValue = minValue;
			Value = defaultValue;
		}

		public override void Deserialize(string str)
		{
			Value = int.Parse(str, CultureInfo.GetCultureInfo("en-GB"));
		}

		public override string Serialize()
		{
			return Value.ToString();
		}
	}
	public class StringSubsetting : TypedSubsetting<string>
	{
		public StringSubsetting(Tweak parent, Metadata metadata, SubsettingUIElement element, string defaultValue)
			: base(parent, metadata, element)
		{
			DefaultValue = defaultValue;
			Value = defaultValue;
		}

		public override void Deserialize(string str)
		{
			Value = str;
		}

		public override string Serialize()
		{
			return Value;
		}
	}
}
namespace UltraTweaker.SettingUI
{
	public class Page
	{
		public readonly string PageName;

		public readonly string OriginMod;

		public GameObject PageObject;

		public Page(string pageName, string originMod)
		{
			PageName = pageName;
			OriginMod = originMod;
		}
	}
	public static class SettingUIHandler
	{
		[DefaultExecutionOrder(-10000000)]
		private class SettingUIDoer : MonoBehaviour
		{
			private void Start()
			{
				CreateUI(((Component)this).gameObject);
			}
		}

		public class SettingUIPatches
		{
			[HarmonyPatch(typeof(OptionsMenuToManager), "Start")]
			[HarmonyPostfix]
			public static void AddMenu(OptionsMenuToManager __instance)
			{
				CreateUI(((Component)__instance).gameObject.ChildByName("OptionsMenu"));
			}

			[HarmonyPatch(typeof(ButtonHighlightParent), "Start")]
			[HarmonyPrefix]
			private static bool ReplaceStart(ButtonHighlightParent __instance)
			{
				__instance.buttons = CollectionExtensions.AddRangeToArray<Image>(__instance.buttons, ((Component)__instance).GetComponentsInChildren<Image>());
				__instance.buttonTexts = __instance.buttons.Select((Image button) => ((Component)button).GetComponentInChildren<TMP_Text>()).ToArray();
				return false;
			}
		}

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

			public static UnityAction <>9__7_1;

			public static UnityAction <>9__7_2;

			internal void <CreateUI>b__7_1()
			{
				ResetAllSettings();
			}

			internal void <CreateUI>b__7_2()
			{
				foreach (Page value in Pages.Values)
				{
					value.PageObject.SetActive(false);
				}
			}
		}

		public static Harmony Harmony = new Harmony("waffle.ultrakill.ultratweaker.setting_ui_handler");

		public static GameObject OriginalSettingPage;

		public static GameObject OriginalResetButton;

		public static GameObject CurrentResetButton;

		public static Dictionary<string, Page> Pages = new Dictionary<string, Page>
		{
			{
				"waffle.ultrakill.ultratweaker.misc",
				new Page("GENERAL", "ULTRATWEAKER")
			},
			{
				"waffle.ultrakill.ultratweaker.hud",
				new Page("HUD", "ULTRATWEAKER")
			},
			{
				"waffle.ultrakill.ultratweaker.fun",
				new Page("FUN", "ULTRATWEAKER")
			},
			{
				"waffle.ultrakill.ultratweaker.mutators",
				new Page("MUTATORS", "ULTRATWEAKER")
			}
		};

		public static Dictionary<string, int> PageModNameToChildIndex = new Dictionary<string, int>();

		public static void Patch()
		{
			Harmony.PatchAll(typeof(SettingUIPatches));
		}

		private static void CreateUI(GameObject optionsMenu)
		{
			//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Expected O, but got Unknown
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			//IL_039d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a8: Expected O, but got Unknown
			//IL_0511: Unknown result type (might be due to invalid IL or missing references)
			//IL_0516: Unknown result type (might be due to invalid IL or missing references)
			//IL_051c: Expected O, but got Unknown
			if ((Object)(object)OriginalSettingPage == (Object)null)
			{
				OriginalSettingPage = AssetHandler.Bundle.LoadAsset<GameObject>("Settings Page.prefab");
			}
			if ((Object)(object)OriginalResetButton == (Object)null)
			{
				OriginalResetButton = AssetHandler.Bundle.LoadAsset<GameObject>("Reset Button.prefab");
			}
			CreateSecondSettingColumn(optionsMenu, out var rightSettingMenu, out var titleText);
			rightSettingMenu.transform.SetAsFirstSibling();
			GameObject gameObject = ((Component)optionsMenu.transform.Find("Panel/Text (7)")).gameObject;
			GameObject gameObject2 = ((Component)optionsMenu.transform.Find("Panel/Controls")).gameObject;
			((UnityEventBase)gameObject2.GetComponent<Button>().onClick).RemoveAllListeners();
			Object.Destroy((Object)(object)rightSettingMenu.GetComponent<ButtonHighlightParent>());
			foreach (GameObject item in rightSettingMenu.ChildrenList())
			{
				Object.Destroy((Object)(object)item);
			}
			titleText.text = "--MOD OPTIONS--";
			titleText.fontSize = 26f;
			int num = 0;
			ButtonHighlightParent component = ((Component)optionsMenu.transform.Find("Panel")).GetComponent<ButtonHighlightParent>();
			ButtonHighlightParent val = component;
			if (val.buttons == null)
			{
				val.buttons = (Image[])(object)new Image[0];
			}
			List<string> list = new List<string>();
			foreach (Page page in Pages.Values)
			{
				page.PageObject = Object.Instantiate<GameObject>(OriginalSettingPage, optionsMenu.transform);
				((Object)page.PageObject).name = page.PageName;
				page.PageObject.AddComponent<HudOpenEffect>();
				if (!list.Contains(page.OriginMod))
				{
					list.Add(page.OriginMod);
					GameObject val2 = Object.Instantiate<GameObject>(gameObject, rightSettingMenu.transform);
					TMP_Text component2 = val2.GetComponent<TMP_Text>();
					component2.text = "-- " + page.OriginMod + " --";
					((Graphic)component2).raycastTarget = false;
					component2.rectTransform.sizeDelta = new Vector2(component2.rectTransform.sizeDelta.x * 2f, component2.rectTransform.sizeDelta.y);
				}
				GameObject val3 = Object.Instantiate<GameObject>(gameObject2, rightSettingMenu.transform);
				((Object)val3).name = page.OriginMod + ": " + page.PageName;
				((UnityEvent)val3.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
				{
					foreach (GameObject item2 in AllPages(optionsMenu))
					{
						item2.SetActive(false);
					}
					page.PageObject.SetActive(true);
				});
				((TMP_Text)val3.ChildByName("Text").GetComponent<TextMeshProUGUI>()).text = page.PageName;
				component.buttons = CollectionExtensions.AddToArray<Image>(component.buttons, val3.GetComponent<Image>());
				page.PageObject.SetActive(false);
				if (num == 0)
				{
					CurrentResetButton = Object.Instantiate<GameObject>(OriginalResetButton, ((Component)page.PageObject.GetComponentInChildren<LayoutGroup>(true)).transform);
					ButtonClickedEvent onClick = CurrentResetButton.GetComponent<Button>().onClick;
					object obj = <>c.<>9__7_1;
					if (obj == null)
					{
						UnityAction val4 = delegate
						{
							ResetAllSettings();
						};
						<>c.<>9__7_1 = val4;
						obj = (object)val4;
					}
					((UnityEvent)onClick).AddListener((UnityAction)obj);
				}
				num++;
			}
			foreach (Tweak value in UltraTweaker.AllTweaks.Values)
			{
				TweakMetadata tweakMetadata = Attribute.GetCustomAttribute(((object)value).GetType(), typeof(TweakMetadata)) as TweakMetadata;
				value.Element.Create(((Component)Pages[tweakMetadata.PageId].PageObject.GetComponentInChildren<VerticalLayoutGroup>()).transform).transform.SetSiblingIndex(tweakMetadata.InsertAt);
				foreach (Subsetting value2 in value.Subsettings.Values)
				{
					value2.Element.Create(((Component)value.Element.CurrentSetting.GetComponentInChildren<LayoutGroup>(true)).transform);
				}
			}
			Button[] componentsInChildren = ((Component)optionsMenu.transform.Find("Panel")).GetComponentsInChildren<Button>();
			foreach (Button val5 in componentsInChildren)
			{
				ButtonClickedEvent onClick2 = val5.onClick;
				object obj2 = <>c.<>9__7_2;
				if (obj2 == null)
				{
					UnityAction val6 = delegate
					{
						foreach (Page value3 in Pages.Values)
						{
							value3.PageObject.SetActive(false);
						}
					};
					<>c.<>9__7_2 = val6;
					obj2 = (object)val6;
				}
				((UnityEvent)onClick2).AddListener((UnityAction)obj2);
			}
			CurrentResetButton.transform.SetAsFirstSibling();
		}

		private static void CreateSecondSettingColumn(GameObject optionMenu, out GameObject rightSettingMenu, out TMP_Text titleText)
		{
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			GameObject gameObject = ((Component)optionMenu.GetComponentInChildren<ButtonHighlightParent>(true)).gameObject;
			rightSettingMenu = CopyToOtherSide(gameObject);
			titleText = CopyToOtherSide(optionMenu.ChildByName("Text")).GetComponent<TMP_Text>();
			foreach (GameObject item in AllPages(optionMenu))
			{
				if (!((Object)(object)item.GetComponent<TextMeshProUGUI>() != (Object)null) && !((Object)(object)item.GetComponent<ButtonHighlightParent>() != (Object)null) && !((Object)(object)item.GetComponent<TooltipManager>() != (Object)null))
				{
					Debug.Log((object)$"Offsetting {((Object)item).name} by {-(int)((float)Screen.width * 0.017578125f)}");
					Transform transform = item.transform;
					transform.position -= new Vector3((float)(int)((float)Screen.width * 0.017578125f), 0f);
				}
			}
		}

		private static IEnumerable<GameObject> AllPages(GameObject optionMenu)
		{
			foreach (GameObject optionPage in optionMenu.ChildrenList())
			{
				if (!((Object)(object)optionPage.GetComponent<TextMeshProUGUI>() != (Object)null) && !((Object)optionPage).name.Contains("Panel") && !((Object)(object)optionPage.GetComponent<TooltipManager>() != (Object)null))
				{
					yield return optionPage;
				}
			}
		}

		private static GameObject CopyToOtherSide(GameObject original)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: 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)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = original.transform;
			RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			GameObject val2 = Object.Instantiate<GameObject>(original, original.transform.parent);
			Transform transform2 = val2.transform;
			RectTransform val3 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null);
			val3.pivot = new Vector2(1f - val.pivot.x, val.pivot.y);
			((Component)val3).transform.position = new Vector3((float)Screen.width - ((Transform)val).position.x, ((Transform)val).position.y, ((Transform)val).position.z);
			return val2;
		}

		public static void ResetAllSettings()
		{
			foreach (Tweak value in UltraTweaker.AllTweaks.Values)
			{
				value.IsEnabled = false;
				value.Element.ResetValue();
				foreach (Subsetting value2 in value.Subsettings.Values)
				{
					value2.ResetValue();
					value2.Element.ResetValue();
				}
			}
		}
	}
}
namespace UltraTweaker.SettingUI.UIElements
{
	public class ShowBoxOnHover : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler
	{
		public GameObject Box;

		public void Start()
		{
			if ((Object)(object)Box == (Object)null)
			{
				Box = ((Component)((Component)this).transform.parent).gameObject.ChildByName("Box");
			}
		}

		public void OnPointerEnter(PointerEventData eventData)
		{
			Box.SetActive(true);
		}

		public void OnPointerExit(PointerEventData eventData)
		{
			Box.SetActive(false);
		}
	}
	public abstract class SubsettingUIElement
	{
		public Subsetting Subsetting;

		public abstract GameObject Create(Transform t);

		public abstract void SetControlsActive(bool active);

		public abstract void ResetValue();
	}
	public class TweakUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public Tweak Tweak;

		public Toggle Toggle;

		public virtual string Name => "Tweak Setting.prefab";

		public TweakUIElement(Tweak tweak)
		{
			Tweak = tweak;
		}

		public GameObject Create(Transform t)
		{
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>(Name);
			}
			Metadata metadata = Attribute.GetCustomAttribute(((object)Tweak).GetType(), typeof(Metadata)) as Metadata;
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			Toggle = CurrentSetting.ChildByName("Toggle").GetComponent<Toggle>();
			((UnityEvent<bool>)(object)Toggle.onValueChanged).AddListener((UnityAction<bool>)delegate(bool state)
			{
				Tweak.IsEnabled = state;
			});
			ResetValue();
			float num = Tweak.Subsettings.Count * 30;
			num += (float)(Tweak.Subsettings.Count - 1) * ((HorizontalOrVerticalLayoutGroup)CurrentSetting.ChildByName("Subsetting Holder").GetComponent<VerticalLayoutGroup>()).spacing;
			RectTransform component = CurrentSetting.GetComponent<RectTransform>();
			Rect rect = CurrentSetting.ChildByName("Background").GetComponent<RectTransform>().rect;
			component.SetSizeWithCurrentAnchors((Axis)1, ((Rect)(ref rect)).height + num);
			CurrentSetting.ChildByName("Text").GetComponent<TMP_Text>().text = metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			if ((Object)(object)((TweakMetadata)metadata).Icon != (Object)null)
			{
				CurrentSetting.ChildByName("Icon").GetComponent<Image>().sprite = ((TweakMetadata)metadata).Icon;
			}
			else
			{
				CurrentSetting.ChildByName("Icon").SetActive(false);
			}
			if (!((TweakMetadata)metadata).AllowCG)
			{
				CurrentSetting.ChildByName("Disabled CG").SetActive(true);
				CurrentSetting.ChildByName("Disabled CG").AddComponent<ShowBoxOnHover>().Box = CurrentSetting.ChildByName("Disabled CG").ChildByName("Box");
			}
			return CurrentSetting;
		}

		public void SetControlsActive(bool active)
		{
			((Selectable)Toggle).interactable = active;
		}

		public void ResetValue()
		{
			Toggle.isOn = Tweak.IsEnabled;
		}
	}
}
namespace UltraTweaker.SettingUI.UIElements.Impl
{
	public class BoolSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public Toggle Toggle;

		public override GameObject Create(Transform t)
		{
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Toggle Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			Toggle = CurrentSetting.ChildByName("Toggle").GetComponent<Toggle>();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = Subsetting.Metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			ResetValue();
			((UnityEvent<bool>)(object)Toggle.onValueChanged).AddListener((UnityAction<bool>)delegate(bool state)
			{
				((BoolSubsetting)Subsetting).Value = state;
				if (Subsetting.Parent.IsEnabled)
				{
					Subsetting.Parent.OnSubsettingUpdate();
				}
			});
			return CurrentSetting;
		}

		public override void SetControlsActive(bool active)
		{
			((Selectable)Toggle).interactable = active;
		}

		public override void ResetValue()
		{
			Toggle.isOn = ((BoolSubsetting)Subsetting).Value;
		}
	}
	public class CommentSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public override GameObject Create(Transform t)
		{
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Expected O, but got Unknown
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Comment Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Comment").GetComponent<Text>().text = Subsetting.Metadata.Description;
			GameObject val = CurrentSetting.ChildByName("Button");
			val.SetActive(false);
			CommentSubsetting cs = Subsetting as CommentSubsetting;
			if (cs != null && cs.Action != null)
			{
				val.SetActive(true);
				((UnityEvent)val.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
				{
					cs.Action();
				});
				val.ChildByName("Text").GetComponent<Text>().text = cs.ButtonText;
			}
			return CurrentSetting;
		}

		public override void SetControlsActive(bool active)
		{
		}

		public override void ResetValue()
		{
		}
	}
	public class DropdownIntSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public List<string> Options;

		public Dropdown Dropdown;

		public DropdownIntSubsettingElement(List<string> options)
		{
			Options = options;
		}

		public override GameObject Create(Transform t)
		{
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Dropdown Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = Subsetting.Metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			Dropdown = CurrentSetting.ChildByName("Dropdown").GetComponent<Dropdown>();
			Dropdown.ClearOptions();
			Dropdown.AddOptions(Options);
			ResetValue();
			((UnityEvent<int>)(object)Dropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int num)
			{
				((IntSubsetting)Subsetting).Value = num;
				if (Subsetting.Parent.IsEnabled)
				{
					Subsetting.Parent.OnSubsettingUpdate();
				}
			});
			return CurrentSetting;
		}

		public override void SetControlsActive(bool active)
		{
			((Selectable)Dropdown).interactable = active;
		}

		public override void ResetValue()
		{
			Dropdown.value = ((IntSubsetting)Subsetting).Value;
		}
	}
	public class DropdownStringSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public List<string> Options;

		public Dropdown Dropdown;

		public DropdownStringSubsettingElement(List<string> options)
		{
			Options = options;
		}

		public override GameObject Create(Transform t)
		{
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Dropdown Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = Subsetting.Metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			Dropdown = CurrentSetting.ChildByName("Dropdown").GetComponent<Dropdown>();
			Dropdown.ClearOptions();
			Dropdown.AddOptions(Options);
			Dropdown.value = 0;
			ResetValue();
			((UnityEvent<int>)(object)Dropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int num)
			{
				((StringSubsetting)Subsetting).Value = Options[num];
				if (Subsetting.Parent.IsEnabled)
				{
					Subsetting.Parent.OnSubsettingUpdate();
				}
			});
			return CurrentSetting;
		}

		public override void SetControlsActive(bool active)
		{
			((Selectable)Dropdown).interactable = active;
		}

		public override void ResetValue()
		{
			if (Options.Contains(((StringSubsetting)Subsetting).Value))
			{
				Dropdown.value = Options.IndexOf(((StringSubsetting)Subsetting).Value);
			}
		}
	}
	public class SliderFloatSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public string DisplayAs = "{0}";

		public InputField InputField;

		public Slider Slider;

		public int RoundDigits;

		public SliderFloatSubsettingElement(string displayAs = "{0}", int roundDigits = 1)
		{
			DisplayAs = displayAs;
			RoundDigits = roundDigits;
		}

		public override GameObject Create(Transform t)
		{
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Slider Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = Subsetting.Metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			InputField = CurrentSetting.ChildByName("InputField").GetComponent<InputField>();
			Slider = CurrentSetting.ChildByName("Slider").GetComponent<Slider>();
			Slider.maxValue = ((FloatSubsetting)Subsetting).MaxValue;
			Slider.minValue = ((FloatSubsetting)Subsetting).MinValue;
			Slider.wholeNumbers = false;
			((UnityEvent<string>)(object)InputField.onEndEdit).AddListener((UnityAction<string>)delegate(string str)
			{
				str = RemoveNonNumeric(str);
				((FloatSubsetting)Subsetting).Value = float.Parse(str);
				Slider.value = (float)Math.Round(float.Parse(str), RoundDigits);
				InputField.text = string.Format(DisplayAs, (float)Math.Round(float.Parse(str), RoundDigits));
			});
			ResetValue();
			((UnityEvent<float>)(object)Slider.onValueChanged).AddListener((UnityAction<float>)delegate(float num)
			{
				if (((FloatSubsetting)Subsetting).Value <= Slider.maxValue || ((Selectable)Slider).isPointerDown)
				{
					((FloatSubsetting)Subsetting).Value = (float)Math.Round(num, RoundDigits);
					InputField.text = string.Format(DisplayAs, (float)Math.Round(num, RoundDigits));
					if (Subsetting.Parent.IsEnabled)
					{
						Subsetting.Parent.OnSubsettingUpdate();
					}
				}
			});
			return CurrentSetting;
			static string RemoveNonNumeric(string s)
			{
				string text = "";
				if (s.StartsWith("-"))
				{
					text += "-";
				}
				return string.Concat(text, string.Concat(s?.Where((char c) => char.IsNumber(c) || c == '.') ?? ""));
			}
		}

		public override void SetControlsActive(bool active)
		{
			((Selectable)Slider).interactable = active;
			((Selectable)InputField).interactable = active;
		}

		public override void ResetValue()
		{
			Slider.value = ((FloatSubsetting)Subsetting).Value;
			InputField.text = string.Format(DisplayAs, ((FloatSubsetting)Subsetting).Value);
		}
	}
	public class SliderIntSubsettingElement : SubsettingUIElement
	{
		public static GameObject BaseSetting;

		public GameObject CurrentSetting;

		public string DisplayAs = "{0}";

		public InputField InputField;

		public Slider Slider;

		public SliderIntSubsettingElement(string displayAs = "{0}")
		{
			DisplayAs = displayAs;
		}

		public override GameObject Create(Transform t)
		{
			if ((Object)(object)BaseSetting == (Object)null)
			{
				BaseSetting = AssetHandler.Bundle.LoadAsset<GameObject>("Slider Subsetting.prefab");
			}
			CurrentSetting = Object.Instantiate<GameObject>(BaseSetting, t);
			CurrentSetting.ChildByName("Text").GetComponent<Text>().text = Subsetting.Metadata.Name.ToUpper();
			CurrentSetting.ChildByName("Box").ChildByName("Description").GetComponent<Text>()
				.text = Subsetting.Metadata.Description;
			CurrentSetting.ChildByName("Text").AddComponent<ShowBoxOnHover>();
			InputField = CurrentSetting.ChildByName("InputField").GetComponent<InputField>();
			Slider = CurrentSetting.ChildByName("Slider").GetComponent<Slider>();
			Slider.maxValue = ((IntSubsetting)Subsetting).MaxValue;
			Slider.minValue = ((IntSubsetting)Subsetting).MinValue;
			((UnityEvent<string>)(object)InputField.onEndEdit).AddListener((UnityAction<string>)delegate(string str)
			{
				str = RemoveNonNumeric(str);
				((IntSubsetting)Subsetting).Value = int.Parse(str);
				Slider.value = int.Parse(str);
				InputField.text = string.Format(DisplayAs, int.Parse(str));
				if (Subsetting.Parent.IsEnabled)
				{
					Subsetting.Parent.OnSubsettingUpdate();
				}
			});
			ResetValue();
			((UnityEvent<float>)(object)Slider.onValueChanged).AddListener((UnityAction<float>)delegate(float num)
			{
				if ((float)((IntSubsetting)Subsetting).Value <= Slider.maxValue || ((Selectable)Slider).isPointerDown)
				{
					((IntSubsetting)Subsetting).Value = (int)num;
					InputField.text = string.Format(DisplayAs, (int)num);
					if (Subsetting.Parent.IsEnabled)
					{
						Subsetting.Parent.OnSubsettingUpdate();
					}
				}
			});
			return CurrentSetting;
			static string RemoveNonNumeric(string s)
			{
				string text = "";
				if (s.StartsWith("-"))
				{
					text += "-";
				}
				return string.Concat(text, string.Concat(s?.Where((char c) => char.IsNumber(c)) ?? ""));
			}
		}

		public override void SetControlsActive(bool active)
		{
			((Selectable)Slider).interactable = active;
			((Selectable)InputField).interactable = active;
		}

		public override void ResetValue()
		{
			Slider.value = ((IntSubsetting)Subsetting).Value;
			InputField.text = string.Format(DisplayAs, ((IntSubsetting)Subsetting).Value);
		}
	}
}
namespace UltraTweaker.Handlers
{
	public static class AssetHandler
	{
		public static readonly string AssetsPath = Path.Combine(PathUtils.ModPath(), "Assets");

		public static readonly string BundlePath = Path.Combine(AssetsPath, "ultratweaker_assets.bundle");

		private static Dictionary<string, Object> _cachedAssets = new Dictionary<string, Object>();

		public static AssetBundle Bundle { get; private set; }

		internal static void LoadBundle()
		{
			Bundle = AssetBundle.LoadFromFile(BundlePath);
		}

		public static T GetCachedAsset<T>(string Name) where T : Object
		{
			if (!_cachedAssets.ContainsKey(Name))
			{
				CacheAsset<T>(Name, Bundle);
			}
			Object obj = _cachedAssets[Name];
			return (T)(object)((obj is T) ? obj : null);
		}

		public static void CacheAsset<T>(string Name, AssetBundle bundle = null) where T : Object
		{
			if ((Object)(object)bundle == (Object)null)
			{
				bundle = Bundle;
			}
			_cachedAssets.Add(Name, (Object)(object)bundle.LoadAsset<T>(Name));
		}
	}
	internal static class MutatorHandler
	{
		public class MutatorPatches
		{
			[HarmonyPatch(typeof(LeaderboardController), "SubmitCyberGrindScore")]
			[HarmonyPatch(typeof(LeaderboardController), "SubmitLevelScore")]
			[HarmonyPrefix]
			public static bool DisableCG()
			{
				foreach (Tweak value in UltraTweaker.AllTweaks.Values)