Decompiled source of Accessibility v0.2.1

Pix.Accessibility.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace Pix.Accessibility;

[BepInPlugin("Pix.Accessibility", "Accessibility", "0.2.1")]
public sealed class AccessibilityPlugin : BaseUnityPlugin
{
	internal enum ThreatKind
	{
		Radar,
		Aggro,
		Attack,
		Damage
	}

	private enum ColorblindMode
	{
		Off,
		Deuteranopia,
		Protanopia,
		Tritanopia
	}

	[HarmonyPatch(typeof(Character), "Damage")]
	private static class Patch_Character_Damage
	{
		private static void Postfix(Character __instance, HitData hit)
		{
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: 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_011d: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: 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_013f: 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_01c2: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (CfgEnabled == null || !CfgEnabled.Value || CfgSrcDamageDirection == null || !CfgSrcDamageDirection.Value)
				{
					return;
				}
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer == (Object)null || __instance != localPlayer || hit == null)
				{
					return;
				}
				Character val = null;
				try
				{
					val = hit.GetAttacker();
				}
				catch
				{
				}
				string text = "";
				float num = 0f;
				Vector3 val2;
				if ((Object)(object)val != (Object)null)
				{
					val2 = ((Component)val).transform.position;
					text = SafePrefabName(((Component)val).gameObject);
					num = Vector3.Distance(((Component)localPlayer).transform.position, val2);
					_hud?.TryRegisterIconSource(val, text);
				}
				else
				{
					Vector3 val3 = hit.m_dir;
					if (((Vector3)(ref val3)).sqrMagnitude < 0.0001f)
					{
						val3 = -((Component)localPlayer).transform.forward;
					}
					val3.y = 0f;
					if (((Vector3)(ref val3)).sqrMagnitude < 0.0001f)
					{
						val3 = Vector3.back;
					}
					((Vector3)(ref val3)).Normalize();
					val2 = ((Component)localPlayer).transform.position - val3 * 6f;
					text = "Unknown";
					num = 6f;
				}
				float num2 = 0f;
				try
				{
					num2 = hit.GetTotalDamage();
				}
				catch
				{
					try
					{
						num2 = ((DamageTypes)(ref hit.m_damage)).GetTotalDamage();
					}
					catch
					{
					}
				}
				int severity = ((num2 >= 35f) ? 3 : ((!(num2 >= 12f)) ? 1 : 2));
				PushThreat(val2, severity, ThreatKind.Damage, text, num);
			}
			catch
			{
			}
		}
	}

	[HarmonyPatch(typeof(MonsterAI), "SetTarget")]
	private static class Patch_MonsterAI_SetTarget
	{
		private static void Postfix(MonsterAI __instance, Character attacker)
		{
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: 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)
			try
			{
				if (CfgEnabled == null || !CfgEnabled.Value || CfgSrcAggroTargeting == null || !CfgSrcAggroTargeting.Value)
				{
					return;
				}
				Player localPlayer = Player.m_localPlayer;
				if ((Object)(object)localPlayer == (Object)null || (Object)(object)attacker == (Object)null || attacker != localPlayer)
				{
					return;
				}
				Character val = (((Object)(object)__instance != (Object)null) ? ((Component)__instance).GetComponent<Character>() : null);
				if (!((Object)(object)val == (Object)null) && !val.IsDead())
				{
					string text = SafePrefabName(((Component)val).gameObject);
					float distance = Vector3.Distance(((Component)localPlayer).transform.position, ((Component)val).transform.position);
					_hud?.TryRegisterIconSource(val, text);
					int severity = 2;
					if (CfgRadarBoostDangerousMobs != null && CfgRadarBoostDangerousMobs.Value && IsDangerousPrefab(text))
					{
						severity = 3;
					}
					PushThreat(((Component)val).transform.position, severity, ThreatKind.Aggro, text, distance);
				}
			}
			catch
			{
			}
		}
	}

	internal sealed class AccessibilityHud : MonoBehaviour
	{
		private struct Callout
		{
			public string Text;

			public float Until;

			public int Severity;
		}

		private struct ThreatSignal
		{
			public Vector3 WorldPos;

			public float Born;

			public int Severity;

			public ThreatKind Kind;

			public string Prefab;

			public float Distance;
		}

		private struct SpriteIcon
		{
			public Texture2D Texture;

			public Rect UV;

			public bool IsValid;
		}

		[CompilerGenerated]
		private sealed class <CoLoadFileIconDictionary>d__83 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public string dictPath;

			public AccessibilityHud <>4__this;

			private string[] <files>5__1;

			private int <i>5__2;

			private string <file>5__3;

			private string <key>5__4;

			private string <url>5__5;

			private UnityWebRequest <req>5__6;

			private UnityWebRequestAsyncOperation <op>5__7;

			private bool <ok>5__8;

			private Texture2D <tex>5__9;

			private SpriteIcon <si>5__10;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <CoLoadFileIconDictionary>d__83(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<files>5__1 = null;
				<file>5__3 = null;
				<key>5__4 = null;
				<url>5__5 = null;
				<req>5__6 = null;
				<op>5__7 = null;
				<tex>5__9 = null;
				<si>5__10 = default(SpriteIcon);
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0333: Unknown result type (might be due to invalid IL or missing references)
				//IL_0338: 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_0243: Invalid comparison between Unknown and I4
				try
				{
					int num;
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>4__this._fileSpriteIconsByPrefab.Clear();
						<>4__this._fileIconTexByPrefab.Clear();
						<files>5__1 = null;
						try
						{
							<files>5__1 = Directory.GetFiles(dictPath, "*.png", SearchOption.TopDirectoryOnly);
						}
						catch
						{
							<files>5__1 = null;
						}
						if (<files>5__1 == null || <files>5__1.Length == 0)
						{
							<>4__this._fileIconsLoaded = true;
							<>4__this._fileIconsLoading = false;
							return false;
						}
						<i>5__2 = 0;
						goto IL_03ef;
					case 1:
						<>1__state = -3;
						goto IL_021a;
					case 2:
						{
							<>1__state = -1;
							goto IL_03c0;
						}
						IL_021a:
						if (!((AsyncOperation)<op>5__7).isDone)
						{
							<>2__current = null;
							<>1__state = 1;
							return true;
						}
						<ok>5__8 = false;
						try
						{
							<ok>5__8 = (int)<req>5__6.result == 1;
						}
						catch
						{
							<ok>5__8 = string.IsNullOrEmpty(<req>5__6.error);
						}
						if (<ok>5__8)
						{
							<tex>5__9 = null;
							try
							{
								<tex>5__9 = DownloadHandlerTexture.GetContent(<req>5__6);
							}
							catch
							{
								<tex>5__9 = null;
							}
							if (!((Object)(object)<tex>5__9 == (Object)null))
							{
								try
								{
									((Texture)<tex>5__9).filterMode = (FilterMode)1;
									((Texture)<tex>5__9).wrapMode = (TextureWrapMode)1;
								}
								catch
								{
								}
								<>4__this._fileIconTexByPrefab[<key>5__4] = <tex>5__9;
								<si>5__10 = default(SpriteIcon);
								<si>5__10.Texture = <tex>5__9;
								<si>5__10.UV = new Rect(0f, 0f, 1f, 1f);
								<si>5__10.IsValid = true;
								<>4__this._fileSpriteIconsByPrefab[<key>5__4] = <si>5__10;
								<op>5__7 = null;
								<tex>5__9 = null;
								<si>5__10 = default(SpriteIcon);
								<>m__Finally1();
								if (<i>5__2 % 8 == 7)
								{
									<>2__current = null;
									<>1__state = 2;
									return true;
								}
								goto IL_03c0;
							}
						}
						<>m__Finally1();
						goto IL_03dd;
						IL_03c0:
						<file>5__3 = null;
						<key>5__4 = null;
						<url>5__5 = null;
						<req>5__6 = null;
						goto IL_03dd;
						IL_03ef:
						if (<i>5__2 < <files>5__1.Length)
						{
							<file>5__3 = <files>5__1[<i>5__2];
							if (!string.IsNullOrEmpty(<file>5__3))
							{
								<key>5__4 = null;
								try
								{
									<key>5__4 = Path.GetFileNameWithoutExtension(<file>5__3);
								}
								catch
								{
									<key>5__4 = null;
								}
								if (!string.IsNullOrEmpty(<key>5__4) && !<>4__this._fileIconTexByPrefab.ContainsKey(<key>5__4))
								{
									<url>5__5 = null;
									try
									{
										<url>5__5 = "file:///" + <file>5__3.Replace("\\", "/");
									}
									catch
									{
										<url>5__5 = null;
									}
									if (!string.IsNullOrEmpty(<url>5__5))
									{
										<req>5__6 = null;
										try
										{
											<req>5__6 = UnityWebRequestTexture.GetTexture(<url>5__5, true);
										}
										catch
										{
											<req>5__6 = null;
										}
										if (<req>5__6 != null)
										{
											<>1__state = -3;
											<op>5__7 = <req>5__6.SendWebRequest();
											goto IL_021a;
										}
									}
								}
							}
							goto IL_03dd;
						}
						<>4__this._fileIconsLoaded = true;
						<>4__this._fileIconsLoading = false;
						try
						{
							ManualLogSource log = Log;
							if (log != null)
							{
								log.LogInfo((object)("[Accessibility] Loaded Dictionary icons: " + <>4__this._fileSpriteIconsByPrefab.Count));
							}
						}
						catch
						{
						}
						return false;
						IL_03dd:
						num = <i>5__2 + 1;
						<i>5__2 = num;
						goto IL_03ef;
					}
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				try
				{
					<req>5__6.Dispose();
				}
				catch
				{
				}
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private readonly List<Callout> _callouts = new List<Callout>(16);

		private readonly List<ThreatSignal> _signals = new List<ThreatSignal>(96);

		private float _lastSignalTime;

		private GUIStyle _calloutStyle;

		private Texture2D _bgTex;

		private Texture2D _bgTexStrong;

		private GUIStyle _iconLabelStyle;

		private GUIStyle _iconLabelStyleHC;

		private Texture2D _iconLabelBgTex;

		private Texture2D _shapeCircle;

		private Texture2D _shapeTriangle;

		private Texture2D _shapeDiamond;

		private Texture2D _shapeX;

		private Texture2D _whiteTex;

		private static Material _glMat;

		private Texture2D _blackTex;

		private static float[] _segIntensity;

		private static Color[] _segColor;

		private static int[] _segPriority;

		private float _nextRadarScan;

		private float _ringAutoAlpha;

		private readonly Dictionary<int, float> _radarLastPingById = new Dictionary<int, float>(256);

		private readonly Collider[] _radarHitsBuffer = (Collider[])(object)new Collider[256];

		private bool _suspended;

		private bool _wasDead;

		private readonly Dictionary<string, SpriteIcon> _spriteIconsByPrefab = new Dictionary<string, SpriteIcon>(64);

		private readonly Dictionary<string, Texture2D> _iconTexByPrefab = new Dictionary<string, Texture2D>(64);

		private bool _fileIconsLoaded;

		private bool _fileIconsLoading;

		private readonly Dictionary<string, Texture2D> _fileIconTexByPrefab = new Dictionary<string, Texture2D>(128, StringComparer.OrdinalIgnoreCase);

		private readonly Dictionary<string, SpriteIcon> _fileSpriteIconsByPrefab = new Dictionary<string, SpriteIcon>(128, StringComparer.OrdinalIgnoreCase);

		private readonly Dictionary<string, float> _soundLastByPrefab = new Dictionary<string, float>(128);

		private readonly HashSet<string> _loggedNoIconForPrefab = new HashSet<string>(128);

		private readonly HashSet<string> _loggedPortraitFailForPrefab = new HashSet<string>(128);

		private readonly Dictionary<string, RenderTexture> _portraitRtByPrefab = new Dictionary<string, RenderTexture>(32);

		private readonly Dictionary<string, GameObject> _portraitCloneByPrefab = new Dictionary<string, GameObject>(32, StringComparer.Ordinal);

		private readonly Dictionary<string, float> _iconBuiltAtByPrefab = new Dictionary<string, float>(StringComparer.Ordinal);

		private static FieldInfo[] _spriteFields_Character;

		private static FieldInfo[] _spriteFields_BaseAI;

		private static PropertyInfo[] _spriteProps_Character;

		private static PropertyInfo[] _spriteProps_BaseAI;

		private static MethodInfo[] _spriteMethods_Character;

		private static MethodInfo[] _spriteMethods_BaseAI;

		private static bool _spriteFieldScanDone;

		private GameObject _iconRigRoot;

		private Camera _iconCam;

		private Light _iconLight;

		private void Awake()
		{
			//IL_0018: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			_bgTex = MakeTex(2, 2, new Color(0f, 0f, 0f, 0.45f));
			_bgTexStrong = MakeTex(2, 2, new Color(0f, 0f, 0f, 0.7f));
			_whiteTex = MakeTex(1, 1, Color.white);
			_blackTex = MakeTex(1, 1, new Color(0f, 0f, 0f, 1f));
			_iconLabelBgTex = MakeTex(2, 2, new Color(0f, 0f, 0f, 0.7f));
			_shapeCircle = BuildShapeCircle(32, 32);
			_shapeTriangle = BuildShapeTriangle(32, 32);
			_shapeDiamond = BuildShapeDiamond(32, 32);
			_shapeX = BuildShapeX(32, 32);
			LoadFileIconDictionary();
		}

		private void OnDestroy()
		{
			try
			{
				if ((Object)(object)_bgTex != (Object)null)
				{
					Object.Destroy((Object)(object)_bgTex);
				}
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)_bgTexStrong != (Object)null)
				{
					Object.Destroy((Object)(object)_bgTexStrong);
				}
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)_whiteTex != (Object)null)
				{
					Object.Destroy((Object)(object)_whiteTex);
				}
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)_blackTex != (Object)null)
				{
					Object.Destroy((Object)(object)_blackTex);
				}
			}
			catch
			{
			}
			foreach (KeyValuePair<string, Texture2D> item in _iconTexByPrefab)
			{
				try
				{
					if ((Object)(object)item.Value != (Object)null)
					{
						Object.Destroy((Object)(object)item.Value);
					}
				}
				catch
				{
				}
			}
			_iconTexByPrefab.Clear();
			foreach (KeyValuePair<string, Texture2D> item2 in _fileIconTexByPrefab)
			{
				try
				{
					if ((Object)(object)item2.Value != (Object)null)
					{
						Object.Destroy((Object)(object)item2.Value);
					}
				}
				catch
				{
				}
			}
			_fileIconTexByPrefab.Clear();
			_fileSpriteIconsByPrefab.Clear();
			foreach (KeyValuePair<string, RenderTexture> item3 in _portraitRtByPrefab)
			{
				try
				{
					if ((Object)(object)item3.Value != (Object)null)
					{
						item3.Value.Release();
					}
				}
				catch
				{
				}
			}
			_portraitRtByPrefab.Clear();
			try
			{
				if ((Object)(object)_iconCam != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)_iconCam).gameObject);
				}
			}
			catch
			{
			}
			try
			{
				if ((Object)(object)_iconRigRoot != (Object)null)
				{
					Object.Destroy((Object)(object)_iconRigRoot);
				}
			}
			catch
			{
			}
		}

		internal void PushCallout(string text, int severity)
		{
			float unscaledTime = Time.unscaledTime;
			for (int i = 0; i < _callouts.Count; i++)
			{
				if (_callouts[i].Text == text)
				{
					Callout value = _callouts[i];
					value.Until = Mathf.Max(value.Until, unscaledTime + Mathf.Max(0.5f, CfgCalloutSeconds.Value * 0.75f));
					value.Severity = Mathf.Max(value.Severity, severity);
					_callouts[i] = value;
					return;
				}
			}
			_callouts.Add(new Callout
			{
				Text = text,
				Severity = Mathf.Clamp(severity, 1, 3),
				Until = unscaledTime + Mathf.Max(0.5f, CfgCalloutSeconds.Value)
			});
			int num = Mathf.Clamp(CfgMaxQueue.Value, 1, 20);
			while (_callouts.Count > num)
			{
				_callouts.RemoveAt(0);
			}
		}

		internal void PushThreat(Vector3 worldPos, int severity, ThreatKind kind, string prefabName, float distance)
		{
			//IL_0017: 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)
			float unscaledTime = Time.unscaledTime;
			_signals.Add(new ThreatSignal
			{
				WorldPos = worldPos,
				Born = unscaledTime,
				Severity = Mathf.Clamp(severity, 1, 3),
				Kind = kind,
				Prefab = (prefabName ?? ""),
				Distance = Mathf.Max(0f, distance)
			});
			if (_signals.Count > 96)
			{
				_signals.RemoveRange(0, _signals.Count - 96);
			}
			_lastSignalTime = unscaledTime;
		}

		internal bool TrySoundCooldown(string prefab, float cd)
		{
			if (string.IsNullOrEmpty(prefab))
			{
				return false;
			}
			float unscaledTime = Time.unscaledTime;
			if (_soundLastByPrefab.TryGetValue(prefab, out var value) && unscaledTime - value < cd)
			{
				return false;
			}
			_soundLastByPrefab[prefab] = unscaledTime;
			if (_soundLastByPrefab.Count > 2048)
			{
				_soundLastByPrefab.Clear();
			}
			return true;
		}

		internal void TryRegisterIconSource(Character ch, string prefabName)
		{
			if ((Object)(object)ch == (Object)null || string.IsNullOrEmpty(prefabName) || CfgIconsEnabled == null || !CfgIconsEnabled.Value || _spriteIconsByPrefab.ContainsKey(prefabName))
			{
				return;
			}
			if (CfgIconUseSprite != null && CfgIconUseSprite.Value && TryExtractSpriteIcon(ch, prefabName, out var icon) && icon.IsValid)
			{
				_spriteIconsByPrefab[prefabName] = icon;
				if (CfgIconCutoutEnabled == null || !CfgIconCutoutEnabled.Value)
				{
					return;
				}
				try
				{
					Texture2D val = BuildCutoutFromSpriteIcon(icon);
					if ((Object)(object)val != (Object)null)
					{
						_iconTexByPrefab[prefabName] = val;
					}
					return;
				}
				catch
				{
					return;
				}
			}
			if (!_loggedNoIconForPrefab.Contains(prefabName))
			{
				_loggedNoIconForPrefab.Add(prefabName);
				ManualLogSource log = Log;
				if (log != null)
				{
					log.LogInfo((object)("[Accessibility] No sprite icon found for prefab: " + prefabName + " (will draw without icon unless portrait fallback is enabled)"));
				}
			}
		}

		private static void EnsureSpriteFieldScan()
		{
			if (_spriteFieldScanDone)
			{
				return;
			}
			_spriteFieldScanDone = true;
			string[] candidates = new string[7] { "m_minimapIcon", "m_mapIcon", "m_icon", "m_hudIcon", "m_portrait", "m_statusIcon", "m_alertIcon" };
			string[] candidates2 = new string[7] { "MinimapIcon", "MapIcon", "Icon", "HudIcon", "Portrait", "StatusIcon", "AlertIcon" };
			string[] candidates3 = new string[7] { "GetMinimapIcon", "GetMapIcon", "GetIcon", "GetHudIcon", "GetPortrait", "GetStatusIcon", "GetAlertIcon" };
			_spriteFields_Character = CollectSpriteFields(typeof(Character), candidates);
			_spriteFields_BaseAI = CollectSpriteFields(typeof(BaseAI), candidates);
			_spriteProps_Character = CollectSpriteProps(typeof(Character), candidates2);
			_spriteProps_BaseAI = CollectSpriteProps(typeof(BaseAI), candidates2);
			_spriteMethods_Character = CollectSpriteMethods(typeof(Character), candidates3);
			_spriteMethods_BaseAI = CollectSpriteMethods(typeof(BaseAI), candidates3);
			if ((_spriteFields_Character != null && _spriteFields_Character.Length != 0) || (_spriteFields_BaseAI != null && _spriteFields_BaseAI.Length != 0) || (_spriteProps_Character != null && _spriteProps_Character.Length != 0) || (_spriteProps_BaseAI != null && _spriteProps_BaseAI.Length != 0) || (_spriteMethods_Character != null && _spriteMethods_Character.Length != 0) || (_spriteMethods_BaseAI != null && _spriteMethods_BaseAI.Length != 0))
			{
				ManualLogSource log = Log;
				if (log != null)
				{
					log.LogInfo((object)("[Accessibility] Icon member scan: Character fields=" + ((_spriteFields_Character != null) ? _spriteFields_Character.Length : 0) + ", props=" + ((_spriteProps_Character != null) ? _spriteProps_Character.Length : 0) + ", methods=" + ((_spriteMethods_Character != null) ? _spriteMethods_Character.Length : 0) + " | BaseAI fields=" + ((_spriteFields_BaseAI != null) ? _spriteFields_BaseAI.Length : 0) + ", props=" + ((_spriteProps_BaseAI != null) ? _spriteProps_BaseAI.Length : 0) + ", methods=" + ((_spriteMethods_BaseAI != null) ? _spriteMethods_BaseAI.Length : 0)));
				}
			}
			else
			{
				ManualLogSource log2 = Log;
				if (log2 != null)
				{
					log2.LogInfo((object)"[Accessibility] No Sprite fields/properties/methods discovered on Character/BaseAI (this build may not expose sprite icons via members).");
				}
			}
		}

		private static FieldInfo[] CollectSpriteFields(Type t, string[] candidates)
		{
			List<FieldInfo> list = new List<FieldInfo>(8);
			for (int i = 0; i < candidates.Length; i++)
			{
				try
				{
					FieldInfo field = t.GetField(candidates[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
					if (field != null && typeof(Sprite).IsAssignableFrom(field.FieldType))
					{
						list.Add(field);
					}
				}
				catch
				{
				}
			}
			return (list.Count > 0) ? list.ToArray() : new FieldInfo[0];
		}

		private static PropertyInfo[] CollectSpriteProps(Type t, string[] candidates)
		{
			List<PropertyInfo> list = new List<PropertyInfo>(8);
			for (int i = 0; i < candidates.Length; i++)
			{
				try
				{
					PropertyInfo property = t.GetProperty(candidates[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
					if (!(property == null) && typeof(Sprite).IsAssignableFrom(property.PropertyType) && (property.GetIndexParameters() == null || property.GetIndexParameters().Length == 0))
					{
						MethodInfo getMethod = property.GetGetMethod(nonPublic: true);
						if (getMethod != null && getMethod.GetParameters().Length == 0)
						{
							list.Add(property);
						}
					}
				}
				catch
				{
				}
			}
			return (list.Count > 0) ? list.ToArray() : new PropertyInfo[0];
		}

		private static MethodInfo[] CollectSpriteMethods(Type t, string[] candidates)
		{
			List<MethodInfo> list = new List<MethodInfo>(8);
			for (int i = 0; i < candidates.Length; i++)
			{
				try
				{
					MethodInfo method = t.GetMethod(candidates[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy, null, Type.EmptyTypes, null);
					if (!(method == null) && typeof(Sprite).IsAssignableFrom(method.ReturnType) && method.GetParameters().Length == 0)
					{
						list.Add(method);
					}
				}
				catch
				{
				}
			}
			return (list.Count > 0) ? list.ToArray() : new MethodInfo[0];
		}

		private static bool TryExtractSpriteIcon(Character ch, string prefabName, out SpriteIcon icon)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected O, but got Unknown
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			icon = default(SpriteIcon);
			EnsureSpriteFieldScan();
			if ((Object)ch == (Object)null)
			{
				return false;
			}
			string pn = NormalizeIconName(prefabName);
			int bestScore = int.MinValue;
			SpriteIcon best = default(SpriteIcon);
			if (_spriteFields_Character != null && _spriteFields_Character.Length != 0)
			{
				for (int i = 0; i < _spriteFields_Character.Length; i++)
				{
					FieldInfo fieldInfo = _spriteFields_Character[i];
					if (!(fieldInfo == null))
					{
						Sprite val = null;
						try
						{
							object? value = fieldInfo.GetValue(ch);
							val = (Sprite)((value is Sprite) ? value : null);
						}
						catch
						{
							val = null;
						}
						Consider(val);
					}
				}
			}
			if (_spriteFields_BaseAI != null && _spriteFields_BaseAI.Length != 0)
			{
				BaseAI val2 = null;
				try
				{
					val2 = ((Component)ch).GetComponent<BaseAI>();
				}
				catch
				{
					val2 = null;
				}
				if ((Object)val2 != (Object)null)
				{
					for (int j = 0; j < _spriteFields_BaseAI.Length; j++)
					{
						FieldInfo fieldInfo2 = _spriteFields_BaseAI[j];
						if (!(fieldInfo2 == null))
						{
							Sprite val3 = null;
							try
							{
								object? value2 = fieldInfo2.GetValue(val2);
								val3 = (Sprite)((value2 is Sprite) ? value2 : null);
							}
							catch
							{
								val3 = null;
							}
							Consider(val3);
						}
					}
				}
			}
			if (bestScore == int.MinValue)
			{
				return false;
			}
			icon = best;
			return true;
			void Consider(Sprite sp)
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Expected O, but got Unknown
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Expected O, but got Unknown
				try
				{
					if (!((Object)sp == (Object)null) && TryBuildSpriteIcon(sp, out var icon2))
					{
						Texture2D texture = icon2.Texture;
						if (!((Object)texture == (Object)null))
						{
							int num = 0;
							int width = ((Texture)texture).width;
							int height = ((Texture)texture).height;
							int num2 = width * height;
							num = ((num2 >= 65536) ? (num + 20) : ((num2 >= 16384) ? (num + 10) : ((num2 < 4096) ? (num + 1) : (num + 5))));
							if (((Texture)texture).isReadable)
							{
								num += 5;
							}
							num += NameMatchBoost(sp, texture);
							if (num > bestScore)
							{
								bestScore = num;
								best = icon2;
							}
						}
					}
				}
				catch
				{
				}
			}
			int NameMatchBoost(Sprite sp, Texture2D tex)
			{
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Expected O, but got Unknown
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Expected O, but got Unknown
				if (string.IsNullOrEmpty(pn))
				{
					return 0;
				}
				string text = NormalizeIconName(((Object)sp != (Object)null) ? ((Object)sp).name : null);
				string text2 = NormalizeIconName(((Object)tex != (Object)null) ? ((Object)tex).name : null);
				if (!string.IsNullOrEmpty(text) && (text.Contains(pn) || pn.Contains(text)))
				{
					return 10000;
				}
				if (!string.IsNullOrEmpty(text2) && (text2.Contains(pn) || pn.Contains(text2)))
				{
					return 8000;
				}
				return 0;
			}
			static string NormalizeIconName(string s)
			{
				if (string.IsNullOrEmpty(s))
				{
					return string.Empty;
				}
				s = s.ToLowerInvariant();
				s = s.Replace("(clone)", "");
				s = s.Replace("icon", "");
				s = s.Replace("ico", "");
				StringBuilder stringBuilder = new StringBuilder(s.Length);
				foreach (char c in s)
				{
					if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))
					{
						stringBuilder.Append(c);
					}
				}
				return stringBuilder.ToString();
			}
		}

		private static bool TryBuildSpriteIcon(Sprite sp, out SpriteIcon icon)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			icon = default(SpriteIcon);
			if ((Object)(object)sp == (Object)null)
			{
				return false;
			}
			if ((Object)(object)sp.texture == (Object)null)
			{
				return false;
			}
			Texture2D texture = sp.texture;
			Rect textureRect = sp.textureRect;
			if (((Rect)(ref textureRect)).width < 1f || ((Rect)(ref textureRect)).height < 1f)
			{
				return false;
			}
			Rect uV = default(Rect);
			((Rect)(ref uV))..ctor(((Rect)(ref textureRect)).x / (float)((Texture)texture).width, ((Rect)(ref textureRect)).y / (float)((Texture)texture).height, ((Rect)(ref textureRect)).width / (float)((Texture)texture).width, ((Rect)(ref textureRect)).height / (float)((Texture)texture).height);
			icon = new SpriteIcon
			{
				Texture = texture,
				UV = uV,
				IsValid = true
			};
			return true;
		}

		private static bool IsRingModeAlways()
		{
			string text = ((CfgRingMode != null && CfgRingMode.Value != null) ? CfgRingMode.Value.Trim() : "Auto");
			return text.Equals("Always", StringComparison.OrdinalIgnoreCase);
		}

		private static bool IsRingModeAuto()
		{
			string text = ((CfgRingMode != null && CfgRingMode.Value != null) ? CfgRingMode.Value.Trim() : "Auto");
			return text.Equals("Auto", StringComparison.OrdinalIgnoreCase);
		}

		private bool ShouldDrawRing()
		{
			if (CfgEnabled == null || !CfgEnabled.Value)
			{
				return false;
			}
			if (CfgRingEnabled == null || !CfgRingEnabled.Value)
			{
				return false;
			}
			if (IsRingModeAlways())
			{
				return true;
			}
			float unscaledTime = Time.unscaledTime;
			float num = Mathf.Max(0f, CfgRingAutoHideSeconds.Value);
			return unscaledTime - _lastSignalTime <= num;
		}

		private void EnsureCalloutStyle()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: 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_005c: 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_0075: Expected O, but got Unknown
			//IL_007b: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			int num = Mathf.Clamp(CfgFontSize.Value, 10, 48);
			if (_calloutStyle == null || _calloutStyle.fontSize != num)
			{
				_calloutStyle = new GUIStyle(GUI.skin.label)
				{
					wordWrap = true,
					richText = true,
					alignment = (TextAnchor)0,
					fontSize = num,
					padding = new RectOffset(10, 10, 8, 8)
				};
				_calloutStyle.normal.textColor = Color.white;
			}
		}

		private void Update()
		{
			//IL_0316: 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)
			float unscaledTime = Time.unscaledTime;
			if (CfgEnabled != null && !CfgEnabled.Value)
			{
				if (_signals.Count > 0)
				{
					_signals.Clear();
				}
				if (_callouts.Count > 0)
				{
					_callouts.Clear();
				}
				_ringAutoAlpha = 0f;
				_suspended = true;
				_wasDead = false;
				return;
			}
			Player localPlayer = Player.m_localPlayer;
			if ((Object)(object)localPlayer == (Object)null || ((Character)localPlayer).IsDead())
			{
				if (!_suspended)
				{
					_suspended = true;
					_wasDead = true;
					ClearTransientState();
				}
				_ringAutoAlpha = 0f;
				return;
			}
			if (_suspended)
			{
				_suspended = false;
				if (_wasDead)
				{
					_wasDead = false;
					ClearTransientState();
				}
			}
			for (int num = _callouts.Count - 1; num >= 0; num--)
			{
				if (_callouts[num].Until <= unscaledTime)
				{
					_callouts.RemoveAt(num);
				}
			}
			float num2 = Mathf.Clamp(CfgRingMaxSignalAge.Value, 0.15f, 10f);
			for (int num3 = _signals.Count - 1; num3 >= 0; num3--)
			{
				if (unscaledTime - _signals[num3].Born > num2)
				{
					_signals.RemoveAt(num3);
				}
			}
			if (CfgRingMode != null && string.Equals(CfgRingMode.Value, "Always", StringComparison.OrdinalIgnoreCase))
			{
				_ringAutoAlpha = 1f;
			}
			else
			{
				float num4 = -999999f;
				for (int i = 0; i < _signals.Count; i++)
				{
					if (_signals[i].Born > num4)
					{
						num4 = _signals[i].Born;
					}
				}
				if (_signals.Count > 0)
				{
					float num5 = unscaledTime - num4;
					_ringAutoAlpha = Mathf.Clamp01(1f - num5 / Mathf.Max(0.0001f, num2));
				}
				else
				{
					_ringAutoAlpha = 0f;
				}
			}
			int num6 = Mathf.Clamp(CfgRingSegments.Value, 8, 64);
			if (_segIntensity == null || _segIntensity.Length != num6)
			{
				_segIntensity = new float[num6];
				_segColor = (Color[])(object)new Color[num6];
				_segPriority = new int[num6];
			}
			for (int j = 0; j < num6; j++)
			{
				_segIntensity[j] = 0f;
				_segColor[j] = Color.clear;
				_segPriority[j] = 0;
			}
			if (CfgSrcProximityRadar != null && CfgSrcProximityRadar.Value)
			{
				bool flag = true;
				if (CfgRadarMode != null && CfgRadarMode.Value != null)
				{
					string text = CfgRadarMode.Value.Trim();
					if (text.Equals("Earshot", StringComparison.OrdinalIgnoreCase))
					{
						flag = false;
					}
				}
				if (flag)
				{
					RadarTick(unscaledTime);
				}
			}
			RecomputeRingSegments();
		}

		private void ClearTransientState()
		{
			try
			{
				_signals.Clear();
			}
			catch
			{
			}
			try
			{
				_callouts.Clear();
			}
			catch
			{
			}
			try
			{
				_radarLastPingById.Clear();
			}
			catch
			{
			}
			try
			{
				_soundLastByPrefab.Clear();
			}
			catch
			{
			}
			try
			{
				_loggedPortraitFailForPrefab.Clear();
			}
			catch
			{
			}
			_nextRadarScan = 0f;
			_lastSignalTime = 0f;
		}

		private void RadarTick(float now)
		{
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			if (now < _nextRadarScan)
			{
				return;
			}
			float num = Mathf.Clamp(CfgRadarIntervalSeconds.Value, 0.15f, 5f);
			_nextRadarScan = now + num;
			Player localPlayer = Player.m_localPlayer;
			if ((Object)(object)localPlayer == (Object)null || ((Character)localPlayer).IsDead())
			{
				return;
			}
			if (CfgRadarDisableWhileBuilding != null && CfgRadarDisableWhileBuilding.Value)
			{
				ItemData val = null;
				try
				{
					val = RightItemRef.Invoke((Humanoid)(object)localPlayer);
				}
				catch
				{
				}
				if (val != null && val.m_shared != null && val.m_shared.m_name != null && val.m_shared.m_name.IndexOf("Hammer", StringComparison.OrdinalIgnoreCase) >= 0)
				{
					return;
				}
			}
			float num2 = Mathf.Clamp(CfgRadarRadiusMeters.Value, 5f, 120f);
			float num3 = Mathf.Clamp(CfgRadarPerEnemyCooldownSeconds.Value, 0.15f, 30f);
			float num4 = Mathf.Clamp(CfgRadarDangerousExtraRadiusMult.Value, 1f, 4f);
			int mask = LayerMask.GetMask(new string[1] { "character" });
			int num5 = Physics.OverlapSphereNonAlloc(((Component)localPlayer).transform.position, num2 * num4, _radarHitsBuffer, mask);
			for (int i = 0; i < num5; i++)
			{
				Collider val2 = _radarHitsBuffer[i];
				if ((Object)(object)val2 == (Object)null)
				{
					continue;
				}
				Character componentInParent = ((Component)val2).GetComponentInParent<Character>();
				if ((Object)(object)componentInParent == (Object)null || componentInParent.IsDead() || componentInParent == localPlayer || componentInParent is Player)
				{
					continue;
				}
				string text = SafePrefabName(((Component)componentInParent).gameObject);
				Vector3 val3 = ((Component)componentInParent).transform.position - ((Component)localPlayer).transform.position;
				float sqrMagnitude = ((Vector3)(ref val3)).sqrMagnitude;
				TryRegisterIconSource(componentInParent, text);
				bool flag = CfgRadarBoostDangerousMobs != null && CfgRadarBoostDangerousMobs.Value && IsDangerousPrefab(text);
				float num6 = (flag ? (num2 * num4) : num2);
				float num7 = num6 * num6;
				if (sqrMagnitude > num7)
				{
					continue;
				}
				float distance = Mathf.Sqrt(sqrMagnitude);
				int instanceID = ((Object)componentInParent).GetInstanceID();
				if (_radarLastPingById.TryGetValue(instanceID, out var value) && now - value < num3)
				{
					continue;
				}
				_radarLastPingById[instanceID] = now;
				bool flag2 = false;
				if (CfgSrcAggroTargeting != null && CfgSrcAggroTargeting.Value && _aiGetTarget != null)
				{
					try
					{
						BaseAI component = ((Component)componentInParent).GetComponent<BaseAI>();
						if ((Object)(object)component != (Object)null)
						{
							Character val4 = _aiGetTarget(component);
							if ((Object)(object)val4 != (Object)null && val4 == localPlayer)
							{
								flag2 = true;
							}
						}
					}
					catch
					{
					}
				}
				int num8 = ((!flag) ? 1 : 3);
				if (!flag && IsMediumThreatPrefab(text))
				{
					num8 = 2;
				}
				ThreatKind kind = (flag2 ? ThreatKind.Aggro : ThreatKind.Radar);
				if (flag2)
				{
					num8 = Mathf.Max(num8, 2);
				}
				PushThreat(((Component)componentInParent).transform.position, num8, kind, text, distance);
			}
			if (_radarLastPingById.Count > 1600)
			{
				_radarLastPingById.Clear();
			}
		}

		private void RecomputeRingSegments()
		{
			//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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: 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_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: 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_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			int num = Mathf.Clamp(CfgRingSegments.Value, 8, 64);
			if (_segIntensity == null || _segIntensity.Length != num)
			{
				return;
			}
			Player localPlayer = Player.m_localPlayer;
			Camera main = Camera.main;
			if ((Object)(object)localPlayer == (Object)null || (Object)(object)main == (Object)null)
			{
				return;
			}
			Vector3 position = ((Component)localPlayer).transform.position;
			Vector3 forward = ((Component)main).transform.forward;
			forward.y = 0f;
			if (((Vector3)(ref forward)).sqrMagnitude < 0.0001f)
			{
				return;
			}
			((Vector3)(ref forward)).Normalize();
			float unscaledTime = Time.unscaledTime;
			float num2 = Mathf.Clamp(CfgRingMaxSignalAge.Value, 0.15f, 10f);
			for (int i = 0; i < _signals.Count; i++)
			{
				ThreatSignal threatSignal = _signals[i];
				float num3 = unscaledTime - threatSignal.Born;
				float num4 = Mathf.Clamp01(1f - num3 / num2);
				Vector3 val = threatSignal.WorldPos - position;
				val.y = 0f;
				if (!(((Vector3)(ref val)).sqrMagnitude < 0.0001f))
				{
					((Vector3)(ref val)).Normalize();
					float num5 = Vector3.SignedAngle(forward, val, Vector3.up);
					if (num5 < 0f)
					{
						num5 += 360f;
					}
					int num6 = Mathf.FloorToInt(num5 / 360f * (float)num);
					if (num6 < 0)
					{
						num6 = 0;
					}
					if (num6 >= num)
					{
						num6 = num - 1;
					}
					float num7 = ((threatSignal.Severity == 3) ? 1f : ((threatSignal.Severity == 2) ? 0.72f : 0.5f));
					float num8 = num7 * num4;
					Color c = KindColor(threatSignal.Kind);
					int num9 = KindPriority(threatSignal.Kind);
					ApplySegment(num6, num8, c, num9);
					float strength = num8 * 0.35f;
					int idx = (num6 - 1 + num) % num;
					int idx2 = (num6 + 1) % num;
					ApplySegment(idx, strength, c, num9 - 1);
					ApplySegment(idx2, strength, c, num9 - 1);
				}
			}
		}

		private void ApplySegment(int idx, float strength, Color c, int priority)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (!(strength <= 0f) && (priority > _segPriority[idx] || (priority == _segPriority[idx] && strength > _segIntensity[idx])))
			{
				_segPriority[idx] = priority;
				_segIntensity[idx] = strength;
				_segColor[idx] = c;
			}
		}

		private void OnGUI()
		{
			if (CfgEnabled == null || !CfgEnabled.Value)
			{
				return;
			}
			if (ShouldDrawRing())
			{
				DrawThreatRing();
				if (CfgIconsEnabled != null && CfgIconsEnabled.Value)
				{
					DrawThreatIcons();
				}
			}
			if (CfgShowCallouts != null && CfgShowCallouts.Value && _callouts.Count > 0)
			{
				DrawCallouts();
			}
		}

		private void DrawCallouts()
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: 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_004b: 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_00ee: Expected O, but got Unknown
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			EnsureCalloutStyle();
			Vector2 value = CfgAnchor.Value;
			value.x = Mathf.Clamp01(value.x);
			value.y = Mathf.Clamp01(value.y);
			float num = (float)Screen.width * value.x;
			float num2 = (float)Screen.height * value.y;
			float num3 = Mathf.Min(520f, (float)Screen.width * 0.45f);
			float num4 = num2;
			int num5 = Mathf.Clamp(CfgMaxQueue.Value, 1, 20);
			int num6 = Mathf.Max(0, _callouts.Count - num5);
			Rect val = default(Rect);
			for (int i = num6; i < _callouts.Count; i++)
			{
				Callout callout = _callouts[i];
				string text = ((callout.Severity >= 2) ? ("<b>" + callout.Text + "</b>") : callout.Text);
				float num7 = _calloutStyle.CalcHeight(new GUIContent(text), num3);
				((Rect)(ref val))..ctor(num, num4, num3, num7);
				if (CfgHighContrast.Value)
				{
					GUI.DrawTexture(val, (Texture)(object)((callout.Severity >= 2) ? _bgTexStrong : _bgTex), (ScaleMode)0, false);
				}
				GUI.Label(val, text, _calloutStyle);
				num4 += num7 + 6f;
			}
		}

		private void DrawThreatRing()
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Invalid comparison between Unknown and I4
			//IL_0131: 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_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: 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_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: 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_02ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
			if (!CfgRingEnabled.Value || !ShouldDrawRing() || (Event.current != null && (int)Event.current.type != 7))
			{
				return;
			}
			int num = Mathf.Clamp(CfgRingSegments.Value, 8, 64);
			float num2 = Mathf.Clamp(CfgRingRadiusPx.Value, 40f, 1000f);
			float num3 = Mathf.Clamp(CfgRingThicknessPx.Value, 2f, 128f);
			float num4 = Mathf.Clamp(CfgRingSegmentLengthPx.Value, 2f, 400f);
			float num5 = Mathf.Clamp01(CfgRingAlpha.Value) * _ringAutoAlpha;
			float num6 = Mathf.Clamp01(CfgRingBaseAlpha.Value) * num5;
			float num7 = Mathf.Clamp01(CfgRingActiveAlpha.Value) * num5;
			Vector2 pivot = default(Vector2);
			((Vector2)(ref pivot))..ctor((float)Screen.width * 0.5f, (float)Screen.height * 0.5f);
			if (!EnsureGlMaterial())
			{
				for (int i = 0; i < num; i++)
				{
					DrawSingleRingSegment(i, num, num2, num3, num4, pivot, new Color(1f, 1f, 1f, num6));
				}
				for (int j = 0; j < num; j++)
				{
					float threatValueForSegment = GetThreatValueForSegment(_segIntensity, j, num);
					if (!(threatValueForSegment <= 0.001f))
					{
						Color threatColor = GetThreatColor(threatValueForSegment);
						threatColor.a *= num7;
						DrawSingleRingSegment(j, num, num2, num3, num4, pivot, threatColor);
					}
				}
				return;
			}
			float num8 = ((num2 > 0.01f) ? (num4 / num2) : ((float)Math.PI * 2f / (float)num));
			num8 = Mathf.Clamp(num8, 0.03f, (float)Math.PI * 2f / (float)num * 0.98f);
			GL.PushMatrix();
			_glMat.SetPass(0);
			GL.LoadPixelMatrix(0f, (float)Screen.width, (float)Screen.height, 0f);
			GL.Begin(4);
			if (num6 > 0.001f)
			{
				Color col = default(Color);
				((Color)(ref col))..ctor(1f, 1f, 1f, num6);
				AddRingWedges(num, pivot, num2, num3, num8, col, Mathf.Min(8f, num3 * 0.35f));
			}
			for (int k = 0; k < num; k++)
			{
				float threatValueForSegment2 = GetThreatValueForSegment(_segIntensity, k, num);
				if (!(threatValueForSegment2 <= 0.001f))
				{
					Color threatColor2 = GetThreatColor(threatValueForSegment2);
					threatColor2.a *= num7;
					Color col2 = threatColor2;
					col2.a *= 0.35f;
					AddSingleWedge(k, num, pivot, num2 + 3f, num3 + 6f, num8 * 1.1f, col2);
					AddSingleWedge(k, num, pivot, num2, num3, num8, threatColor2);
				}
			}
			GL.End();
			GL.PopMatrix();
		}

		private void AddRingWedges(int segs, Vector2 pivot, float radius, float thickness, float angleSpan, Color col, float featherPx)
		{
			//IL_0003: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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_0050: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			AddAllWedges(segs, pivot, radius, thickness, angleSpan, col);
			if (!(featherPx <= 0.5f))
			{
				Color col2 = col;
				col2.a *= 0.35f;
				AddAllWedges(segs, pivot, radius + featherPx, thickness + featherPx * 2f, angleSpan * 1.02f, col2);
				Color col3 = col;
				col3.a *= 0.2f;
				AddAllWedges(segs, pivot, radius, Mathf.Max(1f, thickness - featherPx * 0.9f), angleSpan * 1.02f, col3);
			}
		}

		private void AddAllWedges(int segs, Vector2 pivot, float radius, float thickness, float angleSpan, Color col)
		{
			//IL_0008: 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)
			for (int i = 0; i < segs; i++)
			{
				AddSingleWedge(i, segs, pivot, radius, thickness, angleSpan, col);
			}
		}

		private void AddSingleWedge(int segIndex, int segs, Vector2 pivot, float radius, float thickness, float angleSpan, Color col)
		{
			//IL_004a: 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)
			float num = Mathf.Max(0f, radius - thickness);
			float outerR = Mathf.Max(num + 0.5f, radius);
			float num2 = (float)segIndex * ((float)Math.PI * 2f / (float)segs) - (float)Math.PI / 2f;
			float a = num2 - angleSpan * 0.5f;
			float a2 = num2 + angleSpan * 0.5f;
			AddWedgeTriangles(pivot, num, outerR, a, a2, col);
		}

		private void AddWedgeTriangles(Vector2 pivot, float innerR, float outerR, float a0, float a1, Color col)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: 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_004d: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00a9: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: 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)
			float num = Mathf.Cos(a0);
			float num2 = Mathf.Sin(a0);
			float num3 = Mathf.Cos(a1);
			float num4 = Mathf.Sin(a1);
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(pivot.x + num * outerR, pivot.y + num2 * outerR, 0f);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(pivot.x + num3 * outerR, pivot.y + num4 * outerR, 0f);
			Vector3 val3 = default(Vector3);
			((Vector3)(ref val3))..ctor(pivot.x + num * innerR, pivot.y + num2 * innerR, 0f);
			Vector3 val4 = default(Vector3);
			((Vector3)(ref val4))..ctor(pivot.x + num3 * innerR, pivot.y + num4 * innerR, 0f);
			GL.Color(col);
			GL.Vertex(val);
			GL.Vertex(val2);
			GL.Vertex(val4);
			GL.Vertex(val);
			GL.Vertex(val4);
			GL.Vertex(val3);
		}

		private bool EnsureGlMaterial()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			try
			{
				if ((Object)(object)_glMat != (Object)null)
				{
					return true;
				}
				Shader val = Shader.Find("Hidden/Internal-Colored");
				if ((Object)(object)val == (Object)null)
				{
					return false;
				}
				_glMat = new Material(val);
				((Object)_glMat).hideFlags = (HideFlags)61;
				_glMat.SetInt("_SrcBlend", 5);
				_glMat.SetInt("_DstBlend", 10);
				_glMat.SetInt("_Cull", 0);
				_glMat.SetInt("_ZWrite", 0);
				return true;
			}
			catch
			{
				_glMat = null;
				return false;
			}
		}

		private void DrawSingleRingSegment(int segIndex, int segCount, float radiusPx, float thicknessPx, float segLengthPx, Vector2 pivot, Color c)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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 ((Object)(object)_whiteTex == (Object)null)
			{
				_whiteTex = MakeTex(2, 2, Color.white);
			}
			float num = (float)segIndex * 360f / (float)segCount - 90f;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(pivot.x - segLengthPx * 0.5f, pivot.y - radiusPx - thicknessPx, segLengthPx, thicknessPx);
			Matrix4x4 matrix = GUI.matrix;
			Color color = GUI.color;
			GUI.color = c;
			GUIUtility.RotateAroundPivot(num, pivot);
			GUI.DrawTexture(val, (Texture)(object)_whiteTex, (ScaleMode)0, true);
			GUI.matrix = matrix;
			GUI.color = color;
		}

		private void DrawThreatIcons()
		{
			//IL_0632: Unknown result type (might be due to invalid IL or missing references)
			//IL_0675: Unknown result type (might be due to invalid IL or missing references)
			//IL_0658: Unknown result type (might be due to invalid IL or missing references)
			//IL_065a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_036d: 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)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0382: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_041e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0432: Unknown result type (might be due to invalid IL or missing references)
			//IL_044d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0452: Unknown result type (might be due to invalid IL or missing references)
			//IL_0516: Unknown result type (might be due to invalid IL or missing references)
			//IL_051b: Unknown result type (might be due to invalid IL or missing references)
			//IL_052e: Unknown result type (might be due to invalid IL or missing references)
			//IL_049c: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_050d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0571: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d6: Unknown result type (might be due to invalid IL or missing references)
			Player localPlayer = Player.m_localPlayer;
			Camera main = Camera.main;
			if ((Object)(object)localPlayer == (Object)null || (Object)(object)main == (Object)null)
			{
				return;
			}
			float unscaledTime = Time.unscaledTime;
			float num = Mathf.Clamp(CfgRingMaxSignalAge.Value, 0.15f, 10f);
			Dictionary<string, ThreatSignal> dictionary = new Dictionary<string, ThreatSignal>(16);
			for (int i = 0; i < _signals.Count; i++)
			{
				ThreatSignal value = _signals[i];
				if (string.IsNullOrEmpty(value.Prefab))
				{
					continue;
				}
				float num2 = unscaledTime - value.Born;
				if (num2 > num)
				{
					continue;
				}
				if (!dictionary.TryGetValue(value.Prefab, out var value2))
				{
					dictionary[value.Prefab] = value;
					continue;
				}
				int num3 = KindPriority(value.Kind);
				int num4 = KindPriority(value2.Kind);
				if (num3 > num4)
				{
					dictionary[value.Prefab] = value;
				}
				else if (num3 == num4)
				{
					if (value.Distance < value2.Distance - 0.01f)
					{
						dictionary[value.Prefab] = value;
					}
					else if (Mathf.Abs(value.Distance - value2.Distance) < 0.01f && value.Born > value2.Born)
					{
						dictionary[value.Prefab] = value;
					}
				}
			}
			List<ThreatSignal> list = new List<ThreatSignal>(dictionary.Values);
			list.Sort(delegate(ThreatSignal a, ThreatSignal b)
			{
				int value4 = KindPriority(a.Kind);
				int num23 = KindPriority(b.Kind).CompareTo(value4);
				return (num23 != 0) ? num23 : a.Distance.CompareTo(b.Distance);
			});
			int num5 = Mathf.Clamp(CfgIconMaxVisible.Value, 1, 16);
			if (list.Count > num5)
			{
				list.RemoveRange(num5, list.Count - num5);
			}
			Vector3 forward = ((Component)main).transform.forward;
			forward.y = 0f;
			if (((Vector3)(ref forward)).sqrMagnitude < 0.0001f)
			{
				return;
			}
			((Vector3)(ref forward)).Normalize();
			float num6 = Mathf.Clamp(CfgRingRadius.Value, 60f, 520f);
			float num7 = Mathf.Clamp(CfgIconRingOffsetPx.Value, 0f, 120f);
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor((float)Screen.width * 0.5f, (float)Screen.height * 0.5f);
			float num8 = Mathf.Clamp(CfgIconBasePx.Value, 12f, 140f);
			float num9 = Mathf.Clamp(CfgIconNearScale.Value, 0.5f, 3f);
			float num10 = Mathf.Clamp(CfgIconFarScale.Value, 0.25f, 2f);
			float num11 = Mathf.Max(5f, CfgRadarRadiusMeters.Value);
			float num12 = Mathf.Clamp(CfgRadarDangerousExtraRadiusMult.Value, 1f, 4f);
			bool value3 = CfgIconOutline.Value;
			Rect val3 = default(Rect);
			Rect val4 = default(Rect);
			for (int j = 0; j < list.Count; j++)
			{
				ThreatSignal threatSignal = list[j];
				if (!TryGetIconForPrefab(threatSignal.Prefab, out var spriteIcon, out var portraitRt))
				{
					continue;
				}
				Vector3 val2 = threatSignal.WorldPos - ((Component)localPlayer).transform.position;
				val2.y = 0f;
				if (((Vector3)(ref val2)).sqrMagnitude < 0.0001f)
				{
					continue;
				}
				((Vector3)(ref val2)).Normalize();
				float num13 = Vector3.SignedAngle(forward, val2, Vector3.up);
				float num14 = num13 * ((float)Math.PI / 180f);
				float num15 = (IsDangerousPrefab(threatSignal.Prefab) ? (num11 * num12) : num11);
				float num16 = Mathf.Clamp01(threatSignal.Distance / Mathf.Max(0.01f, num15));
				float num17 = Mathf.Lerp(num9, num10, num16);
				float num18 = num8 * num17;
				float num19 = num6 + num7;
				float num20 = val.x + Mathf.Sin(num14) * num19;
				float num21 = val.y - Mathf.Cos(num14) * num19;
				Color c = KindColor(threatSignal.Kind);
				float num22 = 0.92f;
				if (threatSignal.Kind == ThreatKind.Radar)
				{
					num22 = 0.78f;
				}
				((Rect)(ref val3))..ctor(num20 - num18 * 0.5f, num21 - num18 * 0.5f, num18, num18);
				if (value3)
				{
					Color color = GUI.color;
					GUI.color = new Color(0f, 0f, 0f, 0.55f);
					((Rect)(ref val4))..ctor(((Rect)(ref val3)).x - 2f, ((Rect)(ref val3)).y - 2f, ((Rect)(ref val3)).width + 4f, ((Rect)(ref val3)).height + 4f);
					GUI.DrawTexture(val4, (Texture)(object)_blackTex, (ScaleMode)0, false);
					GUI.color = color;
				}
				Color color2 = GUI.color;
				GUI.color = new Color(1f, 1f, 1f, num22);
				bool flag = CfgIconCutoutEnabled != null && CfgIconCutoutEnabled.Value;
				Texture2D val5 = EnsureIconTexture(threatSignal.Prefab, spriteIcon, portraitRt);
				if ((Object)(object)val5 != (Object)null)
				{
					GUI.DrawTexture(val3, (Texture)(object)val5, (ScaleMode)2, true);
				}
				else if (!flag)
				{
					if (spriteIcon.IsValid && (Object)(object)spriteIcon.Texture != (Object)null)
					{
						GUI.DrawTextureWithTexCoords(val3, (Texture)(object)spriteIcon.Texture, spriteIcon.UV, true);
					}
					else if ((Object)(object)portraitRt != (Object)null)
					{
						GUI.DrawTexture(val3, (Texture)(object)portraitRt, (ScaleMode)2, true);
					}
				}
				DrawThreatShapeBadge(val3, threatSignal.Kind);
				bool flag2 = false;
				try
				{
					flag2 = CfgIconLabelsEnabled != null && CfgIconLabelsEnabled.Value;
				}
				catch
				{
					flag2 = false;
				}
				if (flag2)
				{
					string displayNameForPrefab = GetDisplayNameForPrefab(threatSignal.Prefab);
					DrawIconLabel(val3, displayNameForPrefab);
				}
				if (CfgIconBorder != null && CfgIconBorder.Value)
				{
					DrawBorderRect(val3, c, Mathf.Lerp(3f, 2f, num16), num22);
				}
				GUI.color = color2;
			}
		}

		private void DrawBorderRect(Rect r, Color c, float thickness, float alpha)
		{
			//IL_0027: 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)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: 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_0067: 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_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_whiteTex == (Object)null))
			{
				float num = Mathf.Clamp(thickness, 1f, 6f);
				Color color = GUI.color;
				GUI.color = new Color(c.r, c.g, c.b, Mathf.Clamp01(alpha));
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, ((Rect)(ref r)).width, num), (Texture)(object)_whiteTex, (ScaleMode)0, false);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).yMax - num, ((Rect)(ref r)).width, num), (Texture)(object)_whiteTex, (ScaleMode)0, false);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).x, ((Rect)(ref r)).y, num, ((Rect)(ref r)).height), (Texture)(object)_whiteTex, (ScaleMode)0, false);
				GUI.DrawTexture(new Rect(((Rect)(ref r)).xMax - num, ((Rect)(ref r)).y, num, ((Rect)(ref r)).height), (Texture)(object)_whiteTex, (ScaleMode)0, false);
				GUI.color = color;
			}
		}

		private void LoadFileIconDictionary()
		{
			if (_fileIconsLoaded || _fileIconsLoading)
			{
				return;
			}
			string text = null;
			try
			{
				if (!string.IsNullOrEmpty(PluginFolder))
				{
					text = PluginFolder;
				}
				else if ((Object)(object)Instance != (Object)null)
				{
					text = Path.GetDirectoryName(((BaseUnityPlugin)Instance).Info.Location);
				}
			}
			catch
			{
				text = null;
			}
			if (string.IsNullOrEmpty(text) || !Directory.Exists(text))
			{
				try
				{
					ManualLogSource log = Log;
					if (log != null)
					{
						log.LogWarning((object)("[Accessibility] Plugin folder not found; cannot load PNG icon dictionary. baseDir=" + text));
					}
				}
				catch
				{
				}
				_fileIconsLoaded = true;
				return;
			}
			string text2 = Path.Combine(text, "Dictionary");
			if (!Directory.Exists(text2))
			{
				text2 = text;
				try
				{
					ManualLogSource log2 = Log;
					if (log2 != null)
					{
						log2.LogWarning((object)("[Accessibility] Dictionary folder not found; falling back to plugin folder for PNG icons: " + text2));
					}
				}
				catch
				{
				}
			}
			_fileIconsLoading = true;
			((MonoBehaviour)this).StartCoroutine(CoLoadFileIconDictionary(text2));
		}

		[IteratorStateMachine(typeof(<CoLoadFileIconDictionary>d__83))]
		private IEnumerator CoLoadFileIconDictionary(string dictPath)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <CoLoadFileIconDictionary>d__83(0)
			{
				<>4__this = this,
				dictPath = dictPath
			};
		}

		private Texture2D EnsureIconTexture(string prefab, SpriteIcon spriteIcon, RenderTexture portraitRt)
		{
			if (string.IsNullOrEmpty(prefab))
			{
				return null;
			}
			if (_fileIconTexByPrefab.TryGetValue(prefab, out var value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			if (_iconTexByPrefab.TryGetValue(prefab, out value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			bool flag = CfgIconCutoutEnabled != null && CfgIconCutoutEnabled.Value;
			if (spriteIcon.IsValid && (Object)(object)spriteIcon.Texture != (Object)null)
			{
				if (flag)
				{
					try
					{
						value = BuildCutoutFromSpriteIcon(spriteIcon);
						if ((Object)(object)value != (Object)null)
						{
							_iconTexByPrefab[prefab] = value;
							return value;
						}
					}
					catch
					{
					}
					return null;
				}
				return null;
			}
			if ((Object)(object)portraitRt != (Object)null)
			{
				if (flag)
				{
					try
					{
						value = BuildCutoutFromRenderTexture(portraitRt);
						if ((Object)(object)value != (Object)null)
						{
							_iconTexByPrefab[prefab] = value;
							return value;
						}
					}
					catch
					{
					}
					return null;
				}
				return null;
			}
			return null;
		}

		private bool TryGetIconForPrefab(string prefab, out SpriteIcon spriteIcon, out RenderTexture portraitRt)
		{
			spriteIcon = default(SpriteIcon);
			portraitRt = null;
			if (string.IsNullOrEmpty(prefab))
			{
				return false;
			}
			float unscaledTime = Time.unscaledTime;
			float num = ((CfgIconRefreshSeconds != null) ? Mathf.Max(0f, CfgIconRefreshSeconds.Value) : 0f);
			if (IsSafeMode())
			{
				num = 0f;
			}
			if (_fileSpriteIconsByPrefab.TryGetValue(prefab, out spriteIcon) && spriteIcon.IsValid && (Object)(object)spriteIcon.Texture != (Object)null)
			{
				return true;
			}
			if (CfgIconUseSprite != null && CfgIconUseSprite.Value && _spriteIconsByPrefab.TryGetValue(prefab, out spriteIcon) && spriteIcon.IsValid && (Object)(object)spriteIcon.Texture != (Object)null)
			{
				return true;
			}
			bool flag = false;
			return false;
		}

		private void EnsurePortraitRig()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_00b1: 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_0121: Expected O, but got Unknown
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Expected O, but got Unknown
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_iconRigRoot != (Object)null))
			{
				_iconRigRoot = new GameObject("PX_AccessibilityPortraitRig");
				try
				{
					Object.DontDestroyOnLoad((Object)(object)_iconRigRoot);
				}
				catch
				{
				}
				GameObject val = new GameObject("PX_AccessibilityPortraitCam");
				val.transform.SetParent(_iconRigRoot.transform, false);
				_iconCam = val.AddComponent<Camera>();
				((Behaviour)_iconCam).enabled = false;
				_iconCam.cullingMask = int.MinValue;
				_iconCam.clearFlags = (CameraClearFlags)2;
				_iconCam.backgroundColor = new Color(0f, 0f, 0f, 0f);
				_iconCam.orthographic = false;
				_iconCam.fieldOfView = 28f;
				_iconCam.nearClipPlane = 0.02f;
				_iconCam.farClipPlane = 50f;
				_iconCam.allowHDR = false;
				_iconCam.allowMSAA = false;
				GameObject val2 = new GameObject("PX_AccessibilityPortraitLight");
				val2.transform.SetParent(_iconRigRoot.transform, false);
				_iconLight = val2.AddComponent<Light>();
				_iconLight.type = (LightType)1;
				_iconLight.intensity = 1.25f;
				_iconLight.color = new Color(1f, 1f, 1f, 1f);
				GameObject val3 = new GameObject("PX_AccessibilityPortraitLightFill");
				val3.transform.SetParent(_iconRigRoot.transform, false);
				Light val4 = val3.AddComponent<Light>();
				val4.type = (LightType)1;
				val4.intensity = 0.65f;
				val4.color = new Color(0.92f, 0.92f, 1f, 1f);
				_iconRigRoot.transform.position = new Vector3(0f, 10000f, 0f);
			}
		}

		private RenderTexture BuildPortraitFallback(string prefabName)
		{
			return null;
		}

		private static void SetLayerRecursive(GameObject root, int layer)
		{
			if ((Object)(object)root == (Object)null)
			{
				return;
			}
			try
			{
				root.layer = layer;
			}
			catch
			{
			}
			Transform val = null;
			try
			{
				val = root.transform;
			}
			catch
			{
			}
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			int num = 0;
			try
			{
				num = val.childCount;
			}
			catch
			{
			}
			for (int i = 0; i < num; i++)
			{
				Transform val2 = null;
				try
				{
					val2 = val.GetChild(i);
				}
				catch
				{
				}
				if (!((Object)(object)val2 == (Object)null))
				{
					GameObject val3 = null;
					try
					{
						val3 = ((Component)val2).gameObject;
					}
					catch
					{
					}
					if (!((Object)(object)val3 == (Object)null))
					{
						SetLayerRecursive(val3, layer);
					}
				}
			}
		}

		private bool IsRenderTextureBlank(RenderTexture rt)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_00b5: 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_012e: 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_0135: 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_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: 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_021f: 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_019f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)rt == (Object)null)
			{
				return true;
			}
			Texture2D val = null;
			try
			{
				val = new Texture2D(8, 8, (TextureFormat)4, false);
			}
			catch
			{
				return false;
			}
			RenderTexture active = null;
			try
			{
				active = RenderTexture.active;
			}
			catch
			{
			}
			try
			{
				try
				{
					RenderTexture.active = rt;
				}
				catch
				{
					return false;
				}
				int num = 0;
				int num2 = 0;
				try
				{
					num = Mathf.Clamp(((Texture)rt).width / 2 - 4, 0, Mathf.Max(0, ((Texture)rt).width - 8));
					num2 = Mathf.Clamp(((Texture)rt).height / 2 - 4, 0, Mathf.Max(0, ((Texture)rt).height - 8));
				}
				catch
				{
				}
				try
				{
					val.ReadPixels(new Rect((float)num, (float)num2, 8f, 8f), 0, 0, false);
				}
				catch
				{
					return false;
				}
				try
				{
					val.Apply(false, false);
				}
				catch
				{
				}
				Color32[] array = null;
				try
				{
					array = val.GetPixels32();
				}
				catch
				{
					return false;
				}
				if (array == null || array.Length == 0)
				{
					return false;
				}
				Color32 val2 = array[0];
				int num3 = 0;
				for (int i = 1; i < array.Length; i++)
				{
					Color32 val3 = array[i];
					int num4 = val3.r - val2.r;
					if (num4 < 0)
					{
						num4 = -num4;
					}
					int num5 = val3.g - val2.g;
					if (num5 < 0)
					{
						num5 = -num5;
					}
					int num6 = val3.b - val2.b;
					if (num6 < 0)
					{
						num6 = -num6;
					}
					int num7 = val3.a - val2.a;
					if (num7 < 0)
					{
						num7 = -num7;
					}
					if (num4 + num5 + num6 + num7 > 8)
					{
						num3++;
						if (num3 > 3)
						{
							return false;
						}
					}
				}
				bool flag = val2.a < 25;
				bool flag2 = val2.r < 10 && val2.g < 10 && val2.b < 10;
				return flag || flag2;
			}
			finally
			{
				try
				{
					RenderTexture.active = active;
				}
				catch
				{
				}
				try
				{
					Object.Destroy((Object)(object)val);
				}
				catch
				{
				}
			}
		}

		private void LogPortraitFailOnce(string prefabName, string reason)
		{
			if (!string.IsNullOrEmpty(prefabName) && !_loggedPortraitFailForPrefab.Contains(prefabName))
			{
				_loggedPortraitFailForPrefab.Add(prefabName);
				ManualLogSource log = Log;
				if (log != null)
				{
					log.LogInfo((object)("[Accessibility] Portrait fallback failed for " + prefabName + " (" + reason + ")"));
				}
			}
		}

		private Texture2D BuildCutoutFromSpriteIcon(SpriteIcon si)
		{
			//IL_04dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e4: Expected O, but got Unknown
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: 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_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			if (!si.IsValid || (Object)(object)si.Texture == (Object)null)
			{
				return null;
			}
			int width = ((Texture)si.Texture).width;
			int height = ((Texture)si.Texture).height;
			float num = Mathf.Clamp01(((Rect)(ref si.UV)).x);
			float num2 = Mathf.Clamp01(((Rect)(ref si.UV)).y);
			float num3 = Mathf.Clamp01(((Rect)(ref si.UV)).x + ((Rect)(ref si.UV)).width);
			float num4 = Mathf.Clamp01(((Rect)(ref si.UV)).y + ((Rect)(ref si.UV)).height);
			int num5 = Mathf.Clamp((int)Mathf.Round(num * (float)width), 0, width - 1);
			int num6 = Mathf.Clamp((int)Mathf.Round(num2 * (float)height), 0, height - 1);
			int num7 = Mathf.Clamp((int)Mathf.Round(num3 * (float)width), 0, width);
			int num8 = Mathf.Clamp((int)Mathf.Round(num4 * (float)height), 0, height);
			int num9 = Mathf.Clamp(num7 - num5, 1, width - num5);
			int num10 = Mathf.Clamp(num8 - num6, 1, height - num6);
			Color[] pixels;
			try
			{
				pixels = si.Texture.GetPixels(num5, num6, num9, num10);
			}
			catch
			{
				return null;
			}
			if (pixels == null || pixels.Length != num9 * num10)
			{
				return null;
			}
			bool flag = false;
			for (int i = 0; i < pixels.Length; i++)
			{
				if (pixels[i].a < 0.98f)
				{
					flag = true;
					break;
				}
			}
			float num11 = 0.12f;
			if (CfgIconCutoutBgTolerance != null)
			{
				num11 = Mathf.Clamp01(CfgIconCutoutBgTolerance.Value);
			}
			float num12 = num11 * num11;
			if (!flag)
			{
				Color val = SampleEdgeModeColor(pixels, num9, num10);
				bool[] array = new bool[pixels.Length];
				for (int j = 0; j < pixels.Length; j++)
				{
					Color val2 = pixels[j];
					float num13 = val2.r - val.r;
					float num14 = val2.g - val.g;
					float num15 = val2.b - val.b;
					float num16 = num13 * num13 + num14 * num14 + num15 * num15;
					array[j] = num16 <= num12;
				}
				bool[] array2 = new bool[pixels.Length];
				Queue<int> queue = new Queue<int>(num9 * 2 + num10 * 2);
				for (int k = 0; k < num9; k++)
				{
					int num17 = k;
					int num18 = (num10 - 1) * num9 + k;
					if (array[num17])
					{
						array2[num17] = true;
						queue.Enqueue(num17);
					}
					if (array[num18])
					{
						array2[num18] = true;
						queue.Enqueue(num18);
					}
				}
				for (int l = 0; l < num10; l++)
				{
					int num19 = l * num9;
					int num20 = l * num9 + (num9 - 1);
					if (array[num19] && !array2[num19])
					{
						array2[num19] = true;
						queue.Enqueue(num19);
					}
					if (array[num20] && !array2[num20])
					{
						array2[num20] = true;
						queue.Enqueue(num20);
					}
				}
				while (queue.Count > 0)
				{
					int num21 = queue.Dequeue();
					int num22 = num21 % num9;
					int num23 = num21 / num9;
					if (num22 > 0)
					{
						int num24 = num21 - 1;
						if (!array2[num24] && array[num24])
						{
							array2[num24] = true;
							queue.Enqueue(num24);
						}
					}
					if (num22 < num9 - 1)
					{
						int num24 = num21 + 1;
						if (!array2[num24] && array[num24])
						{
							array2[num24] = true;
							queue.Enqueue(num24);
						}
					}
					if (num23 > 0)
					{
						int num24 = num21 - num9;
						if (!array2[num24] && array[num24])
						{
							array2[num24] = true;
							queue.Enqueue(num24);
						}
					}
					if (num23 < num10 - 1)
					{
						int num24 = num21 + num9;
						if (!array2[num24] && array[num24])
						{
							array2[num24] = true;
							queue.Enqueue(num24);
						}
					}
				}
				for (int m = 0; m < pixels.Length; m++)
				{
					if (array2[m])
					{
						pixels[m].a = 0f;
					}
					else
					{
						pixels[m].a = 1f;
					}
				}
			}
			Texture2D val3 = new Texture2D(num9, num10, (TextureFormat)4, false);
			((Texture)val3).wrapMode = (TextureWrapMode)1;
			((Texture)val3).filterMode = (FilterMode)1;
			val3.SetPixels(pixels);
			val3.Apply(false, false);
			if (CfgIconCutoutFeatherEdges != null && CfgIconCutoutFeatherEdges.Value)
			{
				FeatherAlphaEdge(val3);
			}
			return val3;
		}

		private Texture2D BuildCutoutFromRenderTexture(RenderTexture rt)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_005e: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: 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)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)rt == (Object)null)
			{
				return null;
			}
			try
			{
				int width = ((Texture)rt).width;
				int height = ((Texture)rt).height;
				RenderTexture active = RenderTexture.active;
				RenderTexture.active = rt;
				Texture2D val = new Texture2D(width, height, (TextureFormat)4, false);
				((Texture)val).wrapMode = (TextureWrapMode)1;
				((Texture)val).filterMode = (FilterMode)1;
				val.ReadPixels(new Rect(0f, 0f, (float)width, (float)height), 0, 0, false);
				val.Apply(false, false);
				RenderTexture.active = active;
				Color[] pixels = val.GetPixels();
				bool flag = false;
				for (int i = 0; i < pixels.Length; i++)
				{
					if (pixels[i].a < 0.98f)
					{
						flag = true;
						break;
					}
				}
				if (!flag)
				{
					Color val2 = SampleEdgeModeColor(pixels, width, height);
					float num = 0.12f;
					if (CfgIconCutoutBgTolerance != null)
					{
						num = Mathf.Clamp01(CfgIconCutoutBgTolerance.Value);
					}
					float num2 = num * num;
					bool[] array = new bool[pixels.Length];
					for (int j = 0; j < pixels.Length; j++)
					{
						Color val3 = pixels[j];
						float num3 = val3.r - val2.r;
						float num4 = val3.g - val2.g;
						float num5 = val3.b - val2.b;
						float num6 = num3 * num3 + num4 * num4 + num5 * num5;
						array[j] = num6 <= num2;
					}
					bool[] array2 = new bool[pixels.Length];
					Queue<int> queue = new Queue<int>(width * 2 + height * 2);
					for (int k = 0; k < width; k++)
					{
						int num7 = k;
						int num8 = (height - 1) * width + k;
						if (array[num7])
						{
							array2[num7] = true;
							queue.Enqueue(num7);
						}
						if (array[num8])
						{
							array2[num8] = true;
							queue.Enqueue(num8);
						}
					}
					for (int l = 0; l < height; l++)
					{
						int num9 = l * width;
						int num10 = l * width + (width - 1);
						if (array[num9] && !array2[num9])
						{
							array2[num9] = true;
							queue.Enqueue(num9);
						}
						if (array[num10] && !array2[num10])
						{
							array2[num10] = true;
							queue.Enqueue(num10);
						}
					}
					while (queue.Count > 0)
					{
						int num11 = queue.Dequeue();
						int num12 = num11 % width;
						int num13 = num11 / width;
						if (num12 > 0)
						{
							int num14 = num11 - 1;
							if (!array2[num14] && array[num14])
							{
								array2[num14] = true;
								queue.Enqueue(num14);
							}
						}
						if (num12 < width - 1)
						{
							int num14 = num11 + 1;
							if (!array2[num14] && array[num14])
							{
								array2[num14] = true;
								queue.Enqueue(num14);
							}
						}
						if (num13 > 0)
						{
							int num14 = num11 - width;
							if (!array2[num14] && array[num14])
							{
								array2[num14] = true;
								queue.Enqueue(num14);
							}
						}
						if (num13 < height - 1)
						{
							int num14 = num11 + width;
							if (!array2[num14] && array[num14])
							{
								array2[num14] = true;
								queue.Enqueue(num14);
							}
						}
					}
					for (int m = 0; m < pixels.Length; m++)
					{
						if (array2[m])
						{
							pixels[m].a = 0f;
						}
						else
						{
							pixels[m].a = 1f;
						}
					}
					val.SetPixels(pixels);
					val.Apply(false, false);
				}
				if (CfgIconCutoutFeatherEdges != null && CfgIconCutoutFeatherEdges.Value)
				{
					FeatherAlphaEdge(val);
				}
				return val;
			}
			catch
			{
				return null;
			}
		}

		private static Color SampleEdgeModeColor(Color[] px, int w, int h)
		{
			//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_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: 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_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: 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_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			if (px == null || px.Length == 0 || w <= 0 || h <= 0)
			{
				return Color.white;
			}
			Dictionary<int, int> counts = new Dictionary<int, int>(128);
			Dictionary<int, Color> sums = new Dictionary<int, Color>(128);
			Func<Color, int> keyOf = delegate(Color c)
			{
				//IL_0001: 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_0037: Unknown result type (might be due to invalid IL or missing references)
				int num3 = Mathf.Clamp((int)Mathf.Round(c.r * 15f), 0, 15);
				int num4 = Mathf.Clamp((int)Mathf.Round(c.g * 15f), 0, 15);
				int num5 = Mathf.Clamp((int)Mathf.Round(c.b * 15f), 0, 15);
				return (num3 << 8) | (num4 << 4) | num5;
			};
			Action<int> action = delegate(int idx)
			{
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_002a: 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_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				if (idx >= 0 && idx < px.Length)
				{
					Color val = px[idx];
					int key = keyOf(val);
					counts.TryGetValue(key, out var value2);
					counts[key] = value2 + 1;
					sums.TryGetValue(key, out var value3);
					sums[key] = value3 + val;
				}
			};
			for (int i = 0; i < w; i++)
			{
				action(i);
				action((h - 1) * w + i);
			}
			for (int j = 0; j < h; j++)
			{
				action(j * w);
				action(j * w + (w - 1));
			}
			int num = -1;
			int num2 = -1;
			foreach (KeyValuePair<int, int> item in counts)
			{
				if (item.Value > num2)
				{
					num2 = item.Value;
					num = item.Key;
				}
			}
			if (num == -1 || num2 <= 0)
			{
				return Color.white;
			}
			if (!sums.TryGetValue(num, out var value))
			{
				return Color.white;
			}
			return value / (float)num2;
		}

		private static void FeatherAlphaEdge(Texture2D tex)
		{
			//IL_01b6: 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_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)tex == (Object)null)
				{
					return;
				}
				int width = ((Texture)tex).width;
				int height = ((Texture)tex).height;
				Color[] pixels = tex.GetPixels();
				Color[] array = (Color[])(object)new Color[pixels.Length];
				Array.Copy(pixels, array, pixels.Length);
				for (int i = 1; i < height - 1; i++)
				{
					for (int j = 1; j < width - 1; j++)
					{
						int num = i * width + j;
						float a = pixels[num].a;
						if (a <= 0.01f || a >= 0.99f)
						{
						}
					}
				}
				for (int k = 1; k < height - 1; k++)
				{
					for (int l = 1; l < width - 1; l++)
					{
						int num2 = k * width + l;
						float a2 = pixels[num2].a;
						if (!(a2 < 0.99f) && (pixels[num2 - 1].a < 0.01f || pixels[num2 + 1].a < 0.01f || pixels[num2 - width].a < 0.01f || pixels[num2 + width].a < 0.01f || pixels[num2 - width - 1].a < 0.01f || pixels[num2 - width + 1].a < 0.01f || pixels[num2 + width - 1].a < 0.01f || pixels[num2 + width + 1].a < 0.01f))
						{
							Color val = array[num2];
							val.a = 0.85f;
							array[num2] = val;
						}
					}
				}
				tex.SetPixels(array);
				tex.Apply(false, false);
			}
			catch
			{
			}
		}

		private static Texture2D MakeTex(int w, int h, Color col)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_002a: 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)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			Color[] array = (Color[])(object)new Color[w * h];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = col;
			}
			val.SetPixels(array);
			val.Apply(false, false);
			return val;
		}

		private void EnsureIconLabelStyles()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			if (_iconLabelStyle == null)
			{
				_iconLabelStyle = new GUIStyle(GUI.skin.label);
				_iconLabelStyle.alignment = (TextAnchor)1;
				_iconLabelStyle.wordWrap = false;
				_iconLabelStyle.clipping = (TextClipping)1;
				_iconLabelStyle.normal.textColor = Color.white;
			}
			if (_iconLabelStyleHC == null)
			{
				_iconLabelStyleHC = new GUIStyle(_iconLabelStyle);
				_iconLabelStyleHC.normal.textColor = Color.white;
			}
			int fontSize = 14;
			try
			{
				if (CfgIconLabelFontSize != null)
				{
					fontSize = Mathf.Clamp(CfgIconLabelFontSize.Value, 10, 24);
				}
			}
			catch
			{
				fontSize = 14;
			}
			_iconLabelStyle.fontSize = fontSize;
			_iconLabelStyleHC.fontSize = fontSize;
		}

		private static string GetDisplayNameForPrefab(string prefabName)
		{
			if (string.IsNullOrEmpty(prefabName))
			{
				return "";
			}
			string input = prefabName.Replace('_', ' ').Replace('-', ' ').Trim();
			input = Regex.Replace(input, "([a-z])([A-Z])", "$1 $2");
			return Regex.Replace(input, "\\s+", " ").Trim();
		}

		private void DrawIconLabel(Rect iconRect, string text)
		{
			//IL_00e5: 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_00ac: 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_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			if (!string.IsNullOrEmpty(text))
			{
				EnsureIconLabelStyles();
				float num = 2f;
				float num2 = Mathf.Clamp((float)_iconLabelStyle.fontSize + 6f, 14f, 34f);
				Rect val = default(Rect);
				((Rect)(ref val))..ctor(((Rect)(ref iconRect)).x - 18f, ((Rect)(ref iconRect)).yMax + num, ((Rect)(ref iconRect)).width + 36f, num2);
				bool flag = false;
				try
				{
					flag = CfgIconLabelHighContrast != null && CfgIconLabelHighContrast.Value;
				}
				catch
				{
					flag = false;
				}
				if (flag && (Object)(object)_iconLabelBgTex != (Object)null)
				{
					Color color = GUI.color;
					GUI.color = new Color(1f, 1f, 1f, 0.85f);
					GUI.DrawTexture(val, (Texture)(object)_iconLabelBgTex, (ScaleMode)0, false);
					GUI.color = color;
				}
				GUI.Label(val, text, flag ? _iconLabelStyleHC : _iconLabelStyle);
			}
		}

		private void DrawThreatShapeBadge(Rect iconRect, ThreatKind kind)
		{
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: 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_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: 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_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			try
			{
				flag = CfgThreatShapesEnabled != null && CfgThreatShapesEnabled.Value;
			}
			catch
			{
				flag = false;
			}
			if (!flag)
			{
				return;
			}
			float num = 12f;
			try
			{
				if (CfgThreatShapeSizePx != null)
				{
					num = Mathf.Clamp(CfgThreatShapeSizePx.Value, 6f, 26f);
				}
			}
			catch
			{
				num = 12f;
			}
			Texture2D val = null;
			val = (Texture2D)(kind switch
			{
				ThreatKind.Damage => _shapeX, 
				ThreatKind.Attack => _shapeDiamond, 
				ThreatKind.Aggro => _shapeTriangle, 
				_ => _shapeCircle, 
			});
			if (!((Object)(object)val == (Object)null))
			{
				Rect val2 = default(Rect);
				((Rect)(ref val2))..ctor(((Rect)(ref iconRect)).xMax - num, ((Rect)(ref iconRect)).y, num, num);
				if ((Object)(object)_blackTex != (Object)null)
				{
					Color color = GUI.color;
					GUI.color = new Color(0f, 0f, 0f, 0.55f);
					GUI.DrawTexture(val2, (Texture)(object)_blackTex, (ScaleMode)0, false);
					GUI.color = color;
				}
				Color val3 = KindColor(kind);
				Color color2 = GUI.color;
				GUI.color = new Color(val3.r, val3.g, val3.b, 0.95f);
				GUI.DrawTexture(val2, (Texture)(object)val, (ScaleMode)2, true);
				GUI.color = color2;
			}
		}

		private Texture2D BuildShapeCircle(int w, int h)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			float num = (float)(w - 1) * 0.5f;
			float num2 = (float)(h - 1) * 0.5f;
			float num3 = (float)Mathf.Min(w, h) * 0.38f;
			float num4 = num3 * num3;
			for (int i = 0; i < h; i++)
			{
				for (int j = 0; j < w; j++)
				{
					float num5 = (float)j - num;
					float num6 = (float)i - num2;
					float num7 = num5 * num5 + num6 * num6;
					float num8 = ((num7 <= num4) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num8));
				}
			}
			val.Apply(false, true);
			return val;
		}

		private Texture2D BuildShapeTriangle(int w, int h)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			for (int i = 0; i < h; i++)
			{
				float num = (float)i / (float)(h - 1);
				int num2 = (int)(num * ((float)w * 0.5f));
				int num3 = w / 2;
				int num4 = num3 - num2;
				int num5 = num3 + num2;
				for (int j = 0; j < w; j++)
				{
					float num6 = ((j >= num4 && j <= num5) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num6));
				}
			}
			val.Apply(false, true);
			return val;
		}

		private Texture2D BuildShapeDiamond(int w, int h)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			int num = w / 2;
			int num2 = h / 2;
			for (int i = 0; i < h; i++)
			{
				int num3 = Mathf.Abs(i - num2);
				int num4 = Mathf.Max(0, h / 2 - num3);
				for (int j = 0; j < w; j++)
				{
					int num5 = Mathf.Abs(j - num);
					float num6 = ((num5 <= num4) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num6));
				}
			}
			val.Apply(false, true);
			return val;
		}

		private Texture2D BuildShapeX(int w, int h)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			((Texture)val).wrapMode = (TextureWrapMode)1;
			((Texture)val).filterMode = (FilterMode)1;
			int num = Mathf.Max(1, w / 10);
			for (int i = 0; i < h; i++)
			{
				for (int j = 0; j < w; j++)
				{
					bool flag = Mathf.Abs(j - i) <= num;
					bool flag2 = Mathf.Abs(w - 1 - j - i) <= num;
					float num2 = ((flag || flag2) ? 1f : 0f);
					val.SetPixel(j, i, new Color(1f, 1f, 1f, num2));
				}
			}
			val.Apply(false, true);
			return val;
		}
	}

	[HarmonyPatch]
	private static class ZSFX_Play_Patch
	{
		[CompilerGenerated]
		private sealed class <TargetMethods>d__0 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private MethodBase <>2__current;

			private int <>l__initialThreadId;

			private Type <t>5__1;

			private MethodInfo[] <ms>5__2;

			private int <i>5__3;

			private MethodInfo <m>5__4;

			private string <n>5__5;

			MethodBase IEnumerator<MethodBase>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <TargetMethods>d__0(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<t>5__1 = null;
				<ms>5__2 = null;
				<m>5__4 = null;
				<n>5__5 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					goto IL_013f;
				}
				<>1__state = -1;
				<t>5__1 = typeof(ZSFX);
				<ms>5__2 = null;
				try
				{
					<ms>5__2 = <t>5__1.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPu