Decompiled source of NeonMag v1.2.0

Mods/NeonMag.dll

Decompiled 10 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib;
using BoneLib.BoneMenu;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSLZ.Marrow;
using Il2CppSLZ.Marrow.Data;
using Il2CppTMPro;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using NeonMag;
using NeonMag.Ammo;
using NeonMag.Config;
using NeonMag.Hud;
using NeonMag.Menu;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("NeonMag")]
[assembly: AssemblyDescription("Cyberpunk holographic ammo readout for every firearm.")]
[assembly: AssemblyCompany(null)]
[assembly: AssemblyProduct("NeonMag")]
[assembly: AssemblyFileVersion("1.2.0")]
[assembly: MelonInfo(typeof(NeonMagMod), "NeonMag", "1.2.0", "Rocner", null)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: MelonColor(255, 0, 235, 255)]
[assembly: MelonAuthorColor(255, 255, 40, 155)]
[assembly: MelonAdditionalDependencies(new string[] { "BoneLib" })]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyVersion("1.2.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 NeonMag
{
	public sealed class NeonMagMod : MelonMod
	{
		private static bool _levelReady;

		private static float _retry;

		public override void OnInitializeMelon()
		{
			Step("preferences", Prefs.Load);
			Step("menu", MenuPage.Build);
			Step("hooks", delegate
			{
				Hooking.OnLevelLoaded += OnLevelLoaded;
			});
			Step("unload-hook", delegate
			{
				Hooking.OnLevelUnloaded += OnLevelUnloaded;
			});
			((MelonBase)this).LoggerInstance.Msg("NeonMag ready.");
		}

		private void Step(string name, Action action)
		{
			try
			{
				action();
			}
			catch (Exception ex)
			{
				((MelonBase)this).LoggerInstance.Error("Init step '" + name + "' failed: " + ex);
			}
		}

		private static void OnLevelLoaded(LevelInfo info)
		{
			_levelReady = true;
			_retry = 0f;
			AmmoReader.Forget();
		}

		private static void OnLevelUnloaded()
		{
			_levelReady = false;
			AmmoReader.Forget();
			NeonHud.Destroy();
		}

		public override void OnUpdate()
		{
			try
			{
				Run();
			}
			catch (Exception ex)
			{
				((MelonBase)this).LoggerInstance.Error("Update failed: " + ex);
			}
		}

		private static void Run()
		{
			float deltaTime = Time.deltaTime;
			if (deltaTime <= 0f)
			{
				return;
			}
			if (!Prefs.Enabled)
			{
				if (NeonHud.Exists)
				{
					NeonHud.Feed(found: false, default(AmmoSnapshot));
					NeonHud.Tick(deltaTime);
				}
				return;
			}
			if (!NeonHud.Exists)
			{
				_retry -= deltaTime;
				if (_retry > 0f)
				{
					return;
				}
				_retry = 0.5f;
				if (!_levelReady || (Object)(object)Player.Head == (Object)null)
				{
					return;
				}
				NeonHud.Build();
				if (!NeonHud.Exists)
				{
					return;
				}
			}
			NeonHud.Feed(AmmoReader.TryResolve(out var snapshot), snapshot);
			NeonHud.Tick(deltaTime);
		}

		public override void OnDeinitializeMelon()
		{
			try
			{
				Hooking.OnLevelLoaded -= OnLevelLoaded;
			}
			catch
			{
			}
			try
			{
				Hooking.OnLevelUnloaded -= OnLevelUnloaded;
			}
			catch
			{
			}
			try
			{
				NeonHud.Destroy();
			}
			catch
			{
			}
			try
			{
				NeonTheme.Reset();
			}
			catch
			{
			}
			try
			{
				Prefs.Save();
			}
			catch
			{
			}
		}
	}
	internal static class BuildInfo
	{
		public const string Name = "NeonMag";

		public const string Description = "Cyberpunk holographic ammo readout for every firearm.";

		public const string Author = "Rocner";

		public const string Company = null;

		public const string Version = "1.2.0";
	}
}
namespace NeonMag.Menu
{
	internal static class MenuPage
	{
		private static readonly Color Accent = new Color(0f, 0.92f, 1f);

		public static void Build()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			Page root;
			try
			{
				root = Page.Root.CreatePage("NeonMag", Accent, 0, true);
			}
			catch (Exception ex)
			{
				Melon<NeonMagMod>.Logger.Error("BoneMenu root page failed: " + ex);
				return;
			}
			Section("display", delegate
			{
				BuildDisplaySection(root);
			});
			Section("style", delegate
			{
				BuildStylePage(root);
			});
			Section("placement", delegate
			{
				BuildPlacementPage(root);
			});
			Section("readouts", delegate
			{
				BuildReadoutPage(root);
			});
		}

		private static void Section(string name, Action build)
		{
			try
			{
				build();
			}
			catch (Exception ex)
			{
				Melon<NeonMagMod>.Logger.Error("BoneMenu section '" + name + "' failed: " + ex);
			}
		}

		private static void BuildDisplaySection(Page root)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			root.CreateBool("Enabled", Accent, Prefs.Enabled, (Action<bool>)delegate(bool value)
			{
				Prefs.Enabled = value;
				Prefs.Save();
			});
			root.CreateFloat("Scale", Accent, Prefs.Scale, 0.05f, 0.35f, 3f, (Action<float>)delegate(float value)
			{
				Prefs.Scale = value;
				Prefs.Save();
			});
			root.CreateFloat("Opacity", Accent, Prefs.Opacity, 0.05f, 0.15f, 1f, (Action<float>)delegate(float value)
			{
				Prefs.Opacity = value;
				Prefs.Save();
			});
		}

		private static void BuildStylePage(Page root)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			Page obj = root.CreatePage("Style", Accent, 0, true);
			obj.CreateInt("Palette", Accent, Prefs.Palette, 1, 0, NeonTheme.PaletteCount - 1, (Action<int>)delegate(int value)
			{
				Prefs.Palette = value;
				Prefs.Save();
				Melon<NeonMagMod>.Logger.Msg("Palette: " + NeonTheme.PaletteName(value));
			});
			obj.CreateFunction("Cycle Palette", Accent, (Action)delegate
			{
				int index = (Prefs.Palette = (Prefs.Palette + 1) % NeonTheme.PaletteCount);
				Prefs.Save();
				Melon<NeonMagMod>.Logger.Msg("Palette: " + NeonTheme.PaletteName(index));
			});
			obj.CreateFloat("Glitch Intensity", Accent, Prefs.Glitch, 0.05f, 0f, 1f, (Action<float>)delegate(float value)
			{
				Prefs.Glitch = value;
				Prefs.Save();
			});
			obj.CreateBool("Scanline Sweep", Accent, Prefs.Sweep, (Action<bool>)delegate(bool value)
			{
				Prefs.Sweep = value;
				Prefs.Save();
			});
		}

		private static void BuildPlacementPage(Page root)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			Page obj = root.CreatePage("Placement", Accent, 0, true);
			obj.CreateFloat("Offset X", Accent, Prefs.OffsetX, 0.005f, -0.4f, 0.4f, (Action<float>)delegate(float value)
			{
				Prefs.OffsetX = value;
				Prefs.Save();
			});
			obj.CreateFloat("Offset Y", Accent, Prefs.OffsetY, 0.005f, -0.4f, 0.4f, (Action<float>)delegate(float value)
			{
				Prefs.OffsetY = value;
				Prefs.Save();
			});
			obj.CreateFloat("Offset Z", Accent, Prefs.OffsetZ, 0.005f, -0.4f, 0.4f, (Action<float>)delegate(float value)
			{
				Prefs.OffsetZ = value;
				Prefs.Save();
			});
			obj.CreateBool("Face Player", Accent, Prefs.Billboard, (Action<bool>)delegate(bool value)
			{
				Prefs.Billboard = value;
				Prefs.Save();
			});
			obj.CreateFunction("Reset Offset", Accent, (Action)delegate
			{
				Prefs.OffsetX = 0.105f;
				Prefs.OffsetY = 0.035f;
				Prefs.OffsetZ = 0f;
				Prefs.Save();
			});
		}

		private static void BuildReadoutPage(Page root)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			Page obj = root.CreatePage("Readouts", Accent, 0, true);
			obj.CreateBool("Round Segments", Accent, Prefs.Segments, (Action<bool>)delegate(bool value)
			{
				Prefs.Segments = value;
				Prefs.Save();
			});
			obj.CreateBool("Reserve Count", Accent, Prefs.Reserve, (Action<bool>)delegate(bool value)
			{
				Prefs.Reserve = value;
				Prefs.Save();
			});
			obj.CreateBool("Fire Mode", Accent, Prefs.FireMode, (Action<bool>)delegate(bool value)
			{
				Prefs.FireMode = value;
				Prefs.Save();
			});
			obj.CreateBool("Show On Loose Magazines", Accent, Prefs.Magazines, (Action<bool>)delegate(bool value)
			{
				Prefs.Magazines = value;
				Prefs.Save();
			});
			obj.CreateBool("Fade Detail When Idle", Accent, Prefs.AutoFade, (Action<bool>)delegate(bool value)
			{
				Prefs.AutoFade = value;
				Prefs.Save();
			});
		}
	}
}
namespace NeonMag.Hud
{
	internal static class Ease
	{
		public static float OutCubic(float t)
		{
			t = Mathf.Clamp01(t);
			float num = 1f - t;
			return 1f - num * num * num;
		}

		public static float OutExpo(float t)
		{
			t = Mathf.Clamp01(t);
			if (!(t >= 1f))
			{
				return 1f - Mathf.Pow(2f, -10f * t);
			}
			return 1f;
		}

		public static float OutBack(float t)
		{
			t = Mathf.Clamp01(t);
			float num = t - 1f;
			return 1f + 2.70158f * num * num * num + 1.70158f * num * num;
		}

		public static float InOutQuad(float t)
		{
			t = Mathf.Clamp01(t);
			if (!(t < 0.5f))
			{
				return 1f - Mathf.Pow(-2f * t + 2f, 2f) * 0.5f;
			}
			return 2f * t * t;
		}

		public static float Pulse(float time, float rate)
		{
			return 0.5f + 0.5f * Mathf.Sin(time * rate * (float)Math.PI * 2f);
		}

		public static float Hash(float seed)
		{
			float num = Mathf.Sin(seed * 127.1f) * 43758.547f;
			return num - Mathf.Floor(num);
		}
	}
	internal sealed class NeonPiece
	{
		public GameObject Root;

		public Renderer Renderer;

		public Material Material;

		public void SetActive(bool active)
		{
			if ((Object)(object)Root != (Object)null && Root.activeSelf != active)
			{
				Root.SetActive(active);
			}
		}

		public void Tint(Color color)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			NeonTheme.Tint(Material, color);
		}

		public void Place(Vector3 localPosition, Vector2 size)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)Root == (Object)null))
			{
				Root.transform.localPosition = localPosition;
				Root.transform.localScale = new Vector3(size.x, size.y, 1f);
			}
		}
	}
	internal static class NeonHud
	{
		private const float PanelW = 0.156f;

		private const float PanelH = 0.092f;

		private const float HeaderY = 0.0345f;

		private const float NumberY = 0.0055f;

		private const float MaxY = -0.0015f;

		private const float BarY = -0.023f;

		private const float FootY = -0.0372f;

		private const float ZShadow = 0.011f;

		private const float ZHalo = 0.008f;

		private const float ZFill = 0f;

		private const float ZEdge = -0.0012f;

		private const float ZBloom = -0.0018f;

		private const float ZBars = -0.003f;

		private const float ZRail = -0.0034f;

		private const float ZTicks = -0.0052f;

		private const float ZSheen = -0.006f;

		private const float ZSweep = -0.0066f;

		private const float ZSecond = -0.0075f;

		private const float ZMax = -0.009f;

		private const float ZGhostA = -0.0112f;

		private const float ZGhostB = -0.0116f;

		private const float ZCore = -0.0122f;

		private const float ZBracket = -0.014f;

		private const float ZTear = -0.0165f;

		private const float RailW = 0.14f;

		private const float TickH = 0.0092f;

		private const float TickGap = 0.0021f;

		private const int MaxTicks = 40;

		private static GameObject _root;

		private static Transform _scaler;

		private static Transform _warp;

		private static NeonPiece _shadow;

		private static NeonPiece _glow;

		private static NeonPiece _bloom;

		private static NeonPiece _sheen;

		private static NeonPiece _fill;

		private static NeonPiece _edge;

		private static NeonPiece _headerBar;

		private static NeonPiece _footBar;

		private static NeonPiece _rail;

		private static NeonPiece _sweep;

		private static NeonPiece _tear;

		private static readonly List<NeonPiece> Brackets = new List<NeonPiece>();

		private static readonly List<NeonPiece> Ticks = new List<NeonPiece>();

		private static readonly float[] TickLit = new float[40];

		private static readonly float[] TickFlash = new float[40];

		private static Transform _countRoot;

		private static TextMeshPro _countGhostA;

		private static TextMeshPro _countGhostB;

		private static TextMeshPro _countCore;

		private static TextMeshPro _max;

		private static TextMeshPro _platform;

		private static TextMeshPro _fireMode;

		private static TextMeshPro _reserve;

		private static TextMeshPro _cartridge;

		private static readonly List<Material> TextMaterials = new List<Material>();

		private static AmmoSnapshot _current;

		private static bool _hasSource;

		private static bool _wantVisible;

		private static float _alive;

		private static float _glitch;

		private static float _kick;

		private static float _reload;

		private static float _sweepPhase;

		private static float _tearSeed;

		private static float _detail = 1f;

		private static float _detailHold = 3.5f;

		private static int _lastCount = -1;

		private static int _lastMax = -1;

		public static bool Exists => (Object)(object)_root != (Object)null;

		public static void Build()
		{
			if ((Object)(object)_root != (Object)null)
			{
				return;
			}
			try
			{
				Assemble();
			}
			catch (Exception ex)
			{
				Melon<NeonMagMod>.Logger.Error("Readout build failed: " + ex);
				Destroy();
			}
		}

		private static void Assemble()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: 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)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a7: 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_02ed: Unknown result type (might be due to invalid IL or missing references)
			_root = new GameObject("NeonMagHud");
			Object.DontDestroyOnLoad((Object)(object)_root);
			GameObject val = new GameObject("Scaler");
			val.transform.SetParent(_root.transform, false);
			_scaler = val.transform;
			GameObject val2 = new GameObject("Warp");
			val2.transform.SetParent(_scaler, false);
			_warp = val2.transform;
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(0.156f, 0.092f);
			_shadow = Quad("Shadow", val3, 0.011f, 3994, NeonTextures.Fill(val3));
			_shadow.Root.transform.localPosition = new Vector3(0.005f, -0.005f, 0.011f);
			Vector2 val4 = default(Vector2);
			((Vector2)(ref val4))..ctor(0.174f, 0.11f);
			_glow = Quad("Glow", val4, 0.008f, 3996, NeonTextures.Halo(val4, val3));
			_fill = Quad("Fill", val3, 0f, 4000, NeonTextures.Fill(val3));
			_edge = Quad("Edge", val3, -0.0012f, 4002, NeonTextures.Edge(val3));
			Vector2 val5 = default(Vector2);
			((Vector2)(ref val5))..ctor(0.163f, 0.099f);
			_bloom = Quad("Bloom", val5, -0.0018f, 4003, NeonTextures.Halo(val5, val3));
			_sheen = Quad("Sheen", val3, -0.006f, 4007, NeonTextures.Sheen(val3));
			_headerBar = Quad("HeaderBar", new Vector2(0.146f, 0.0125f), -0.0008f, 4004, NeonTextures.Slab(new Vector2(0.146f, 0.0125f)));
			_headerBar.Place(new Vector3(0f, 0.0345f, -0.003f), new Vector2(0.146f, 0.0125f));
			_footBar = Quad("FootBar", new Vector2(0.146f, 0.01f), -0.0008f, 4004, NeonTextures.Slab(new Vector2(0.146f, 0.01f)));
			_footBar.Place(new Vector3(0f, -0.0372f, -0.003f), new Vector2(0.146f, 0.01f));
			_rail = Quad("Rail", new Vector2(0.14f, 0.0092f), -0.0009f, 4004, NeonTextures.Solid());
			_rail.Place(new Vector3(0f, -0.023f, -0.0034f), new Vector2(0.14f, 0.0092f));
			_sweep = Quad("Sweep", new Vector2(0.15f, 0.02f), -0.0066f, 4008, NeonTextures.Sweep());
			_tear = Quad("Tear", new Vector2(0.156f, 0.006f), -0.0165f, 4014, NeonTextures.Solid());
			_tear.SetActive(active: false);
			BuildBrackets();
			BuildTicks();
			BuildTexts();
			_root.SetActive(false);
		}

		private static void BuildBrackets()
		{
			//IL_0012: 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)
			float num = 0.0355f;
			AddBracket(new Vector3(0.0675f, num, -0.014f), -90f);
			AddBracket(new Vector3(0f - 0.0675f, 0f - num, -0.014f), 90f);
		}

		private static void AddBracket(Vector3 position, float angle)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			NeonPiece neonPiece = Quad("Bracket", new Vector2(0.021f, 0.021f), position.z, 4005, NeonTextures.Bracket());
			neonPiece.Root.transform.localPosition = position;
			neonPiece.Root.transform.localRotation = Quaternion.Euler(0f, 0f, angle);
			Brackets.Add(neonPiece);
		}

		private static void BuildTicks()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < 40; i++)
			{
				NeonPiece neonPiece = Quad("Tick" + i, new Vector2(0.002f, 0.0092f), -0.0052f, 4006, NeonTextures.Tick());
				neonPiece.SetActive(active: false);
				Ticks.Add(neonPiece);
			}
		}

		private static void BuildTexts()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: 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_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Count");
			val.transform.SetParent(_warp, false);
			val.transform.localPosition = new Vector3(-0.028f, 0.0055f, 0f);
			_countRoot = val.transform;
			Vector2 size = default(Vector2);
			((Vector2)(ref size))..ctor(0.07f, 0.038f);
			_countGhostA = Text(_countRoot, "GhostA", size, 0.0365f, (TextAlignmentOptions)516, -0.0112f, 4009);
			_countGhostB = Text(_countRoot, "GhostB", size, 0.0365f, (TextAlignmentOptions)516, -0.0116f, 4010);
			_countCore = Text(_countRoot, "Core", size, 0.0365f, (TextAlignmentOptions)516, -0.0122f, 4012);
			_max = Text(_warp, "Max", new Vector2(0.048f, 0.017f), 0.014f, (TextAlignmentOptions)513, -0.009f, 4012);
			((Transform)((TMP_Text)_max).rectTransform).localPosition = new Vector3(0.04f, -0.0015f, -0.009f);
			_platform = Text(_warp, "Platform", new Vector2(0.061f, 0.013f), 0.0092f, (TextAlignmentOptions)513, -0.0075f, 4012);
			((Transform)((TMP_Text)_platform).rectTransform).localPosition = new Vector3(-0.0335f, 0.0345f, -0.0075f);
			_fireMode = Text(_warp, "FireMode", new Vector2(0.061f, 0.013f), 0.0092f, (TextAlignmentOptions)516, -0.0075f, 4012);
			((Transform)((TMP_Text)_fireMode).rectTransform).localPosition = new Vector3(0.0335f, 0.0345f, -0.0075f);
			_reserve = Text(_warp, "Reserve", new Vector2(0.061f, 0.011f), 0.008f, (TextAlignmentOptions)513, -0.0075f, 4012);
			((Transform)((TMP_Text)_reserve).rectTransform).localPosition = new Vector3(-0.0335f, -0.0372f, -0.0075f);
			_cartridge = Text(_warp, "Cartridge", new Vector2(0.061f, 0.011f), 0.008f, (TextAlignmentOptions)516, -0.0075f, 4012);
			((Transform)((TMP_Text)_cartridge).rectTransform).localPosition = new Vector3(0.0335f, -0.0372f, -0.0075f);
		}

		private static NeonPiece Quad(string name, Vector2 size, float depth, int queue, Texture2D texture)
		{
			//IL_0030: 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_0050: 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)
			//IL_0061: 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)
			GameObject val = GameObject.CreatePrimitive((PrimitiveType)5);
			((Object)val).name = name;
			val.transform.SetParent(_warp, false);
			val.transform.localPosition = new Vector3(0f, 0f, depth);
			val.transform.localRotation = Quaternion.identity;
			val.transform.localScale = new Vector3(size.x, size.y, 1f);
			Collider component = val.GetComponent<Collider>();
			if ((Object)(object)component != (Object)null)
			{
				Object.DestroyImmediate((Object)(object)component);
			}
			Renderer component2 = val.GetComponent<Renderer>();
			Material material = (component2.material = NeonTheme.CreateMaterial(Color.white, texture, queue));
			component2.shadowCastingMode = (ShadowCastingMode)0;
			component2.receiveShadows = false;
			return new NeonPiece
			{
				Root = val,
				Renderer = component2,
				Material = material
			};
		}

		private static TextMeshPro Text(Transform parent, string name, Vector2 size, float worldHeight, TextAlignmentOptions alignment, float depth, int queue)
		{
			//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_003d: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			TextMeshPro val2 = val.AddComponent<TextMeshPro>();
			((TMP_Text)val2).font = NeonTheme.Font;
			NeonTheme.Calibrate((TMP_Text)(object)val2);
			RectTransform rectTransform = ((TMP_Text)val2).rectTransform;
			((Transform)rectTransform).localPosition = new Vector3(0f, 0f, depth);
			((Transform)rectTransform).localRotation = Quaternion.identity;
			((Transform)rectTransform).localScale = Vector3.one;
			rectTransform.sizeDelta = size;
			((TMP_Text)val2).fontSize = NeonTheme.FontSizeFor(worldHeight);
			((TMP_Text)val2).alignment = alignment;
			((TMP_Text)val2).enableWordWrapping = false;
			((TMP_Text)val2).overflowMode = (TextOverflowModes)0;
			((TMP_Text)val2).richText = false;
			((TMP_Text)val2).margin = new Vector4(0.002f, 0f, 0.002f, 0f);
			((TMP_Text)val2).characterSpacing = 4f;
			((TMP_Text)val2).text = string.Empty;
			((Graphic)val2).color = Color.white;
			try
			{
				Material fontMaterial = ((TMP_Text)val2).fontMaterial;
				if ((Object)(object)fontMaterial != (Object)null)
				{
					TextMaterials.Add(fontMaterial);
					if (fontMaterial.HasProperty("_ZTestMode"))
					{
						fontMaterial.SetFloat("_ZTestMode", 8f);
					}
					if (fontMaterial.HasProperty("_ZTest"))
					{
						fontMaterial.SetFloat("_ZTest", 8f);
					}
					fontMaterial.renderQueue = queue;
				}
			}
			catch
			{
			}
			return val2;
		}

		public static void Feed(bool found, AmmoSnapshot snapshot)
		{
			if (!found || !Prefs.Enabled)
			{
				_wantVisible = false;
				return;
			}
			bool flag = !_hasSource || !_current.SameSource(snapshot);
			if (flag)
			{
				_alive = 0f;
				_lastCount = -1;
				_lastMax = -1;
				_reload = 1f;
				_detailHold = 3.5f;
				_detail = 1f;
				for (int i = 0; i < 40; i++)
				{
					TickLit[i] = 0f;
					TickFlash[i] = 0f;
				}
			}
			if (_lastMax >= 0 && snapshot.Max != _lastMax)
			{
				_glitch = 1f;
				_detailHold = 3.5f;
			}
			if (_lastCount >= 0 && snapshot.Count != _lastCount)
			{
				_glitch = 1f;
				_detailHold = 3.5f;
				_tearSeed = Ease.Hash((float)snapshot.Count * 3.7f + (float)snapshot.Max * 1.3f);
				if (snapshot.Count < _lastCount)
				{
					_kick = 1f;
				}
				else if (snapshot.Count - _lastCount > 1)
				{
					_reload = 0f;
				}
			}
			_lastCount = snapshot.Count;
			_lastMax = snapshot.Max;
			_current = snapshot;
			_hasSource = true;
			_wantVisible = true;
			if (flag)
			{
				Snap();
			}
		}

		private static void Snap()
		{
			//IL_002a: 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_004d: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_root == (Object)null) && !((Object)(object)_current.Anchor == (Object)null))
			{
				_root.transform.position = TargetPosition();
				_root.transform.rotation = TargetRotation(_root.transform.position);
			}
		}

		private static Vector3 TargetPosition()
		{
			//IL_000c: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			Transform anchor = _current.Anchor;
			return anchor.position + anchor.rotation * Prefs.Offset;
		}

		private static Quaternion TargetRotation(Vector3 position)
		{
			//IL_0044: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_005f: Unknown result type (might be due to invalid IL or missing references)
			if (!Prefs.Billboard)
			{
				if (!((Object)(object)_current.Anchor != (Object)null))
				{
					return Quaternion.identity;
				}
				return _current.Anchor.rotation;
			}
			Transform head = Player.Head;
			if ((Object)(object)head == (Object)null)
			{
				return Quaternion.identity;
			}
			Vector3 val = position - head.position;
			if (((Vector3)(ref val)).sqrMagnitude < 1E-06f)
			{
				return Quaternion.identity;
			}
			return Quaternion.LookRotation(val, Vector3.up);
		}

		public static void Tick(float dt)
		{
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: 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)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_root == (Object)null)
			{
				return;
			}
			bool flag = _wantVisible && _hasSource && (Object)(object)_current.Anchor != (Object)null;
			_alive = Mathf.MoveTowards(_alive, flag ? 1f : 0f, dt * (flag ? 4.6f : 7.5f));
			if (_alive <= 0.0001f)
			{
				if (_root.activeSelf)
				{
					_root.SetActive(false);
				}
				if (!flag)
				{
					_hasSource = false;
				}
				return;
			}
			if (!_root.activeSelf)
			{
				_root.SetActive(true);
			}
			_glitch = Mathf.MoveTowards(_glitch, 0f, dt * 3.4f);
			_kick = Mathf.MoveTowards(_kick, 0f, dt * 3.2f);
			_reload = Mathf.MoveTowards(_reload, 1f, dt * 2.2f);
			_sweepPhase = Mathf.Repeat(_sweepPhase + dt * 0.32f, 1f);
			if (Prefs.AutoFade)
			{
				_detailHold = Mathf.Max(0f, _detailHold - dt);
				_detail = Mathf.MoveTowards(_detail, (_detailHold > 0f) ? 1f : 0f, dt * 1.9f);
			}
			else
			{
				_detail = Mathf.MoveTowards(_detail, 1f, dt * 3f);
			}
			if (flag)
			{
				Vector3 val = TargetPosition();
				Quaternion val2 = TargetRotation(_root.transform.position);
				float num = 1f - Mathf.Exp(-16f * dt);
				float num2 = 1f - Mathf.Exp(-13f * dt);
				_root.transform.position = Vector3.Lerp(_root.transform.position, val, num);
				_root.transform.rotation = Quaternion.Slerp(_root.transform.rotation, val2, num2);
			}
			ApplyWarp();
			ApplyText();
			ApplyColors(dt);
		}

		private static void ApplyWarp()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: 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)
			float scale = Prefs.Scale;
			_scaler.localScale = new Vector3(scale, scale, scale);
			float num = Mathf.Max(0.002f, Ease.OutExpo(Mathf.Clamp01(_alive / 0.4f)));
			float num2 = Mathf.Max(0.002f, Ease.OutBack(Mathf.Clamp01((_alive - 0.22f) / 0.78f)));
			float num3 = _glitch * _glitch * Prefs.Glitch;
			float num4 = (Ease.Hash(_tearSeed + Mathf.Floor(Time.time * 34f)) - 0.5f) * 0.01f * num3;
			_warp.localScale = new Vector3(num, num2, 1f);
			_warp.localPosition = new Vector3(num4, 0f, 0f);
		}

		private static void ApplyText()
		{
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			bool flag = _current.NoMagazine && !_current.Chambered;
			((TMP_Text)_countCore).text = (flag ? "--" : _current.Count.ToString());
			((TMP_Text)_countGhostA).text = ((TMP_Text)_countCore).text;
			((TMP_Text)_countGhostB).text = ((TMP_Text)_countCore).text;
			((TMP_Text)_max).text = (flag ? "/ --" : ("/ " + _current.Max));
			((TMP_Text)_platform).text = (_current.NoMagazine ? "NO MAG" : _current.Platform);
			((TMP_Text)_fireMode).text = (Prefs.FireMode ? (_current.FireMode ?? string.Empty) : string.Empty);
			((TMP_Text)_reserve).text = ((_current.Reserve >= 0) ? ("RSV " + _current.Reserve) : string.Empty);
			((TMP_Text)_cartridge).text = _current.Cartridge ?? string.Empty;
			float num = 0.2f * _kick * Mathf.Cos(_kick * 8.4f);
			_countRoot.localScale = Vector3.one * (1f + num);
			float num2 = (0.0009f + 0.0032f * _glitch) * Mathf.Lerp(0.3f, 1f, Prefs.Glitch);
			((Transform)((TMP_Text)_countGhostA).rectTransform).localPosition = new Vector3(0f - num2, num2 * 0.42f, -0.0112f);
			((Transform)((TMP_Text)_countGhostB).rectTransform).localPosition = new Vector3(num2, (0f - num2) * 0.42f, -0.0116f);
		}

		private static void ApplyColors(float dt)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: 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_00b5: 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)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: 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_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: 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_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0308: Unknown result type (might be due to invalid IL or missing references)
			//IL_030f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0320: Unknown result type (might be due to invalid IL or missing references)
			//IL_0347: Unknown result type (might be due to invalid IL or missing references)
			//IL_0353: Unknown result type (might be due to invalid IL or missing references)
			//IL_035a: Unknown result type (might be due to invalid IL or missing references)
			//IL_035c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0383: Unknown result type (might be due to invalid IL or missing references)
			float num = Ease.OutCubic(Mathf.Clamp01(_alive * 1.4f));
			float num2 = 0.9f + 0.1f * Ease.Hash(Mathf.Floor(Time.time * 24f) * 1.13f);
			float num3 = num * Prefs.Opacity * num2;
			float ratio = _current.Ratio;
			float num4 = NeonTheme.Severity(_current.Count, ratio);
			Color val = NeonTheme.StateColor(num4);
			Color accent = NeonTheme.Accent;
			float num5 = ((num4 <= 0.0001f) ? 1f : ((num4 < 0.24f) ? 0.6f : 0f));
			if (num5 > 0f)
			{
				float num6 = Ease.Pulse(Time.time, 2.8f + num5);
				val = Color.Lerp(val, NeonTheme.Bright, num6 * 0.28f * num5);
				num3 *= Mathf.Lerp(1f, 0.72f + 0.28f * num6, num5);
			}
			float num7 = Mathf.Clamp01(_detail);
			Fade(_shadow, NeonTheme.Shadow, 1f, num3);
			Fade(_glow, val, 0.1f, num3);
			Fade(_bloom, val, 0.17f, num3);
			Fade(_fill, NeonTheme.Backplate, 1f, num3);
			Fade(_edge, val, 0.95f, num3);
			Fade(_headerBar, val, 0.24f, num3 * Mathf.Lerp(0.25f, 1f, num7));
			Fade(_footBar, val, 0.15f, num3 * Mathf.Lerp(0.25f, 1f, num7));
			Fade(_rail, val, 0.1f, num3);
			Color color = Color.Lerp(val, NeonTheme.Bright, 0.55f);
			color.a = num3 * (0.035f + 0.02f * Ease.Pulse(Time.time, 0.13f));
			_sheen.Tint(color);
			for (int i = 0; i < Brackets.Count; i++)
			{
				Fade(Brackets[i], accent, 0.85f, num3);
			}
			ApplySweep(val, num3);
			ApplyTear(accent, num3);
			ApplyTicks(dt, val, num3);
			Color color2 = Color.Lerp(NeonTheme.Bright, val, 0.25f + 0.45f * num5);
			color2.a = num3;
			((Graphic)_countCore).color = color2;
			Color color3 = val;
			color3.a = num3 * (0.55f + 0.35f * _glitch);
			((Graphic)_countGhostA).color = color3;
			Color color4 = accent;
			color4.a = num3 * (0.5f + 0.4f * _glitch);
			((Graphic)_countGhostB).color = color4;
			Color color5 = val;
			color5.a = num3 * 0.9f;
			((Graphic)_max).color = color5;
			Color color6 = val;
			color6.a = num3 * 0.9f * Mathf.Lerp(0.32f, 1f, num7);
			((Graphic)_platform).color = color6;
			Color color7 = Color.Lerp(val, NeonTheme.Bright, 0.15f);
			color7.a = num3 * 0.72f * Mathf.Lerp(0.32f, 1f, num7);
			((Graphic)_reserve).color = color7;
			((Graphic)_cartridge).color = color7;
			Color color8 = accent;
			color8.a = num3 * 0.88f * Mathf.Lerp(0.32f, 1f, num7);
			((Graphic)_fireMode).color = color8;
		}

		private static void ApplySweep(Color state, float alpha)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			if (!Prefs.Sweep)
			{
				_sweep.SetActive(active: false);
				return;
			}
			_sweep.SetActive(active: true);
			float num = Mathf.Lerp(0.046f, -0.046f, _sweepPhase);
			_sweep.Root.transform.localPosition = new Vector3(0f, num, -0.0066f);
			Color color = Color.Lerp(state, NeonTheme.Bright, 0.35f);
			color.a = alpha * 0.22f * Mathf.Sin(_sweepPhase * (float)Math.PI);
			_sweep.Tint(color);
		}

		private static void ApplyTear(Color accent, float alpha)
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			bool flag = _glitch > 0.12f && Prefs.Glitch > 0.05f;
			_tear.SetActive(flag);
			if (flag)
			{
				float num = 1f - _glitch;
				float num2 = Mathf.Lerp(0.046f, -0.046f, num) + (_tearSeed - 0.5f) * 0.02f;
				float num3 = 0.003f + 0.011f * _glitch;
				_tear.Place(new Vector3(0f, num2, -0.0165f), new Vector2(0.156f, num3));
				Color color = Color.Lerp(accent, NeonTheme.Bright, 0.4f);
				color.a = alpha * 0.55f * _glitch * Prefs.Glitch;
				_tear.Tint(color);
			}
		}

		private static void ApplyTicks(float dt, Color state, float alpha)
		{
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			if (!Prefs.Segments || (_current.NoMagazine && !_current.Chambered))
			{
				HideTicks();
				return;
			}
			int num = Mathf.Max(1, _current.Max);
			int num2 = Mathf.Min(num, 40);
			float num3 = (0.14f - (float)(num2 - 1) * 0.0021f) / (float)num2;
			float num4 = -0.07f + num3 * 0.5f;
			float num5 = (float)num / (float)num2;
			float num6 = (float)_current.Count / num5 * Ease.OutCubic(_reload);
			for (int i = 0; i < 40; i++)
			{
				NeonPiece neonPiece = Ticks[i];
				if (i >= num2)
				{
					neonPiece.SetActive(active: false);
					continue;
				}
				neonPiece.SetActive(active: true);
				neonPiece.Place(new Vector3(num4 + (float)i * (num3 + 0.0021f), -0.023f, -0.0052f), new Vector2(num3, 0.0092f));
				float num7 = Mathf.Clamp01(num6 - (float)i);
				if (num7 < 0.5f && TickLit[i] > 0.5f)
				{
					TickFlash[i] = 1f;
				}
				TickLit[i] = Mathf.MoveTowards(TickLit[i], num7, dt * ((num7 > TickLit[i]) ? 14f : 7f));
				TickFlash[i] = Mathf.MoveTowards(TickFlash[i], 0f, dt * 3.6f);
				Color val = Color.Lerp(state * 0.6f, state, TickLit[i]);
				val = Color.Lerp(val, NeonTheme.Bright, TickFlash[i]);
				val.a = alpha * Mathf.Lerp(0.1f, 1f, TickLit[i]) + alpha * 0.5f * TickFlash[i];
				neonPiece.Tint(val);
			}
		}

		private static void HideTicks()
		{
			for (int i = 0; i < Ticks.Count; i++)
			{
				Ticks[i].SetActive(active: false);
			}
		}

		private static void Fade(NeonPiece piece, Color color, float weight, float alpha)
		{
			//IL_0006: 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 (piece != null)
			{
				color.a = color.a * weight * alpha;
				piece.Tint(color);
			}
		}

		public static void Destroy()
		{
			for (int i = 0; i < TextMaterials.Count; i++)
			{
				if ((Object)(object)TextMaterials[i] != (Object)null)
				{
					Object.Destroy((Object)(object)TextMaterials[i]);
				}
			}
			TextMaterials.Clear();
			DestroyPiece(_shadow);
			DestroyPiece(_glow);
			DestroyPiece(_bloom);
			DestroyPiece(_sheen);
			DestroyPiece(_fill);
			DestroyPiece(_edge);
			DestroyPiece(_headerBar);
			DestroyPiece(_footBar);
			DestroyPiece(_rail);
			DestroyPiece(_sweep);
			DestroyPiece(_tear);
			for (int j = 0; j < Brackets.Count; j++)
			{
				DestroyPiece(Brackets[j]);
			}
			for (int k = 0; k < Ticks.Count; k++)
			{
				DestroyPiece(Ticks[k]);
			}
			Brackets.Clear();
			Ticks.Clear();
			if ((Object)(object)_root != (Object)null)
			{
				Object.Destroy((Object)(object)_root);
			}
			_root = null;
			_scaler = null;
			_warp = null;
			_hasSource = false;
			_wantVisible = false;
			_alive = 0f;
			_lastCount = -1;
			_lastMax = -1;
			_detail = 1f;
			_detailHold = 3.5f;
		}

		private static void DestroyPiece(NeonPiece piece)
		{
			if ((Object)(object)piece?.Material != (Object)null)
			{
				Object.Destroy((Object)(object)piece.Material);
			}
		}
	}
	internal static class NeonTextures
	{
		private const int LongSide = 256;

		private const float BorderWorld = 0.0013f;

		private const float BigChamfer = 0.13f;

		private const float SmallChamfer = 0.055f;

		private static readonly Dictionary<string, Texture2D> Cache = new Dictionary<string, Texture2D>();

		public static Texture2D Fill(Vector2 worldSize)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Panel(worldSize, "fill");
		}

		public static Texture2D Edge(Vector2 worldSize)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Panel(worldSize, "edge");
		}

		public static Texture2D Glow(Vector2 worldSize)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			return Panel(worldSize, "glow");
		}

		public static Texture2D Halo(Vector2 outerSize, Vector2 innerSize)
		{
			//IL_0000: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: 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)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(outerSize.x, outerSize.y);
			if (num <= 0.0001f)
			{
				num = 0.01f;
			}
			float num2 = 256f / num;
			int num3 = Mathf.Clamp(Mathf.RoundToInt(outerSize.x * num2), 8, 320);
			int num4 = Mathf.Clamp(Mathf.RoundToInt(outerSize.y * num2), 8, 320);
			string key = "halo_" + num3 + "x" + num4;
			if (Cache.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>((long)(num3 * num4));
			float num5 = (float)num3 * 0.5f;
			float num6 = (float)num4 * 0.5f;
			float num7 = innerSize.x * 0.5f * num2;
			float num8 = innerSize.y * 0.5f * num2;
			float num9 = Mathf.Min(num7, num8) * 2f;
			float num10 = num9 * 0.13f;
			float num11 = num9 * 0.055f;
			float num12 = Mathf.Max(4f, Mathf.Min(num5 - num7, num6 - num8) * 0.85f);
			for (int i = 0; i < num4; i++)
			{
				for (int j = 0; j < num3; j++)
				{
					float px = (float)j + 0.5f - num5;
					float py = (float)i + 0.5f - num6;
					float num13 = ChamferBox(px, py, num7, num8, num10, num11, num10, num11);
					float num14 = Mathf.Clamp01(0.5f - num13);
					float num15 = Mathf.Max(num13, 0f);
					float num16 = Mathf.Exp((0f - num15 * num15) / (num12 * num12)) * (1f - num14);
					((Il2CppArrayBase<Color32>)(object)val)[i * num3 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(Mathf.Clamp01(num16) * 255f));
				}
			}
			Texture2D val2 = Commit(val, num3, num4);
			Cache[key] = val2;
			return val2;
		}

		private static Texture2D Panel(Vector2 worldSize, string mode)
		{
			//IL_0000: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(worldSize.x, worldSize.y);
			if (num <= 0.0001f)
			{
				num = 0.01f;
			}
			float num2 = 256f / num;
			int num3 = Mathf.Clamp(Mathf.RoundToInt(worldSize.x * num2), 8, 320);
			int num4 = Mathf.Clamp(Mathf.RoundToInt(worldSize.y * num2), 8, 320);
			string key = mode + "_" + num3 + "x" + num4;
			if (Cache.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>((long)(num3 * num4));
			float num5 = (float)num3 * 0.5f;
			float num6 = (float)num4 * 0.5f;
			float num7 = Mathf.Min(num3, num4);
			float num8 = num7 * 0.13f;
			float num9 = num7 * 0.055f;
			float num10 = Mathf.Max(1.6f, 0.0013f * num2);
			float num11 = Mathf.Max(3f, num7 * 0.14f);
			for (int i = 0; i < num4; i++)
			{
				for (int j = 0; j < num3; j++)
				{
					float num12 = (float)j + 0.5f - num5;
					float py = (float)i + 0.5f - num6;
					float num13 = ChamferBox(num12, py, num5 - 0.5f, num6 - 0.5f, num8, num9, num8, num9);
					float num14 = Mathf.Clamp01(0.5f - num13);
					float num15 = Mathf.Clamp01(0.5f - (num13 + num10));
					float num16;
					if (mode == "glow")
					{
						num16 = Mathf.Exp((0f - Mathf.Max(num13, 0f)) / num11) * (1f - num14) * 0.9f;
					}
					else if (mode == "edge")
					{
						float num17 = Mathf.Clamp01(num14 - num15);
						float num18 = Mathf.Clamp01(0.5f - (num13 + num10 * 3.4f));
						float num19 = Mathf.Clamp01(num15 - num18) * 0.22f;
						float num20 = 0f;
						float num21 = num4 - 1 - i;
						if (num21 > num10 * 2f && num21 < num10 * 3.6f)
						{
							num20 = num15 * 0.85f;
						}
						float num22 = 0f;
						float num23 = Mathf.Min(j, num3 - 1 - j);
						float num24 = Mathf.Min(i, num4 - 1 - i);
						float num25 = num7 * 0.3f;
						float num26 = num7 * 0.16f;
						if (num23 > num25 && num23 < num25 + num10 * 1.2f && num24 < num26)
						{
							num22 = num15;
						}
						if (num24 > num25 * 0.55f && num24 < num25 * 0.55f + num10 * 1.2f && num23 < num26 * 0.7f)
						{
							num22 = num15;
						}
						num16 = Mathf.Max(num17, Mathf.Max(num20, Mathf.Max(num22 * 0.75f, num19)));
					}
					else
					{
						float num27 = Mathf.Lerp(0.55f, 1f, ((float)i + 0.5f) / (float)num4);
						float num28 = (((float)(i % 4) < 1.05f) ? 0.14f : 0f);
						float num29 = (((float)(j % 24) < 1.05f) ? 0.05f : 0f);
						float num30 = 1f - 0.25f * Mathf.Abs(num12) / num5;
						num16 = num15 * (num27 * num30 + num28 + num29);
					}
					((Il2CppArrayBase<Color32>)(object)val)[i * num3 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(Mathf.Clamp01(num16) * 255f));
				}
			}
			Texture2D val2 = Commit(val, num3, num4);
			Cache[key] = val2;
			return val2;
		}

		public static Texture2D Sheen(Vector2 worldSize)
		{
			//IL_0000: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(worldSize.x, worldSize.y);
			if (num <= 0.0001f)
			{
				num = 0.01f;
			}
			float num2 = 256f / num;
			int num3 = Mathf.Clamp(Mathf.RoundToInt(worldSize.x * num2), 8, 320);
			int num4 = Mathf.Clamp(Mathf.RoundToInt(worldSize.y * num2), 8, 320);
			string key = "sheen_" + num3 + "x" + num4;
			if (Cache.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>((long)(num3 * num4));
			float num5 = (float)num3 * 0.5f;
			float num6 = (float)num4 * 0.5f;
			float num7 = Mathf.Min(num3, num4);
			float num8 = num7 * 0.13f;
			float num9 = num7 * 0.055f;
			float num10 = Mathf.Max(1.6f, 0.0013f * num2);
			float num11 = num5 + num6;
			for (int i = 0; i < num4; i++)
			{
				for (int j = 0; j < num3; j++)
				{
					float num12 = (float)j + 0.5f - num5;
					float num13 = (float)i + 0.5f - num6;
					float num14 = ChamferBox(num12, num13, num5 - 0.5f, num6 - 0.5f, num8, num9, num8, num9);
					float num15 = Mathf.Clamp01(0.5f - (num14 + num10));
					float num16 = (num12 * 0.55f + num13 * 1.45f) / num11;
					float num17 = Mathf.Exp((0f - (num16 + 0.3f) * (num16 + 0.3f)) / 0.075f);
					float num18 = Mathf.Exp((0f - (num16 - 0.34f) * (num16 - 0.34f)) / 0.006f);
					float num19 = num15 * (num17 * 0.42f + num18 * 0.55f);
					((Il2CppArrayBase<Color32>)(object)val)[i * num3 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(Mathf.Clamp01(num19) * 255f));
				}
			}
			Texture2D val2 = Commit(val, num3, num4);
			Cache[key] = val2;
			return val2;
		}

		public static Texture2D Slab(Vector2 worldSize)
		{
			//IL_0000: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(worldSize.x, worldSize.y);
			if (num <= 0.0001f)
			{
				num = 0.01f;
			}
			float num2 = 160f / num;
			int num3 = Mathf.Clamp(Mathf.RoundToInt(worldSize.x * num2), 6, 224);
			int num4 = Mathf.Clamp(Mathf.RoundToInt(worldSize.y * num2), 6, 224);
			string key = "slab_" + num3 + "x" + num4;
			if (Cache.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>((long)(num3 * num4));
			float num5 = (float)num3 * 0.5f;
			float num6 = (float)num4 * 0.5f;
			float num7 = (float)Mathf.Min(num3, num4) * 0.42f;
			for (int i = 0; i < num4; i++)
			{
				for (int j = 0; j < num3; j++)
				{
					float px = (float)j + 0.5f - num5;
					float py = (float)i + 0.5f - num6;
					float num8 = ChamferBox(px, py, num5 - 0.5f, num6 - 0.5f, num7, 0f, num7, 0f);
					float num9 = Mathf.Clamp01(0.5f - num8);
					float num10 = Mathf.Lerp(0.7f, 1f, ((float)i + 0.5f) / (float)num4);
					((Il2CppArrayBase<Color32>)(object)val)[i * num3 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(Mathf.Clamp01(num9 * num10) * 255f));
				}
			}
			Texture2D val2 = Commit(val, num3, num4);
			Cache[key] = val2;
			return val2;
		}

		public static Texture2D Tick()
		{
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			if (Cache.TryGetValue("tick", out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>(2048L);
			float num = 16f;
			float num2 = 32f;
			for (int i = 0; i < 64; i++)
			{
				for (int j = 0; j < 32; j++)
				{
					float num3 = ((float)j + 0.5f - num) / num;
					float num4 = ((float)i + 0.5f - num2) / num2;
					float num5 = num3 - num4 * 0.38f;
					float num6 = Band(0.62f - Mathf.Abs(num5), 0.16f) * Band(0.92f - Mathf.Abs(num4), 0.1f);
					float num7 = Band(0.62f - Mathf.Abs(num5), 0.16f) * Band(0.14f - Mathf.Abs(Mathf.Abs(num4) - 0.84f), 0.06f);
					float num8 = Mathf.Clamp01(num6 * 0.82f + num7 * 0.6f);
					((Il2CppArrayBase<Color32>)(object)val)[i * 32 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(num8 * 255f));
				}
			}
			Texture2D val2 = Commit(val, 32, 64);
			Cache["tick"] = val2;
			return val2;
		}

		public static Texture2D Sweep()
		{
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			if (Cache.TryGetValue("sweep", out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>(8192L);
			for (int i = 0; i < 32; i++)
			{
				for (int j = 0; j < 256; j++)
				{
					float num = ((float)i + 0.5f) / 32f * 2f - 1f;
					float num2 = ((float)j + 0.5f) / 256f;
					float num3 = Mathf.Exp((0f - num) * num * 9f);
					float num4 = Band(0.1f - Mathf.Abs(num), 0.08f);
					float num5 = Mathf.Pow(Mathf.Sin(num2 * (float)Math.PI), 0.45f);
					float num6 = Mathf.Clamp01((num3 * 0.45f + num4 * 0.8f) * num5);
					((Il2CppArrayBase<Color32>)(object)val)[i * 256 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(num6 * 255f));
				}
			}
			Texture2D val2 = Commit(val, 256, 32);
			Cache["sweep"] = val2;
			return val2;
		}

		public static Texture2D Bracket()
		{
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			if (Cache.TryGetValue("bracket", out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>(4096L);
			float num = 32f;
			for (int i = 0; i < 64; i++)
			{
				for (int j = 0; j < 64; j++)
				{
					float num2 = ((float)j + 0.5f - num) / num;
					float num3 = ((float)i + 0.5f - num) / num;
					bool num4 = num2 < -0.81f && num3 > 0.38f;
					bool flag = num3 > 0.81f && num2 < -0.38f;
					float num5 = ((num4 || flag) ? 1f : 0f);
					((Il2CppArrayBase<Color32>)(object)val)[i * 64 + j] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(num5 * 255f));
				}
			}
			Texture2D val2 = Commit(val, 64, 64);
			Cache["bracket"] = val2;
			return val2;
		}

		public static Texture2D Solid()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (Cache.TryGetValue("solid", out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Il2CppStructArray<Color32> val = new Il2CppStructArray<Color32>(16L);
			for (int i = 0; i < 16; i++)
			{
				((Il2CppArrayBase<Color32>)(object)val)[i] = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue);
			}
			Texture2D val2 = Commit(val, 4, 4);
			Cache["solid"] = val2;
			return val2;
		}

		private static float ChamferBox(float px, float py, float halfW, float halfH, float topLeft, float topRight, float bottomRight, float bottomLeft)
		{
			return Mathf.Max(Mathf.Max(Mathf.Max(Mathf.Max(Mathf.Max(Mathf.Abs(px) - halfW, Mathf.Abs(py) - halfH), Plane(0f - px, py, halfW, halfH, topLeft)), Plane(px, py, halfW, halfH, topRight)), Plane(px, 0f - py, halfW, halfH, bottomRight)), Plane(0f - px, 0f - py, halfW, halfH, bottomLeft));
		}

		private static float Plane(float px, float py, float halfW, float halfH, float chamfer)
		{
			if (chamfer <= 0.0001f)
			{
				return float.NegativeInfinity;
			}
			return (px + py - (halfW + halfH - chamfer)) * 0.70710677f;
		}

		private static float Band(float value, float softness)
		{
			return Mathf.Clamp01(value / Mathf.Max(0.0001f, softness));
		}

		private static Texture2D Commit(Il2CppStructArray<Color32> pixels, int w, int h)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false)
			{
				wrapMode = (TextureWrapMode)1,
				filterMode = (FilterMode)1,
				hideFlags = (HideFlags)61
			};
			val.SetPixels32(pixels);
			val.Apply(false, false);
			return val;
		}

		public static void Clear()
		{
			foreach (KeyValuePair<string, Texture2D> item in Cache)
			{
				if ((Object)(object)item.Value != (Object)null)
				{
					Object.Destroy((Object)(object)item.Value);
				}
			}
			Cache.Clear();
		}
	}
	internal static class NeonTheme
	{
		public static readonly Color Backplate = new Color(0.012f, 0.02f, 0.032f, 0.94f);

		public static readonly Color Shadow = new Color(0f, 0.02f, 0.04f, 0.55f);

		private static readonly Color[] Primaries = (Color[])(object)new Color[5]
		{
			new Color(0f, 0.92f, 1f, 1f),
			new Color(1f, 0.18f, 0.64f, 1f),
			new Color(0.55f, 1f, 0.22f, 1f),
			new Color(0.66f, 0.38f, 1f, 1f),
			new Color(1f, 0.36f, 0.14f, 1f)
		};

		private static readonly Color[] Accents = (Color[])(object)new Color[5]
		{
			new Color(1f, 0.16f, 0.62f, 1f),
			new Color(0.25f, 0.88f, 1f, 1f),
			new Color(1f, 0.86f, 0.1f, 1f),
			new Color(1f, 0.38f, 0.8f, 1f),
			new Color(1f, 0.86f, 0.22f, 1f)
		};

		private static readonly string[] PaletteNames = new string[5] { "Cyber Cyan", "Hot Magenta", "Toxic Lime", "Synthwave", "Ember" };

		public static readonly Color Warn = new Color(1f, 0.72f, 0.1f, 1f);

		public static readonly Color Critical = new Color(1f, 0.2f, 0.18f, 1f);

		public static readonly Color Bright = new Color(0.94f, 1f, 1f, 1f);

		private static Shader _shader;

		private static TMP_FontAsset _font;

		private static float _unitsPerFontSize = -1f;

		private static readonly string[] ShaderCandidates = new string[5] { "Universal Render Pipeline/Unlit", "Unlit/Transparent", "Sprites/Default", "UI/Default", "Hidden/Internal-Colored" };

		public static Color Primary => Primaries[Mathf.Clamp(Prefs.Palette, 0, Primaries.Length - 1)];

		public static Color Accent => Accents[Mathf.Clamp(Prefs.Palette, 0, Accents.Length - 1)];

		public static int PaletteCount => PaletteNames.Length;

		public static Shader Shader
		{
			get
			{
				if ((Object)(object)_shader != (Object)null)
				{
					return _shader;
				}
				for (int i = 0; i < ShaderCandidates.Length; i++)
				{
					if (!((Object)(object)_shader == (Object)null))
					{
						break;
					}
					_shader = Shader.Find(ShaderCandidates[i]);
				}
				if ((Object)(object)_shader == (Object)null)
				{
					Melon<NeonMagMod>.Logger.Warning("No usable shader found; readout may be invisible.");
				}
				return _shader;
			}
		}

		public static TMP_FontAsset Font
		{
			get
			{
				if ((Object)(object)_font != (Object)null)
				{
					return _font;
				}
				try
				{
					_font = TMP_Settings.defaultFontAsset;
				}
				catch
				{
				}
				if ((Object)(object)_font == (Object)null)
				{
					try
					{
						Il2CppArrayBase<TMP_FontAsset> val = Resources.FindObjectsOfTypeAll<TMP_FontAsset>();
						if (val != null && val.Length > 0)
						{
							_font = val[0];
						}
					}
					catch
					{
					}
				}
				if ((Object)(object)_font == (Object)null)
				{
					Melon<NeonMagMod>.Logger.Warning("No TMP font asset found; readout labels will be blank.");
				}
				return _font;
			}
		}

		public static string PaletteName(int index)
		{
			return PaletteNames[Mathf.Clamp(index, 0, PaletteNames.Length - 1)];
		}

		public static float Severity(int count, float ratio)
		{
			return Mathf.Min(ratio, (float)count / 8f);
		}

		public static Color StateColor(float severity)
		{
			//IL_0008: 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)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			if (severity < 0.15f)
			{
				return Critical;
			}
			if (severity < 0.24f)
			{
				return Color.Lerp(Critical, Warn, Mathf.InverseLerp(0.15f, 0.24f, severity));
			}
			if (severity < 0.48f)
			{
				return Color.Lerp(Warn, Primary, Mathf.InverseLerp(0.24f, 0.48f, severity));
			}
			return Primary;
		}

		public static void Calibrate(TMP_Text probe)
		{
			//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_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			if (_unitsPerFontSize > 0f || (Object)(object)probe == (Object)null)
			{
				return;
			}
			try
			{
				float fontSize = probe.fontSize;
				probe.fontSize = 1f;
				Vector2 preferredValues = probe.GetPreferredValues("Ag");
				probe.fontSize = fontSize;
				if (preferredValues.y > 0.0001f)
				{
					_unitsPerFontSize = preferredValues.y;
				}
			}
			catch
			{
			}
		}

		public static float FontSizeFor(float worldHeight)
		{
			if (!(_unitsPerFontSize > 0f))
			{
				return worldHeight * 10f;
			}
			return worldHeight / _unitsPerFontSize;
		}

		public static Material CreateMaterial(Color color, Texture2D texture, int queue)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_0018: 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_0038: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			Material val = new Material(Shader);
			Tint(val, color);
			SetTexture(val, texture);
			val.SetFloat("_Surface", 1f);
			val.SetFloat("_Blend", 0f);
			val.SetFloat("_ZWrite", 0f);
			val.SetFloat("_Cull", 0f);
			val.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
			val.SetFloat("_ZTest", 8f);
			val.renderQueue = queue;
			return val;
		}

		public static void SetTexture(Material material, Texture2D texture)
		{
			if (!((Object)(object)material == (Object)null) && !((Object)(object)texture == (Object)null))
			{
				if (material.HasProperty("_BaseMap"))
				{
					material.SetTexture("_BaseMap", (Texture)(object)texture);
				}
				if (material.HasProperty("_MainTex"))
				{
					material.SetTexture("_MainTex", (Texture)(object)texture);
				}
			}
		}

		public static void Tint(Material material, Color color)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)material == (Object)null))
			{
				if (material.HasProperty("_BaseColor"))
				{
					material.SetColor("_BaseColor", color);
				}
				if (material.HasProperty("_Color"))
				{
					material.SetColor("_Color", color);
				}
				if (material.HasProperty("_TintColor"))
				{
					material.SetColor("_TintColor", color);
				}
			}
		}

		public static void Reset()
		{
			_shader = null;
			_font = null;
			_unitsPerFontSize = -1f;
			NeonTextures.Clear();
		}
	}
}
namespace NeonMag.Config
{
	internal static class Prefs
	{
		private static MelonPreferences_Category _category;

		private static MelonPreferences_Entry<bool> _enabled;

		private static MelonPreferences_Entry<float> _scale;

		private static MelonPreferences_Entry<float> _offsetX;

		private static MelonPreferences_Entry<float> _offsetY;

		private static MelonPreferences_Entry<float> _offsetZ;

		private static MelonPreferences_Entry<int> _palette;

		private static MelonPreferences_Entry<float> _opacity;

		private static MelonPreferences_Entry<float> _glitch;

		private static MelonPreferences_Entry<bool> _sweep;

		private static MelonPreferences_Entry<bool> _segments;

		private static MelonPreferences_Entry<bool> _reserve;

		private static MelonPreferences_Entry<bool> _fireMode;

		private static MelonPreferences_Entry<bool> _magazines;

		private static MelonPreferences_Entry<bool> _billboard;

		private static MelonPreferences_Entry<bool> _autoFade;

		public static bool Enabled
		{
			get
			{
				return _enabled?.Value ?? true;
			}
			set
			{
				if (_enabled != null)
				{
					_enabled.Value = value;
				}
			}
		}

		public static float Scale
		{
			get
			{
				return Mathf.Clamp(_scale?.Value ?? 0.62f, 0.35f, 3f);
			}
			set
			{
				if (_scale != null)
				{
					_scale.Value = value;
				}
			}
		}

		public static Vector3 Offset => new Vector3(_offsetX?.Value ?? 0.105f, _offsetY?.Value ?? 0.035f, _offsetZ?.Value ?? 0f);

		public static float OffsetX
		{
			get
			{
				return _offsetX?.Value ?? 0.105f;
			}
			set
			{
				if (_offsetX != null)
				{
					_offsetX.Value = value;
				}
			}
		}

		public static float OffsetY
		{
			get
			{
				return _offsetY?.Value ?? 0.035f;
			}
			set
			{
				if (_offsetY != null)
				{
					_offsetY.Value = value;
				}
			}
		}

		public static float OffsetZ
		{
			get
			{
				return _offsetZ?.Value ?? 0f;
			}
			set
			{
				if (_offsetZ != null)
				{
					_offsetZ.Value = value;
				}
			}
		}

		public static int Palette
		{
			get
			{
				return Mathf.Clamp(_palette?.Value ?? 0, 0, 4);
			}
			set
			{
				if (_palette != null)
				{
					_palette.Value = value;
				}
			}
		}

		public static float Opacity
		{
			get
			{
				return Mathf.Clamp(_opacity?.Value ?? 1f, 0.15f, 1f);
			}
			set
			{
				if (_opacity != null)
				{
					_opacity.Value = value;
				}
			}
		}

		public static float Glitch
		{
			get
			{
				return Mathf.Clamp01(_glitch?.Value ?? 0.75f);
			}
			set
			{
				if (_glitch != null)
				{
					_glitch.Value = value;
				}
			}
		}

		public static bool Sweep
		{
			get
			{
				return _sweep?.Value ?? true;
			}
			set
			{
				if (_sweep != null)
				{
					_sweep.Value = value;
				}
			}
		}

		public static bool Segments
		{
			get
			{
				return _segments?.Value ?? true;
			}
			set
			{
				if (_segments != null)
				{
					_segments.Value = value;
				}
			}
		}

		public static bool Reserve
		{
			get
			{
				return _reserve?.Value ?? true;
			}
			set
			{
				if (_reserve != null)
				{
					_reserve.Value = value;
				}
			}
		}

		public static bool FireMode
		{
			get
			{
				return _fireMode?.Value ?? true;
			}
			set
			{
				if (_fireMode != null)
				{
					_fireMode.Value = value;
				}
			}
		}

		public static bool Magazines
		{
			get
			{
				return _magazines?.Value ?? true;
			}
			set
			{
				if (_magazines != null)
				{
					_magazines.Value = value;
				}
			}
		}

		public static bool Billboard
		{
			get
			{
				return _billboard?.Value ?? true;
			}
			set
			{
				if (_billboard != null)
				{
					_billboard.Value = value;
				}
			}
		}

		public static bool AutoFade
		{
			get
			{
				return _autoFade?.Value ?? true;
			}
			set
			{
				if (_autoFade != null)
				{
					_autoFade.Value = value;
				}
			}
		}

		public static void Load()
		{
			_category = MelonPreferences.CreateCategory("NeonMag");
			_enabled = _category.CreateEntry<bool>("Enabled", true, "Enabled", (string)null, false, false, (ValueValidator)null, (string)null);
			_scale = _category.CreateEntry<float>("Scale", 0.62f, "Scale", (string)null, false, false, (ValueValidator)null, (string)null);
			_offsetX = _category.CreateEntry<float>("OffsetX", 0.105f, "Offset X", (string)null, false, false, (ValueValidator)null, (string)null);
			_offsetY = _category.CreateEntry<float>("OffsetY", 0.035f, "Offset Y", (string)null, false, false, (ValueValidator)null, (string)null);
			_offsetZ = _category.CreateEntry<float>("OffsetZ", 0f, "Offset Z", (string)null, false, false, (ValueValidator)null, (string)null);
			_palette = _category.CreateEntry<int>("Palette", 0, "Palette", (string)null, false, false, (ValueValidator)null, (string)null);
			_opacity = _category.CreateEntry<float>("Opacity", 1f, "Opacity", (string)null, false, false, (ValueValidator)null, (string)null);
			_glitch = _category.CreateEntry<float>("Glitch", 0.75f, "Glitch Intensity", (string)null, false, false, (ValueValidator)null, (string)null);
			_sweep = _category.CreateEntry<bool>("Sweep", true, "Scanline Sweep", (string)null, false, false, (ValueValidator)null, (string)null);
			_segments = _category.CreateEntry<bool>("Segments", true, "Round Segments", (string)null, false, false, (ValueValidator)null, (string)null);
			_reserve = _category.CreateEntry<bool>("Reserve", true, "Reserve Count", (string)null, false, false, (ValueValidator)null, (string)null);
			_fireMode = _category.CreateEntry<bool>("FireMode", true, "Fire Mode Readout", (string)null, false, false, (ValueValidator)null, (string)null);
			_magazines = _category.CreateEntry<bool>("Magazines", true, "Show On Loose Magazines", (string)null, false, false, (ValueValidator)null, (string)null);
			_billboard = _category.CreateEntry<bool>("Billboard", true, "Face Player", (string)null, false, false, (ValueValidator)null, (string)null);
			_autoFade = _category.CreateEntry<bool>("AutoFade", true, "Fade Detail When Idle", (string)null, false, false, (ValueValidator)null, (string)null);
		}

		public static void Save()
		{
			try
			{
				MelonPreferences_Category category = _category;
				if (category != null)
				{
					category.SaveToFile(false);
				}
			}
			catch
			{
			}
		}
	}
}
namespace NeonMag.Ammo
{
	internal static class AmmoReader
	{
		private static readonly GameObject[] CachedHeld = (GameObject[])(object)new GameObject[2];

		private static readonly Gun[] CachedGun = (Gun[])(object)new Gun[2];

		private static readonly Magazine[] CachedMagazine = (Magazine[])(object)new Magazine[2];

		public static bool TryResolve(out AmmoSnapshot snapshot)
		{
			snapshot = default(AmmoSnapshot);
			try
			{
				if (!Player.HandsExist)
				{
					return false;
				}
				if (TryHand(Player.RightHand, 0, ref snapshot))
				{
					return true;
				}
				if (TryHand(Player.LeftHand, 1, ref snapshot))
				{
					return true;
				}
			}
			catch
			{
			}
			return false;
		}

		public static void Forget()
		{
			for (int i = 0; i < CachedHeld.Length; i++)
			{
				CachedHeld[i] = null;
				CachedGun[i] = null;
				CachedMagazine[i] = null;
			}
		}

		private static bool TryHand(Hand hand, int slot, ref AmmoSnapshot snapshot)
		{
			if ((Object)(object)hand == (Object)null)
			{
				return false;
			}
			GameObject val = null;
			try
			{
				val = Player.GetObjectInHand(hand);
			}
			catch
			{
			}
			if ((Object)(object)val == (Object)null)
			{
				CachedHeld[slot] = null;
				CachedGun[slot] = null;
				CachedMagazine[slot] = null;
				return false;
			}
			if (val != CachedHeld[slot])
			{
				CachedHeld[slot] = val;
				CachedGun[slot] = Locate<Gun>(val);
				CachedMagazine[slot] = (((Object)(object)CachedGun[slot] != (Object)null) ? null : Locate<Magazine>(val));
			}
			Gun val2 = CachedGun[slot];
			if ((Object)(object)val2 != (Object)null)
			{
				return FromGun(val2, ref snapshot);
			}
			if (!Prefs.Magazines)
			{
				return false;
			}
			Magazine val3 = CachedMagazine[slot];
			if ((Object)(object)val3 != (Object)null)
			{
				return FromMagazine(val3, ref snapshot);
			}
			return false;
		}

		private static T Locate<T>(GameObject root) where T : Component
		{
			T val = default(T);
			try
			{
				val = root.GetComponentInParent<T>();
			}
			catch
			{
			}
			if ((Object)(object)val != (Object)null)
			{
				return val;
			}
			try
			{
				val = root.GetComponentInChildren<T>();
			}
			catch
			{
			}
			return val;
		}

		private static bool FromGun(Gun gun, ref AmmoSnapshot snapshot)
		{
			//IL_0184: 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)
			snapshot.Kind = ReadoutKind.Gun;
			snapshot.Anchor = Anchor(gun);
			AmmoSocket val = null;
			try
			{
				val = gun.ammoSocket;
			}
			catch
			{
			}
			bool flag = false;
			try
			{
				flag = (Object)(object)val != (Object)null && val.HasMagazine;
			}
			catch
			{
			}
			MagazineData val2 = null;
			try
			{
				val2 = gun.internalMagazine;
			}
			catch
			{
			}
			MagazineState val3 = null;
			try
			{
				val3 = gun.MagazineState;
			}
			catch
			{
			}
			if (val3 == null)
			{
				try
				{
					val3 = gun._magState;
				}
				catch
				{
				}
			}
			snapshot.NoMagazine = !flag && (Object)(object)val2 == (Object)null;
			CartridgeData val4 = null;
			MagazineData val5 = null;
			int num = 0;
			if (val3 != null)
			{
				try
				{
					num = Mathf.Max(0, val3.AmmoCount);
				}
				catch
				{
				}
				try
				{
					val4 = val3.cartridgeData;
				}
				catch
				{
				}
				try
				{
					val5 = val3.magazineData;
				}
				catch
				{
				}
			}
			if (snapshot.NoMagazine)
			{
				num = 0;
			}
			CartridgeData val6 = null;
			try
			{
				val6 = gun.chamberedCartridge;
			}
			catch
			{
			}
			snapshot.Chambered = (Object)(object)val6 != (Object)null;
			snapshot.InMagazine = num;
			snapshot.Count = num + (snapshot.Chambered ? 1 : 0);
			if ((Object)(object)val4 == (Object)null)
			{
				val4 = val6;
			}
			if ((Object)(object)val5 == (Object)null)
			{
				val5 = val2;
			}
			if ((Object)(object)val5 == (Object)null)
			{
				try
				{
					val5 = gun.defaultMagazine;
				}
				catch
				{
				}
			}
			snapshot.Max = Rounds(val5, snapshot.Count);
			if ((Object)(object)val4 == (Object)null)
			{
				try
				{
					val4 = gun.defaultCartridge;
				}
				catch
				{
				}
			}
			snapshot.Platform = Platform(val5, val);
			snapshot.Cartridge = CartridgeName(val4);
			snapshot.Reserve = Reserve(val4);
			if (Prefs.FireMode)
			{
				try
				{
					snapshot.FireMode = ShortMode(((object)gun.fireMode/*cast due to .constrained prefix*/).ToString());
				}
				catch
				{
				}
			}
			return true;
		}

		private static bool FromMagazine(Magazine magazine, ref AmmoSnapshot snapshot)
		{
			bool flag = false;
			try
			{
				flag = magazine.isMagazineInserted;
			}
			catch
			{
			}
			if (flag)
			{
				return false;
			}
			MagazineState val = null;
			try
			{
				val = magazine.magazineState;
			}
			catch
			{
			}
			if (val == null)
			{
				return false;
			}
			snapshot.Kind = ReadoutKind.Magazine;
			try
			{
				snapshot.Anchor = ((Component)magazine).transform;
			}
			catch
			{
			}
			if ((Object)(object)snapshot.Anchor == (Object)null)
			{
				return false;
			}
			try
			{
				snapshot.Count = Mathf.Max(0, val.AmmoCount);
			}
			catch
			{
			}
			snapshot.InMagazine = snapshot.Count;
			MagazineData data = null;
			try
			{
				data = val.magazineData;
			}
			catch
			{
			}
			CartridgeData cartridge = null;
			try
			{
				cartridge = val.cartridgeData;
			}
			catch
			{
			}
			snapshot.Max = Rounds(data, snapshot.Count);
			snapshot.Platform = Platform(data, null);
			snapshot.Cartridge = CartridgeName(cartridge);
			snapshot.Reserve = Reserve(cartridge);
			snapshot.FireMode = "MAG";
			return true;
		}

		private static Transform Anchor(Gun gun)
		{
			try
			{
				AmmoSocket ammoSocket = gun.ammoSocket;
				if ((Object)(object)ammoSocket != (Object)null && (Object)(object)((Component)ammoSocket).transform != (Object)null)
				{
					return ((Component)ammoSocket).transform;
				}
			}
			catch
			{
			}
			try
			{
				return ((Component)gun).transform;
			}
			catch
			{
			}
			return null;
		}

		private static int Rounds(MagazineData data, int fallback)
		{
			int num = 0;
			if ((Object)(object)data != (Object)null)
			{
				try
				{
					num = data.rounds;
				}
				catch
				{
				}
			}
			if (num > 0)
			{
				return Mathf.Min(num, 999);
			}
			return Mathf.Max(1, fallback);
		}

		private static string Platform(MagazineData data, AmmoSocket socket)
		{
			string value = null;
			if ((Object)(object)data != (Object)null)
			{
				try
				{
					value = data.platform;
				}
				catch
				{
				}
			}
			if (string.IsNullOrEmpty(value) && (Object)(object)socket != (Object)null)
			{
				try
				{
					value = socket.platform;
				}
				catch
				{
				}
			}
			return Clean(value, "STANDARD");
		}

		private static string CartridgeName(CartridgeData cartridge)
		{
			if ((Object)(object)cartridge == (Object)null)
			{
				return string.Empty;
			}
			string value = null;
			try
			{
				value = cartridge.Name;
			}
			catch
			{
			}
			if (string.IsNullOrEmpty(value))
			{
				try
				{
					value = cartridge._name;
				}
				catch
				{
				}
			}
			return Clean(value, string.Empty);
		}

		private static int Reserve(CartridgeData cartridge)
		{
			if ((Object)(object)cartridge == (Object)null || !Prefs.Reserve)
			{
				return -1;
			}
			try
			{
				AmmoInventory instance = AmmoInventory.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					return -1;
				}
				return Mathf.Max(0, instance.GetCartridgeCount(cartridge));
			}
			catch
			{
			}
			return -1;
		}

		private static string ShortMode(string mode)
		{
			if (string.IsNullOrEmpty(mode))
			{
				return string.Empty;
			}
			mode = mode.ToUpperInvariant();
			if (mode.StartsWith("SEMI"))
			{
				return "SEMI";
			}
			if (mode.StartsWith("BURST") || mode.Contains("BURST"))
			{
				return "BURST";
			}
			if (mode.StartsWith("AUTO") || mode.Contains("AUTOMATIC"))
			{
				return "AUTO";
			}
			if (mode.StartsWith("BOLT"))
			{
				return "BOLT";
			}
			if (mode.StartsWith("PUMP"))
			{
				return "PUMP";
			}
			if (mode.StartsWith("SINGLE"))
			{
				return "SINGLE";
			}
			if (mode.Length <= 6)
			{
				return mode;
			}
			return mode.Substring(0, 6);
		}

		private static string Clean(string value, string fallback)
		{
			if (string.IsNullOrEmpty(value))
			{
				return fallback;
			}
			value = value.Trim().ToUpperInvariant();
			if (value.Length > 14)
			{
				value = value.Substring(0, 14);
			}
			return value;
		}
	}
	internal enum ReadoutKind
	{
		None,
		Gun,
		Magazine
	}
	internal struct AmmoSnapshot
	{
		public ReadoutKind Kind;

		public Transform Anchor;

		public int Count;

		public int InMagazine;

		public int Max;

		public int Reserve;

		public bool Chambered;

		public bool NoMagazine;

		public string Platform;

		public string Cartridge;

		public string FireMode;

		public float Ratio
		{
			get
			{
				if (Max <= 0)
				{
					return 0f;
				}
				return Mathf.Clamp01((float)Count / (float)Max);
			}
		}

		public bool SameSource(AmmoSnapshot other)
		{
			if (Kind == other.Kind)
			{
				return Anchor == other.Anchor;
			}
			return false;
		}
	}
}