Decompiled source of ScanRecolorPlus v1.0.0

ScanRecolorRework.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ScanRecolorRework")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ScanRecolorRework")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("46114aec-931f-4466-b3f9-9e803b580843")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace hoppinhauler.ScanRecolorRework;

[HarmonyPatch]
internal static class HUDManagerPatch
{
	private const float ScanDuration = 1.3f;

	private static MeshRenderer _scanRenderer;

	private static Volume _scanVolume;

	private static Vignette _scanVignette;

	private static Bloom _scanBloom;

	private static Texture2D _baseScanLinesTextureReadable;

	private static Color? _currentRandomColor;

	private static float _gradientT;

	private static FieldInfo _fiPlayerPingingScan;

	private static MethodInfo _miCanPlayerScan;

	private static bool _applyQueued;

	private static bool HasScanMaterial
	{
		get
		{
			MeshRenderer scanRenderer = ScanRenderer;
			return (Object)(object)scanRenderer != (Object)null && (Object)(object)((Renderer)scanRenderer).material != (Object)null;
		}
	}

	private static MeshRenderer ScanRenderer
	{
		get
		{
			if ((Object)(object)_scanRenderer != (Object)null && (Object)(object)((Renderer)_scanRenderer).material != (Object)null)
			{
				return _scanRenderer;
			}
			HUDManager instance = HUDManager.Instance;
			if ((Object)(object)instance == (Object)null || (Object)(object)instance.scanEffectAnimator == (Object)null)
			{
				return null;
			}
			MeshRenderer scanRenderer = default(MeshRenderer);
			if (!((Component)instance.scanEffectAnimator).TryGetComponent<MeshRenderer>(ref scanRenderer))
			{
				return null;
			}
			_scanRenderer = scanRenderer;
			return _scanRenderer;
		}
	}

	private static Volume ScanVolume
	{
		get
		{
			if ((Object)(object)_scanVolume != (Object)null)
			{
				return _scanVolume;
			}
			try
			{
				Volume[] array = Object.FindObjectsByType<Volume>((FindObjectsSortMode)0);
				if (array != null)
				{
					_scanVolume = ((IEnumerable<Volume>)array).FirstOrDefault((Func<Volume, bool>)delegate(Volume v)
					{
						if ((Object)(object)v == (Object)null)
						{
							return false;
						}
						VolumeProfile profile = v.profile;
						if ((Object)(object)profile == (Object)null)
						{
							return false;
						}
						string name = ((Object)profile).name;
						return !string.IsNullOrEmpty(name) && name.StartsWith("ScanVolume", StringComparison.OrdinalIgnoreCase);
					});
				}
			}
			catch
			{
			}
			return _scanVolume;
		}
	}

	private static Vignette ScanVignette
	{
		get
		{
			if ((Object)(object)_scanVignette != (Object)null)
			{
				return _scanVignette;
			}
			Volume scanVolume = ScanVolume;
			if ((Object)(object)scanVolume == (Object)null || (Object)(object)scanVolume.profile == (Object)null || scanVolume.profile.components == null)
			{
				return null;
			}
			VolumeComponent? obj = ((IEnumerable<VolumeComponent>)scanVolume.profile.components).FirstOrDefault((Func<VolumeComponent, bool>)delegate(VolumeComponent c)
			{
				if ((Object)(object)c == (Object)null)
				{
					return false;
				}
				string name = ((Object)c).name;
				return !string.IsNullOrEmpty(name) && name.StartsWith("Vignette", StringComparison.OrdinalIgnoreCase);
			});
			_scanVignette = (Vignette)(object)((obj is Vignette) ? obj : null);
			return _scanVignette;
		}
	}

	private static Bloom ScanBloom
	{
		get
		{
			if ((Object)(object)_scanBloom != (Object)null)
			{
				return _scanBloom;
			}
			Volume scanVolume = ScanVolume;
			if ((Object)(object)scanVolume == (Object)null || (Object)(object)scanVolume.profile == (Object)null || scanVolume.profile.components == null)
			{
				return null;
			}
			VolumeComponent? obj = ((IEnumerable<VolumeComponent>)scanVolume.profile.components).FirstOrDefault((Func<VolumeComponent, bool>)delegate(VolumeComponent c)
			{
				if ((Object)(object)c == (Object)null)
				{
					return false;
				}
				string name = ((Object)c).name;
				return !string.IsNullOrEmpty(name) && name.StartsWith("Bloom", StringComparison.OrdinalIgnoreCase);
			});
			_scanBloom = (Bloom)(object)((obj is Bloom) ? obj : null);
			return _scanBloom;
		}
	}

	internal static void RequestApply()
	{
		_applyQueued = true;
		ApplyAllIfPossible();
	}

	private static bool TryGetPlayerPingingScan(out float value)
	{
		value = -1f;
		HUDManager instance = HUDManager.Instance;
		if ((Object)(object)instance == (Object)null)
		{
			return false;
		}
		try
		{
			if (_fiPlayerPingingScan == null)
			{
				_fiPlayerPingingScan = typeof(HUDManager).GetField("playerPingingScan", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			}
			if (_fiPlayerPingingScan == null)
			{
				return false;
			}
			object value2 = _fiPlayerPingingScan.GetValue(instance);
			if (value2 is float)
			{
				float num = (float)value2;
				if (true)
				{
					value = num;
					return true;
				}
			}
		}
		catch
		{
		}
		return false;
	}

	private static bool IsScanActive()
	{
		float value;
		return TryGetPlayerPingingScan(out value) && value > -1f;
	}

	private static float ScanProgress01()
	{
		if (!TryGetPlayerPingingScan(out var value))
		{
			return 0f;
		}
		float num = (value + 1f) / 1.3f;
		if (num < 0f)
		{
			num = 0f;
		}
		if (num > 1f)
		{
			num = 1f;
		}
		return num;
	}

	private static bool CanPlayerScanSafe()
	{
		HUDManager instance = HUDManager.Instance;
		if ((Object)(object)instance == (Object)null)
		{
			return false;
		}
		try
		{
			if (_miCanPlayerScan == null)
			{
				_miCanPlayerScan = AccessTools.Method(typeof(HUDManager), "CanPlayerScan", (Type[])null, (Type[])null);
			}
			if (_miCanPlayerScan == null)
			{
				return false;
			}
			object obj = _miCanPlayerScan.Invoke(instance, null);
			bool flag = default(bool);
			int num;
			if (obj is bool)
			{
				flag = (bool)obj;
				num = 1;
			}
			else
			{
				num = 0;
			}
			return (byte)((uint)num & (flag ? 1u : 0u)) != 0;
		}
		catch
		{
			return false;
		}
	}

	private static Color GetEffectiveScanColor(bool includeAnimatedAlpha)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: 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_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: 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_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Unknown result type (might be due to invalid IL or missing references)
		//IL_0239: Unknown result type (might be due to invalid IL or missing references)
		//IL_023a: Unknown result type (might be due to invalid IL or missing references)
		//IL_023b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: 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_00c3: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_023f: Unknown result type (might be due to invalid IL or missing references)
		Color baseScanColor = ModConfig.GetBaseScanColor();
		Color c = baseScanColor;
		if (ModConfig.RandomModePerScan.Value == RandomMode.Gradient)
		{
			Color val = ResolveColorOrFallback(ModConfig.GradientA.Value, baseScanColor);
			Color val2 = ResolveColorOrFallback(ModConfig.GradientB.Value, baseScanColor);
			float value = ModConfig.GradientSpeed.Value;
			if (value <= 0f)
			{
				c = val;
			}
			else
			{
				_gradientT += Time.deltaTime * value;
				float gradientT = _gradientT;
				float num = gradientT - (float)Math.Floor(gradientT);
				if (ModConfig.GradientPingPong.Value)
				{
					float num2 = ((num < 0.5f) ? (num * 2f) : (2f - num * 2f));
					c = Color.Lerp(val, val2, num2);
				}
				else
				{
					c = Color.Lerp(val, val2, num);
				}
			}
			c.a = baseScanColor.a;
		}
		else if (ModConfig.RandomModePerScan.Value != 0)
		{
			c = ((!_currentRandomColor.HasValue) ? baseScanColor : _currentRandomColor.Value);
		}
		c.a = baseScanColor.a;
		if (includeAnimatedAlpha && IsScanActive())
		{
			float num3 = baseScanColor.a;
			if (ModConfig.FadeEnabled.Value)
			{
				float x = ScanProgress01();
				num3 *= ModConfig.ApplyCurve(x, ModConfig.FadeCurveMode.Value);
			}
			if (ModConfig.PulseEnabled.Value)
			{
				float value2 = ModConfig.PulseStrength.Value;
				float value3 = ModConfig.PulseSpeed.Value;
				if (value2 > 0f && value3 > 0f)
				{
					float num4 = (float)(Math.Sin((double)(Time.time * value3) * Math.PI * 2.0) * 0.5 + 0.5);
					float num5 = 1f - value2 + value2 * num4;
					num3 *= num5;
				}
			}
			c.a = ModConfig.Clamp01(num3);
		}
		return ModConfig.ApplyMaxBrightness(c, ModConfig.Clamp01(ModConfig.MaxBrightness.Value));
	}

	private static Color ResolveColorOrFallback(string s, Color fallback)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		if (ModConfig.TryParseColorString(s, out var color))
		{
			return color;
		}
		return fallback;
	}

	private static Color BuildRandomFull()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		Color result = default(Color);
		((Color)(ref result))..ctor(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
		result.a = ModConfig.ResolveRandomAlpha();
		return result;
	}

	private static Color BuildRandomHueOnly()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: 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_00b8: 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)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		Color baseScanColor = ModConfig.GetBaseScanColor();
		float num = default(float);
		float num2 = default(float);
		float num3 = default(float);
		Color.RGBToHSV(baseScanColor, ref num, ref num2, ref num3);
		float num4 = ModConfig.RandomHueJitter.Value / 360f;
		float num5 = Random.Range(0f - num4, num4);
		float num6 = ModConfig.Clamp01(ModConfig.RandomSVJitter.Value);
		float num7 = Random.Range(0f - num6, num6);
		float num8 = Random.Range(0f - num6, num6);
		float num9;
		for (num9 = num + num5; num9 < 0f; num9 += 1f)
		{
		}
		while (num9 > 1f)
		{
			num9 -= 1f;
		}
		float num10 = ModConfig.Clamp01(num2 + num7);
		float num11 = ModConfig.Clamp01(num3 + num8);
		Color result = Color.HSVToRGB(num9, num10, num11);
		result.a = ModConfig.ResolveRandomAlpha();
		return result;
	}

	private static Color BuildRandomFromPalette()
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		List<Color> list = ModConfig.ParsePaletteOrFallback();
		int index = Random.Range(0, list.Count);
		Color result = list[index];
		result.a = ModConfig.ResolveRandomAlpha();
		return result;
	}

	private static void ApplyAllIfPossible()
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		if (ModConfig.Enabled.Value)
		{
			if ((Object)(object)ScanRenderer == (Object)null)
			{
				_applyQueued = true;
				return;
			}
			_applyQueued = false;
			Color effectiveScanColor = GetEffectiveScanColor(includeAnimatedAlpha: true);
			ApplyScanOverlayColor(effectiveScanColor);
			ApplyVignette(effectiveScanColor);
			ApplyBloom(effectiveScanColor);
			ApplyScanLines(effectiveScanColor);
		}
	}

	private static void ApplyScanOverlayColor(Color col)
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		if (!HasScanMaterial)
		{
			return;
		}
		try
		{
			((Renderer)ScanRenderer).material.color = col;
		}
		catch
		{
		}
	}

	private static void ApplyVignette(Color scanColor)
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: 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)
		if (!ModConfig.VignetteEnabled.Value)
		{
			return;
		}
		Vignette scanVignette = ScanVignette;
		if ((Object)(object)scanVignette == (Object)null)
		{
			return;
		}
		try
		{
			((VolumeParameter<float>)(object)scanVignette.intensity).value = ModConfig.VignetteIntensity.Value;
			Color value;
			if (ModConfig.VignetteUseScanColor.Value)
			{
				value = scanColor;
				value.a = 1f;
			}
			else
			{
				value = ResolveColorOrFallback(ModConfig.VignetteColor.Value, scanColor);
				value.a = ModConfig.Clamp01(ModConfig.VignetteAlpha.Value);
			}
			((VolumeParameter<Color>)(object)scanVignette.color).value = value;
		}
		catch
		{
		}
	}

	private static void ApplyBloom(Color scanColor)
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		if (!ModConfig.BloomEnabled.Value)
		{
			return;
		}
		Bloom scanBloom = ScanBloom;
		if ((Object)(object)scanBloom == (Object)null)
		{
			return;
		}
		try
		{
			Color val = (ModConfig.BloomUseScanColor.Value ? scanColor : ResolveColorOrFallback(ModConfig.BloomColor.Value, scanColor));
			val.a = ModConfig.Clamp01(ModConfig.BloomAlpha.Value);
			float value = ModConfig.BloomTintStrength.Value;
			val.r = ModConfig.Clamp01(val.r * value);
			val.g = ModConfig.Clamp01(val.g * value);
			val.b = ModConfig.Clamp01(val.b * value);
			((VolumeParameter<Color>)(object)scanBloom.tint).Override(val);
		}
		catch
		{
		}
	}

	private static void ApplyScanLines(Color scanColor)
	{
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Expected O, but got Unknown
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		if (!ModConfig.ScanLinesEnabled.Value)
		{
			return;
		}
		Bloom scanBloom = ScanBloom;
		if ((Object)(object)scanBloom == (Object)null || (VolumeParameter<Texture>)(object)scanBloom.dirtTexture == (Texture)null)
		{
			return;
		}
		if (!ModConfig.RecolorScanLines.Value)
		{
			RevertScanLinesTexture();
			return;
		}
		try
		{
			EnsureBaseScanLinesReadable();
			if (!((Object)(object)_baseScanLinesTextureReadable == (Object)null) && ((Texture)_baseScanLinesTextureReadable).isReadable)
			{
				float num = ModConfig.Clamp01(ModConfig.ScanLinesRecolorStrength.Value);
				if (num <= 0.001f)
				{
					RevertScanLinesTexture();
					return;
				}
				Texture2D val = new Texture2D(((Texture)_baseScanLinesTextureReadable).width, ((Texture)_baseScanLinesTextureReadable).height, _baseScanLinesTextureReadable.format, false);
				val.SetPixels(_baseScanLinesTextureReadable.GetPixels());
				val.Apply(false, false);
				TextureUtils.RecolorTextureInPlace(val, scanColor, num, ModConfig.Clamp01(ModConfig.ScanLinesMinLuma.Value), ModConfig.Clamp01(ModConfig.ScanLinesMinAlpha.Value));
				val.Apply(false, false);
				((VolumeParameter<Texture>)(object)scanBloom.dirtTexture).Override((Texture)(object)Object.Instantiate<Texture2D>(val));
			}
		}
		catch
		{
		}
	}

	private static void EnsureBaseScanLinesReadable()
	{
		if ((Object)(object)_baseScanLinesTextureReadable != (Object)null)
		{
			return;
		}
		Bloom scanBloom = ScanBloom;
		if ((Object)(object)scanBloom == (Object)null || (VolumeParameter<Texture>)(object)scanBloom.dirtTexture == (Texture)null)
		{
			return;
		}
		try
		{
			Texture value = ((VolumeParameter<Texture>)(object)scanBloom.dirtTexture).value;
			if (!((Object)(object)value == (Object)null))
			{
				Texture2D val = (Texture2D)(object)((value is Texture2D) ? value : null);
				if ((Object)(object)val != (Object)null && ((Texture)val).isReadable)
				{
					_baseScanLinesTextureReadable = val;
				}
				else
				{
					_baseScanLinesTextureReadable = TextureUtils.MakeReadableTexture(value);
				}
			}
		}
		catch
		{
		}
	}

	private static void RevertScanLinesTexture()
	{
		try
		{
			Bloom scanBloom = ScanBloom;
			if (!((Object)(object)scanBloom == (Object)null) && !((VolumeParameter<Texture>)(object)scanBloom.dirtTexture == (Texture)null) && (Object)(object)_baseScanLinesTextureReadable != (Object)null)
			{
				((VolumeParameter<Texture>)(object)scanBloom.dirtTexture).Override((Texture)(object)_baseScanLinesTextureReadable);
			}
		}
		catch
		{
		}
	}

	[HarmonyPatch(typeof(HUDManager), "Start")]
	[HarmonyPostfix]
	private static void HUDStartPostfix()
	{
		_scanRenderer = null;
		_scanVolume = null;
		_scanVignette = null;
		_scanBloom = null;
		_fiPlayerPingingScan = null;
		_miCanPlayerScan = null;
		_currentRandomColor = null;
		_gradientT = 0f;
		_applyQueued = true;
		ApplyAllIfPossible();
	}

	[HarmonyPatch(typeof(HUDManager), "Update")]
	[HarmonyPostfix]
	private static void HUDUpdatePostfix()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: 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_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		if (ModConfig.Enabled.Value)
		{
			if (_applyQueued && Time.frameCount % 10 == 0)
			{
				ApplyAllIfPossible();
			}
			if (IsScanActive())
			{
				Color effectiveScanColor = GetEffectiveScanColor(includeAnimatedAlpha: true);
				ApplyScanOverlayColor(effectiveScanColor);
				ApplyVignette(effectiveScanColor);
				ApplyBloom(effectiveScanColor);
			}
		}
	}

	[HarmonyPatch(typeof(HUDManager), "Awake")]
	[HarmonyPostfix]
	private static void HUDAwakePostfix()
	{
		ResetForNewHudInstance();
	}

	[HarmonyPatch(typeof(HUDManager), "OnEnable")]
	[HarmonyPostfix]
	private static void HUDOnEnablePostfix()
	{
		ResetForNewHudInstance();
	}

	private static void ResetForNewHudInstance()
	{
		_scanRenderer = null;
		_scanVolume = null;
		_scanVignette = null;
		_scanBloom = null;
		_fiPlayerPingingScan = null;
		_miCanPlayerScan = null;
		_currentRandomColor = null;
		_gradientT = 0f;
		_applyQueued = true;
		ApplyAllIfPossible();
	}

	[HarmonyPatch(typeof(HUDManager), "PingScan_performed")]
	[HarmonyPrefix]
	private static void PingScanPerformedPrefix(object __0)
	{
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		if (ModConfig.Enabled.Value && CanPlayerScanSafe())
		{
			switch (ModConfig.RandomModePerScan.Value)
			{
			case RandomMode.Off:
				_currentRandomColor = null;
				break;
			case RandomMode.Full:
				_currentRandomColor = BuildRandomFull();
				break;
			case RandomMode.HueOnly:
				_currentRandomColor = BuildRandomHueOnly();
				break;
			case RandomMode.Palette:
				_currentRandomColor = BuildRandomFromPalette();
				break;
			case RandomMode.Gradient:
				_currentRandomColor = null;
				_gradientT = 0f;
				break;
			}
			_applyQueued = true;
			ApplyAllIfPossible();
		}
	}
}
internal enum ColorMode
{
	Preset,
	RGB,
	HSV
}
internal enum RandomMode
{
	Off,
	Full,
	HueOnly,
	Palette,
	Gradient
}
internal enum FadeCurve
{
	Linear,
	EaseIn,
	EaseOut,
	EaseInOut,
	Exponential
}
internal static class ModConfig
{
	public static ConfigEntry<bool> Enabled;

	public static ConfigEntry<bool> ResetOnSceneLoad;

	public static ConfigEntry<ColorMode> BaseColorMode;

	public static ConfigEntry<string> Preset;

	public static ConfigEntry<int> Red;

	public static ConfigEntry<int> Green;

	public static ConfigEntry<int> Blue;

	public static ConfigEntry<float> Hue;

	public static ConfigEntry<float> Saturation;

	public static ConfigEntry<float> Value;

	public static ConfigEntry<float> Alpha;

	public static ConfigEntry<float> MaxBrightness;

	public static ConfigEntry<RandomMode> RandomModePerScan;

	public static ConfigEntry<bool> RandomFixedAlpha;

	public static ConfigEntry<float> RandomAlpha;

	public static ConfigEntry<float> RandomAlphaMin;

	public static ConfigEntry<float> RandomAlphaMax;

	public static ConfigEntry<string> RandomPalette;

	public static ConfigEntry<float> RandomHueJitter;

	public static ConfigEntry<float> RandomSVJitter;

	public static ConfigEntry<string> GradientA;

	public static ConfigEntry<string> GradientB;

	public static ConfigEntry<float> GradientSpeed;

	public static ConfigEntry<bool> GradientPingPong;

	public static ConfigEntry<bool> FadeEnabled;

	public static ConfigEntry<FadeCurve> FadeCurveMode;

	public static ConfigEntry<bool> PulseEnabled;

	public static ConfigEntry<float> PulseSpeed;

	public static ConfigEntry<float> PulseStrength;

	public static ConfigEntry<bool> VignetteEnabled;

	public static ConfigEntry<float> VignetteIntensity;

	public static ConfigEntry<bool> VignetteUseScanColor;

	public static ConfigEntry<string> VignetteColor;

	public static ConfigEntry<float> VignetteAlpha;

	public static ConfigEntry<bool> BloomEnabled;

	public static ConfigEntry<float> BloomTintStrength;

	public static ConfigEntry<bool> BloomUseScanColor;

	public static ConfigEntry<string> BloomColor;

	public static ConfigEntry<float> BloomAlpha;

	public static ConfigEntry<bool> ScanLinesEnabled;

	public static ConfigEntry<bool> RecolorScanLines;

	public static ConfigEntry<float> ScanLinesRecolorStrength;

	public static ConfigEntry<float> ScanLinesMinLuma;

	public static ConfigEntry<float> ScanLinesMinAlpha;

	private static readonly Dictionary<string, string> Presets = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
	{
		{ "Cyan", "#00E5FFFF" },
		{ "Green", "#00FF55FF" },
		{ "Red", "#FF2A2AFF" },
		{ "Purple", "#B000FFFF" },
		{ "Amber", "#FFB000FF" },
		{ "White", "#FFFFFFFF" },
		{ "Pink", "#FF4FD8FF" },
		{ "Default", "#000CFFFF" }
	};

	public static void Bind(ConfigFile cfg)
	{
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Expected O, but got Unknown
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Expected O, but got Unknown
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Expected O, but got Unknown
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Expected O, but got Unknown
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0179: Expected O, but got Unknown
		//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Expected O, but got Unknown
		//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Expected O, but got Unknown
		//IL_021a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Expected O, but got Unknown
		//IL_0289: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Expected O, but got Unknown
		//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: Expected O, but got Unknown
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0305: Expected O, but got Unknown
		//IL_0353: Unknown result type (might be due to invalid IL or missing references)
		//IL_035d: Expected O, but got Unknown
		//IL_038c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0396: Expected O, but got Unknown
		//IL_0403: Unknown result type (might be due to invalid IL or missing references)
		//IL_040d: Expected O, but got Unknown
		//IL_04a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b2: Expected O, but got Unknown
		//IL_04e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04eb: Expected O, but got Unknown
		//IL_0535: Unknown result type (might be due to invalid IL or missing references)
		//IL_053f: Expected O, but got Unknown
		//IL_05a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b2: Expected O, but got Unknown
		//IL_05fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0606: Expected O, but got Unknown
		//IL_066f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0679: Expected O, but got Unknown
		//IL_06de: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e8: Expected O, but got Unknown
		//IL_0717: Unknown result type (might be due to invalid IL or missing references)
		//IL_0721: Expected O, but got Unknown
		//IL_0750: Unknown result type (might be due to invalid IL or missing references)
		//IL_075a: Expected O, but got Unknown
		Enabled = cfg.Bind<bool>("General", "Enabled", true, "Enable/disable the mod.");
		ResetOnSceneLoad = cfg.Bind<bool>("General", "ResetOnSceneLoad", true, "Reset cached references when a scene loads (recommended).");
		BaseColorMode = cfg.Bind<ColorMode>("Color", "Mode", ColorMode.Preset, "Base color mode: Preset / RGB / HSV.");
		Preset = cfg.Bind<string>("Color", "Preset", "White", "Preset name (Cyan, Green, Red, Purple, Amber, White) or hex (#RRGGBB / #RRGGBBAA).");
		Red = cfg.Bind<int>("Color.RGB", "Red", 0, new ConfigDescription("Red channel (0..255).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), new object[0]));
		Green = cfg.Bind<int>("Color.RGB", "Green", 229, new ConfigDescription("Green channel (0..255).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), new object[0]));
		Blue = cfg.Bind<int>("Color.RGB", "Blue", 255, new ConfigDescription("Blue channel (0..255).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), new object[0]));
		Hue = cfg.Bind<float>("Color.HSV", "Hue", 190f, new ConfigDescription("Hue (0..360).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 360f), new object[0]));
		Saturation = cfg.Bind<float>("Color.HSV", "Saturation", 1f, new ConfigDescription("Saturation (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		Value = cfg.Bind<float>("Color.HSV", "Value", 1f, new ConfigDescription("Value/Brightness (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		Alpha = cfg.Bind<float>("Color", "Alpha", 0.5636086f, new ConfigDescription("Scan overlay alpha/opacity (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		MaxBrightness = cfg.Bind<float>("Color", "MaxBrightness", 1f, new ConfigDescription("Clamp overall brightness (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		RandomModePerScan = cfg.Bind<RandomMode>("Random", "Mode", RandomMode.HueOnly, "Random color per scan: Off / Full / HueOnly / Palette / Gradient.");
		RandomFixedAlpha = cfg.Bind<bool>("Random", "FixedAlpha", true, "Use fixed alpha for random colors (otherwise AlphaMin..AlphaMax).");
		RandomAlpha = cfg.Bind<float>("Random", "Alpha", 0.26f, new ConfigDescription("Fixed random alpha (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		RandomAlphaMin = cfg.Bind<float>("Random", "AlphaMin", 0.26f, new ConfigDescription("Min random alpha when FixedAlpha=false (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		RandomAlphaMax = cfg.Bind<float>("Random", "AlphaMax", 0.65f, new ConfigDescription("Max random alpha when FixedAlpha=false (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		RandomPalette = cfg.Bind<string>("Random", "Palette", "Cyan, Purple, Green, Amber", "Palette for Random=Palette. Items can be preset names or hex.");
		RandomHueJitter = cfg.Bind<float>("Random", "HueJitter", 9.65953f, new ConfigDescription("Hue jitter in degrees for HueOnly (0..180).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 180f), new object[0]));
		RandomSVJitter = cfg.Bind<float>("Random", "SVJitter", 0.02869597f, new ConfigDescription("Small S/V jitter for HueOnly (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		GradientA = cfg.Bind<string>("Gradient", "ColorA", "Cyan", "Gradient color A (preset or hex).");
		GradientB = cfg.Bind<string>("Gradient", "ColorB", "Purple", "Gradient color B (preset or hex).");
		GradientSpeed = cfg.Bind<float>("Gradient", "Speed", 0.6f, new ConfigDescription("Gradient speed in cycles per second (0..5).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), new object[0]));
		GradientPingPong = cfg.Bind<bool>("Gradient", "PingPong", true, "Ping-pong between A and B instead of looping.");
		FadeEnabled = cfg.Bind<bool>("Fade", "Enabled", false, "Enable fade alpha animation during scan.");
		FadeCurveMode = cfg.Bind<FadeCurve>("Fade", "Curve", FadeCurve.EaseOut, "Fade curve: Linear / EaseIn / EaseOut / EaseInOut / Exponential.");
		PulseEnabled = cfg.Bind<bool>("Animation", "Pulse", true, "Enable alpha pulsing during scan.");
		PulseSpeed = cfg.Bind<float>("Animation", "PulseSpeed", 3.139388f, new ConfigDescription("Pulse frequency in Hz (0..20).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), new object[0]));
		PulseStrength = cfg.Bind<float>("Animation", "PulseStrength", 0.2991548f, new ConfigDescription("Pulse strength (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		VignetteEnabled = cfg.Bind<bool>("Vignette", "Enabled", true, "Control scan vignette settings.");
		VignetteIntensity = cfg.Bind<float>("Vignette", "Intensity", 0.7582871f, new ConfigDescription("Vignette intensity (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		VignetteUseScanColor = cfg.Bind<bool>("Vignette", "UseScanColor", true, "Use scan color for vignette color.");
		VignetteColor = cfg.Bind<string>("Vignette", "Color", "#00E5FFFF", "Vignette color when UseScanColor=false (preset or hex).");
		VignetteAlpha = cfg.Bind<float>("Vignette", "Alpha", 1f, new ConfigDescription("Vignette alpha when UseScanColor=false (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		BloomEnabled = cfg.Bind<bool>("Bloom", "Enabled", true, "Control scan bloom tint settings.");
		BloomTintStrength = cfg.Bind<float>("Bloom", "TintStrength", 1.511349f, new ConfigDescription("Bloom tint multiplier (0..2).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), new object[0]));
		BloomUseScanColor = cfg.Bind<bool>("Bloom", "UseScanColor", true, "Use scan color for bloom tint.");
		BloomColor = cfg.Bind<string>("Bloom", "Color", "#00E5FFFF", "Bloom tint color when UseScanColor=false (preset or hex).");
		BloomAlpha = cfg.Bind<float>("Bloom", "Alpha", 1f, new ConfigDescription("Bloom tint alpha (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		ScanLinesEnabled = cfg.Bind<bool>("ScanLines", "Enabled", true, "Enable/disable scan-lines (bloom dirt texture) handling.");
		RecolorScanLines = cfg.Bind<bool>("ScanLines", "Recolor", true, "Recolor scan-lines texture using the scan color.");
		ScanLinesRecolorStrength = cfg.Bind<float>("ScanLines", "RecolorStrength", 1f, new ConfigDescription("How strongly to recolor scan-lines (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		ScanLinesMinLuma = cfg.Bind<float>("ScanLines", "MinLuma", 0.05f, new ConfigDescription("Minimum pixel brightness threshold to recolor (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		ScanLinesMinAlpha = cfg.Bind<float>("ScanLines", "MinAlpha", 0.05f, new ConfigDescription("Minimum pixel alpha threshold to recolor (0..1).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[0]));
		HookApplyOnChanges();
	}

	private static void HookApplyOnChanges()
	{
		Action apply = HUDManagerPatch.RequestApply;
		Enabled.SettingChanged += delegate
		{
			apply();
		};
		ResetOnSceneLoad.SettingChanged += delegate
		{
			apply();
		};
		BaseColorMode.SettingChanged += delegate
		{
			apply();
		};
		Preset.SettingChanged += delegate
		{
			apply();
		};
		Red.SettingChanged += delegate
		{
			apply();
		};
		Green.SettingChanged += delegate
		{
			apply();
		};
		Blue.SettingChanged += delegate
		{
			apply();
		};
		Hue.SettingChanged += delegate
		{
			apply();
		};
		Saturation.SettingChanged += delegate
		{
			apply();
		};
		Value.SettingChanged += delegate
		{
			apply();
		};
		Alpha.SettingChanged += delegate
		{
			apply();
		};
		MaxBrightness.SettingChanged += delegate
		{
			apply();
		};
		RandomModePerScan.SettingChanged += delegate
		{
			apply();
		};
		RandomFixedAlpha.SettingChanged += delegate
		{
			apply();
		};
		RandomAlpha.SettingChanged += delegate
		{
			apply();
		};
		RandomAlphaMin.SettingChanged += delegate
		{
			apply();
		};
		RandomAlphaMax.SettingChanged += delegate
		{
			apply();
		};
		RandomPalette.SettingChanged += delegate
		{
			apply();
		};
		RandomHueJitter.SettingChanged += delegate
		{
			apply();
		};
		RandomSVJitter.SettingChanged += delegate
		{
			apply();
		};
		GradientA.SettingChanged += delegate
		{
			apply();
		};
		GradientB.SettingChanged += delegate
		{
			apply();
		};
		GradientSpeed.SettingChanged += delegate
		{
			apply();
		};
		GradientPingPong.SettingChanged += delegate
		{
			apply();
		};
		FadeEnabled.SettingChanged += delegate
		{
			apply();
		};
		FadeCurveMode.SettingChanged += delegate
		{
			apply();
		};
		PulseEnabled.SettingChanged += delegate
		{
			apply();
		};
		PulseSpeed.SettingChanged += delegate
		{
			apply();
		};
		PulseStrength.SettingChanged += delegate
		{
			apply();
		};
		VignetteEnabled.SettingChanged += delegate
		{
			apply();
		};
		VignetteIntensity.SettingChanged += delegate
		{
			apply();
		};
		VignetteUseScanColor.SettingChanged += delegate
		{
			apply();
		};
		VignetteColor.SettingChanged += delegate
		{
			apply();
		};
		VignetteAlpha.SettingChanged += delegate
		{
			apply();
		};
		BloomEnabled.SettingChanged += delegate
		{
			apply();
		};
		BloomTintStrength.SettingChanged += delegate
		{
			apply();
		};
		BloomUseScanColor.SettingChanged += delegate
		{
			apply();
		};
		BloomColor.SettingChanged += delegate
		{
			apply();
		};
		BloomAlpha.SettingChanged += delegate
		{
			apply();
		};
		ScanLinesEnabled.SettingChanged += delegate
		{
			apply();
		};
		RecolorScanLines.SettingChanged += delegate
		{
			apply();
		};
		ScanLinesRecolorStrength.SettingChanged += delegate
		{
			apply();
		};
		ScanLinesMinLuma.SettingChanged += delegate
		{
			apply();
		};
		ScanLinesMinAlpha.SettingChanged += delegate
		{
			apply();
		};
	}

	internal static bool TryParseColorString(string s, out Color color)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		color = default(Color);
		if (string.IsNullOrWhiteSpace(s))
		{
			return false;
		}
		string text = s.Trim();
		if (Presets.TryGetValue(text, out var value))
		{
			text = value;
		}
		if (text.StartsWith("#", StringComparison.Ordinal))
		{
			return TryParseHex(text, out color);
		}
		if (text.IndexOf(",") >= 0)
		{
			return TryParseCsv(text, out color);
		}
		return false;
	}

	private static bool TryParseHex(string hex, out Color color)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		color = default(Color);
		string text = hex.Trim();
		if (!text.StartsWith("#", StringComparison.Ordinal))
		{
			return false;
		}
		text = text.Substring(1);
		if (text.Length != 6 && text.Length != 8)
		{
			return false;
		}
		try
		{
			byte b = byte.Parse(text.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			byte b2 = byte.Parse(text.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			byte b3 = byte.Parse(text.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			byte b4 = byte.MaxValue;
			if (text.Length == 8)
			{
				b4 = byte.Parse(text.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			}
			color = new Color((float)(int)b / 255f, (float)(int)b2 / 255f, (float)(int)b3 / 255f, (float)(int)b4 / 255f);
			return true;
		}
		catch
		{
			return false;
		}
	}

	private static bool TryParseCsv(string csv, out Color color)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		color = default(Color);
		string[] array = csv.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
		if (array.Length != 3 && array.Length != 4)
		{
			return false;
		}
		float[] array2 = new float[array.Length];
		for (int i = 0; i < array.Length; i++)
		{
			if (!float.TryParse(array[i].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture, out var result))
			{
				return false;
			}
			array2[i] = result;
		}
		bool flag = array2.Take(3).Any((float x) => x > 1f);
		float v = (flag ? (array2[0] / 255f) : array2[0]);
		float v2 = (flag ? (array2[1] / 255f) : array2[1]);
		float v3 = (flag ? (array2[2] / 255f) : array2[2]);
		float v4 = 1f;
		if (array.Length == 4)
		{
			v4 = ((array2[3] > 1f) ? (array2[3] / 255f) : array2[3]);
		}
		color = new Color(Clamp01(v), Clamp01(v2), Clamp01(v3), Clamp01(v4));
		return true;
	}

	internal static Color GetBaseScanColor()
	{
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: 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_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		Color color = default(Color);
		switch (BaseColorMode.Value)
		{
		case ColorMode.RGB:
			((Color)(ref color))..ctor((float)Red.Value / 255f, (float)Green.Value / 255f, (float)Blue.Value / 255f, Alpha.Value);
			break;
		case ColorMode.HSV:
			color = Color.HSVToRGB(Clamp01(Hue.Value / 360f), Clamp01(Saturation.Value), Clamp01(Value.Value));
			color.a = Alpha.Value;
			break;
		default:
			if (!TryParseColorString(Preset.Value, out color))
			{
				((Color)(ref color))..ctor(0f, 0.8980392f, 1f, Alpha.Value);
			}
			color.a = Alpha.Value;
			break;
		}
		color = ApplyMaxBrightness(color, Clamp01(MaxBrightness.Value));
		return color;
	}

	internal static List<Color> ParsePaletteOrFallback()
	{
		//IL_0049: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
		List<Color> list = new List<Color>();
		string text = RandomPalette.Value ?? string.Empty;
		string[] array = text.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
		for (int i = 0; i < array.Length; i++)
		{
			if (TryParseColorString(array[i].Trim(), out var color))
			{
				list.Add(color);
			}
		}
		if (list.Count == 0)
		{
			if (TryParseColorString("Cyan", out var color2))
			{
				list.Add(color2);
			}
			if (TryParseColorString("Purple", out color2))
			{
				list.Add(color2);
			}
		}
		return list;
	}

	internal static float ResolveRandomAlpha()
	{
		if (RandomFixedAlpha.Value)
		{
			return Clamp01(RandomAlpha.Value);
		}
		float num = Clamp01(RandomAlphaMin.Value);
		float num2 = Clamp01(RandomAlphaMax.Value);
		if (num2 < num)
		{
			float num3 = num;
			num = num2;
			num2 = num3;
		}
		return Random.Range(num, num2);
	}

	internal static float Clamp01(float v)
	{
		if (v < 0f)
		{
			return 0f;
		}
		if (v > 1f)
		{
			return 1f;
		}
		return v;
	}

	internal static Color ApplyMaxBrightness(Color c, float maxB)
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		if (maxB >= 0.999f)
		{
			return c;
		}
		float num = default(float);
		float num2 = default(float);
		float val = default(float);
		Color.RGBToHSV(c, ref num, ref num2, ref val);
		val = Math.Min(val, maxB);
		Color result = Color.HSVToRGB(num, num2, val);
		result.a = c.a;
		return result;
	}

	internal static float ApplyCurve(float x, FadeCurve curve)
	{
		x = Clamp01(x);
		return curve switch
		{
			FadeCurve.Linear => x, 
			FadeCurve.EaseIn => x * x, 
			FadeCurve.EaseOut => 1f - (1f - x) * (1f - x), 
			FadeCurve.EaseInOut => (x < 0.5f) ? (2f * x * x) : (1f - (float)Math.Pow(-2f * x + 2f, 2.0) / 2f), 
			FadeCurve.Exponential => (float)Math.Pow(x, 3.0), 
			_ => x, 
		};
	}
}
[BepInPlugin("HoppinHauler.ScanRecolorPlus", "ScanRecolorPlus", "1.0.0")]
public sealed class Plugin : BaseUnityPlugin
{
	public const string PluginGuid = "HoppinHauler.ScanRecolorPlus";

	public const string PluginName = "ScanRecolorPlus";

	public const string PluginVersion = "1.0.0";

	internal static ManualLogSource Log;

	internal static Plugin Instance;

	private Harmony _harmony;

	internal static ConfigFile BepInExConfig()
	{
		return ((Object)(object)Instance != (Object)null) ? ((BaseUnityPlugin)Instance).Config : null;
	}

	private void Awake()
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Expected O, but got Unknown
		Instance = this;
		Log = ((BaseUnityPlugin)this).Logger;
		ModConfig.Bind(((BaseUnityPlugin)this).Config);
		_harmony = new Harmony("HoppinHauler.ScanRecolorPlus");
		_harmony.PatchAll(typeof(HUDManagerPatch));
		SceneHooks.Install();
		Log.LogInfo((object)"ScanRecolorPlus v1.0.0 loaded.");
	}

	private void OnDestroy()
	{
		SceneHooks.Uninstall();
		try
		{
			_harmony.UnpatchSelf();
		}
		catch
		{
		}
	}
}
internal static class SceneHooks
{
	private static bool _installed;

	public static void Install()
	{
		if (!_installed)
		{
			_installed = true;
			SceneManager.sceneLoaded += OnSceneLoaded;
		}
	}

	public static void Uninstall()
	{
		if (_installed)
		{
			_installed = false;
			SceneManager.sceneLoaded -= OnSceneLoaded;
		}
	}

	private static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		if (ModConfig.ResetOnSceneLoad.Value)
		{
			HUDManagerPatch.RequestApply();
		}
		else
		{
			HUDManagerPatch.RequestApply();
		}
	}
}
internal static class TextureUtils
{
	public static Texture2D MakeReadableTexture(Texture original)
	{
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)original == (Object)null)
		{
			return null;
		}
		RenderTexture val = null;
		RenderTexture active = null;
		try
		{
			val = RenderTexture.GetTemporary(original.width, original.height, 0, (RenderTextureFormat)0, (RenderTextureReadWrite)1);
			Graphics.Blit(original, val);
			active = RenderTexture.active;
			RenderTexture.active = val;
			Texture2D val2 = new Texture2D(original.width, original.height, (TextureFormat)4, false);
			val2.ReadPixels(new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), 0, 0);
			val2.Apply(false, false);
			return val2;
		}
		catch
		{
			return null;
		}
		finally
		{
			try
			{
				RenderTexture.active = active;
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)val != (Object)null)
				{
					RenderTexture.ReleaseTemporary(val);
				}
			}
			catch
			{
			}
		}
	}

	public static void RecolorTextureInPlace(Texture2D texture, Color targetColor, float strength, float minLuma, float minAlpha)
	{
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: 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)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: 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)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)texture == (Object)null)
		{
			return;
		}
		strength = Clamp01(strength);
		if (strength <= 0f)
		{
			return;
		}
		Color[] pixels;
		try
		{
			pixels = texture.GetPixels();
		}
		catch
		{
			return;
		}
		Color val2 = default(Color);
		for (int i = 0; i < pixels.Length; i++)
		{
			Color val = pixels[i];
			if (!(val.a < minAlpha))
			{
				float num = (val.r + val.g + val.b) / 3f;
				if (!(num < minLuma))
				{
					((Color)(ref val2))..ctor(targetColor.r * num, targetColor.g * num, targetColor.b * num, val.a);
					pixels[i] = Color.Lerp(val, val2, strength);
				}
			}
		}
		try
		{
			texture.SetPixels(pixels);
		}
		catch
		{
		}
	}

	private static float Clamp01(float v)
	{
		if (v < 0f)
		{
			return 0f;
		}
		if (v > 1f)
		{
			return 1f;
		}
		return v;
	}
}