Decompiled source of SledNameStyler v0.2.0

SledNameStyler.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using MelonLoader;
using MelonLoader.Preferences;
using SledNameStyler;
using SledNameStyler.Menu;
using SledNameStyler.Util;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SledNameStyler")]
[assembly: AssemblyFileVersion("0.2.0")]
[assembly: MelonInfo(typeof(Mod), "SledNameStyler", "0.2.0", "Natebag", null)]
[assembly: MelonGame("The Sledding Corporation", "Sledding Game")]
[assembly: MelonColor(255, 255, 102, 204)]
[assembly: MelonAuthorColor(255, 80, 160, 255)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyVersion("0.2.0.0")]
namespace SledNameStyler
{
	public sealed class Mod : MelonMod
	{
		public enum ApplyStatus
		{
			Disabled,
			WaitingForLobby,
			Applied
		}

		public const string Name = "SledNameStyler";

		public const string Version = "0.2.0";

		public const string Author = "Natebag";

		private static MelonPreferences_Category _cat;

		private static MelonPreferences_Entry<bool> _enabled;

		private static MelonPreferences_Entry<string> _name;

		private static MelonPreferences_Entry<string> _style;

		private static MelonPreferences_Entry<bool> _bold;

		private static MelonPreferences_Entry<bool> _italic;

		private static MelonPreferences_Entry<bool> _underline;

		private static MelonPreferences_Entry<bool> _strike;

		private static MelonPreferences_Entry<int> _sizePct;

		private static MelonPreferences_Entry<float> _animSpeed;

		private static MelonPreferences_Entry<string> _transform;

		private static MelonPreferences_Entry<string> _decoration;

		private static MelonPreferences_Entry<string> _glow;

		private static MelonPreferences_Entry<bool> _hotkeyEnabled;

		private static MelonPreferences_Entry<int> _menuKey;

		private static MelonPreferences_Entry<int> _toggleKey;

		private static Type _ctrlType;

		private static Type _gameInfoType;

		private static PropertyInfo _giInstanceProp;

		private static PropertyInfo _giNameProp;

		private static string _originalName = "";

		private static bool _hasOriginal;

		private static bool _hookInstalled;

		private static bool _wasDisabledLastFrame;

		private static string _lastWrittenPreview = "";

		private static int _wroteThisSecond;

		private static int _lastWriteSecond;

		private static bool _prefDirty;

		private static float _lastSaveTime;

		private const float SaveDebounceSeconds = 1.5f;

		public static ApplyStatus Status { get; private set; } = ApplyStatus.WaitingForLobby;


		public static string OriginalName => _originalName ?? "";

		public static bool HasOriginal => _hasOriginal;

		public static string LastWrittenPreview => _lastWrittenPreview;

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

		public static string NameOverride
		{
			get
			{
				return _name?.Value ?? "";
			}
			set
			{
				if (_name != null && _name.Value != value)
				{
					_name.Value = value ?? "";
					MarkDirty();
				}
			}
		}

		public static string CurrentStyle
		{
			get
			{
				return _style?.Value ?? "rainbow-wave";
			}
			set
			{
				if (_style != null && _style.Value != value)
				{
					_style.Value = value;
					MarkDirty();
				}
			}
		}

		public static bool Bold
		{
			get
			{
				return _bold?.Value ?? false;
			}
			set
			{
				if (_bold != null && _bold.Value != value)
				{
					_bold.Value = value;
					MarkDirty();
				}
			}
		}

		public static bool Italic
		{
			get
			{
				return _italic?.Value ?? false;
			}
			set
			{
				if (_italic != null && _italic.Value != value)
				{
					_italic.Value = value;
					MarkDirty();
				}
			}
		}

		public static bool Underline
		{
			get
			{
				return _underline?.Value ?? false;
			}
			set
			{
				if (_underline != null && _underline.Value != value)
				{
					_underline.Value = value;
					MarkDirty();
				}
			}
		}

		public static bool Strike
		{
			get
			{
				return _strike?.Value ?? false;
			}
			set
			{
				if (_strike != null && _strike.Value != value)
				{
					_strike.Value = value;
					MarkDirty();
				}
			}
		}

		public static int SizePct
		{
			get
			{
				return _sizePct?.Value ?? 100;
			}
			set
			{
				if (_sizePct != null && _sizePct.Value != value)
				{
					_sizePct.Value = value;
					MarkDirty();
				}
			}
		}

		public static float AnimSpeed
		{
			get
			{
				return _animSpeed?.Value ?? 1f;
			}
			set
			{
				if (_animSpeed != null && Math.Abs(_animSpeed.Value - value) > 0.001f)
				{
					_animSpeed.Value = value;
					MarkDirty();
				}
			}
		}

		public static string Transform
		{
			get
			{
				return _transform?.Value ?? "none";
			}
			set
			{
				if (_transform != null && _transform.Value != value)
				{
					_transform.Value = value;
					MarkDirty();
				}
			}
		}

		public static string Decoration
		{
			get
			{
				return _decoration?.Value ?? "none";
			}
			set
			{
				if (_decoration != null && _decoration.Value != value)
				{
					_decoration.Value = value;
					MarkDirty();
				}
			}
		}

		public static string Glow
		{
			get
			{
				return _glow?.Value ?? "none";
			}
			set
			{
				if (_glow != null && _glow.Value != value)
				{
					_glow.Value = value;
					MarkDirty();
				}
			}
		}

		public static void SaveNow()
		{
			try
			{
				MelonPreferences.Save();
				_prefDirty = false;
				_lastSaveTime = Time.time;
			}
			catch
			{
			}
		}

		private static string MigrateStyle(string s)
		{
			if (1 == 0)
			{
			}
			string result = s switch
			{
				"rainbow-wave" => "rainbow", 
				"rainbow-cycle" => "rainbow", 
				"pulse-red" => "red", 
				"pulse-blue" => "blue", 
				"pulse-green" => "green", 
				"pulse-pink" => "pink", 
				"marquee" => "chrome", 
				"marquee-gold" => "gold", 
				"breathe" => "pink", 
				"party" => "rainbow", 
				"bounce" => "ocean", 
				"wave-blue" => "ocean", 
				"shake" => "matrix", 
				"flicker" => "confetti", 
				"chrome-shimmer" => "chrome", 
				"fire-anim" => "fire", 
				"typewriter" => "white", 
				"mystery" => "grayscale", 
				"scramble" => "confetti", 
				_ => s, 
			};
			if (1 == 0)
			{
			}
			return result;
		}

		private static void MarkDirty()
		{
			_prefDirty = true;
		}

		public override void OnInitializeMelon()
		{
			//IL_037c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0388: Expected O, but got Unknown
			//IL_0395: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: Expected O, but got Unknown
			SafeLog.Bind(((MelonBase)this).LoggerInstance);
			try
			{
				_cat = MelonPreferences.CreateCategory("SledNameStyler", "SledNameStyler");
				_enabled = _cat.CreateEntry<bool>("Enabled", true, "Enabled", "Master switch. Set false to restore your real name and disable styling.", false, false, (ValueValidator)null, (string)null);
				_name = _cat.CreateEntry<string>("Name", "", "Name", "Optional base name override. Empty = use your normal username.", false, false, (ValueValidator)null, (string)null);
				_style = _cat.CreateEntry<string>("Style", "rainbow-wave", "Style", "Active style preset. Press the menu hotkey to pick from the full list.", false, false, (ValueValidator)null, (string)null);
				_bold = _cat.CreateEntry<bool>("Bold", false, "Bold", "", false, false, (ValueValidator)null, (string)null);
				_italic = _cat.CreateEntry<bool>("Italic", false, "Italic", "", false, false, (ValueValidator)null, (string)null);
				_underline = _cat.CreateEntry<bool>("Underline", false, "Underline", "", false, false, (ValueValidator)null, (string)null);
				_strike = _cat.CreateEntry<bool>("Strikethrough", false, "Strikethrough", "", false, false, (ValueValidator)null, (string)null);
				_sizePct = _cat.CreateEntry<int>("SizePercent", 100, "SizePercent", "Font size as a percent (50-250 typical). 100 = normal.", false, false, (ValueValidator)null, (string)null);
				_animSpeed = _cat.CreateEntry<float>("AnimationSpeed", 1f, "AnimationSpeed", "Speed multiplier (kept for compatibility — animated styles were removed in 0.2 because the game freezes the nameplate after the first frame).", false, false, (ValueValidator)null, (string)null);
				_transform = _cat.CreateEntry<string>("Transform", "none", "Transform", "Letter transform: none, uppercase, lowercase, fullwidth, bubble, smallcaps.", false, false, (ValueValidator)null, (string)null);
				_decoration = _cat.CreateEntry<string>("Decoration", "none", "Decoration", "Wraps your name with chars. Options: none, stars, sparkles, hearts, diamonds, crowns, swords, skulls, music, brackets, squarebrackets, parens, chevrons, arrows, waves, dots, vip, pro, mvp, god.", false, false, (ValueValidator)null, (string)null);
				_glow = _cat.CreateEntry<string>("Glow", "none", "Glow", "Background highlight glow color. Options: none, red, orange, yellow, green, cyan, blue, purple, pink, white, black.", false, false, (ValueValidator)null, (string)null);
				_hotkeyEnabled = _cat.CreateEntry<bool>("HotkeyEnabled", true, "HotkeyEnabled", "Allow the menu/toggle hotkeys.", false, false, (ValueValidator)null, (string)null);
				_menuKey = _cat.CreateEntry<int>("MenuHotkeyKeyCode", 292, "MenuHotkeyKeyCode", "UnityEngine.KeyCode integer for the open-menu hotkey. F11 = 292. F9 = 290, F10 = 291, F12 = 293, End = 279.", false, false, (ValueValidator)null, (string)null);
				_toggleKey = _cat.CreateEntry<int>("ToggleHotkeyKeyCode", 293, "ToggleHotkeyKeyCode", "UnityEngine.KeyCode integer for the on/off-toggle hotkey.", false, false, (ValueValidator)null, (string)null);
				string text = MigrateStyle(_style.Value);
				if (text != _style.Value)
				{
					SafeLog.Info($"SledNameStyler: migrated style '{_style.Value}' -> '{text}' (animated styles removed)");
					_style.Value = text;
					_prefDirty = true;
				}
				_ctrlType = Refl.FindType("Assembly-CSharp", "PlayerUsernameController");
				if (_ctrlType == null)
				{
					SafeLog.Warn("SledNameStyler: PlayerUsernameController not found at init — will retry per frame");
				}
				_gameInfoType = Refl.FindType("Assembly-CSharp", "_Scripts.Managers.GameInfo");
				if (_gameInfoType != null)
				{
					_giInstanceProp = _gameInfoType.GetProperty("Instance", BindingFlags.Static | BindingFlags.Public);
					_giNameProp = _gameInfoType.GetProperty("PlayerName", BindingFlags.Instance | BindingFlags.Public);
				}
				if (!_hookInstalled)
				{
					((MelonEventBase<LemonAction>)(object)MelonEvents.OnUpdate).Subscribe(new LemonAction(OnFrame), 0, false);
					((MelonEventBase<LemonAction>)(object)MelonEvents.OnGUI).Subscribe(new LemonAction(OnGui), 0, false);
					_hookInstalled = true;
				}
				SafeLog.Info($"SledNameStyler v{"0.2.0"} ready — {NameStyler.StyleNames.Count} styles. Style='{_style.Value}', menu={_menuKey.Value}, toggle={_toggleKey.Value}.");
			}
			catch (Exception value)
			{
				((MelonBase)this).LoggerInstance.Error($"SledNameStyler init failed: {value}");
			}
		}

		private static void OnFrame()
		{
			if (_enabled == null)
			{
				return;
			}
			try
			{
				if (_hotkeyEnabled.Value)
				{
					if (Input.GetKeyDown((KeyCode)_menuKey.Value))
					{
						StyleMenu.Instance.Toggle();
					}
					if (Input.GetKeyDown((KeyCode)_toggleKey.Value))
					{
						ToggleEnabled();
					}
				}
				if (_prefDirty && Time.time - _lastSaveTime > 1.5f)
				{
					SaveNow();
				}
				if (!_enabled.Value)
				{
					Status = ApplyStatus.Disabled;
					if (!_wasDisabledLastFrame && _hasOriginal)
					{
						WriteEverywhere(_originalName);
					}
					_wasDisabledLastFrame = true;
					return;
				}
				_wasDisabledLastFrame = false;
				if (!_hasOriginal)
				{
					string text = ReadGameInfoName();
					if (string.IsNullOrEmpty(text))
					{
						text = ReadSyncUsername();
					}
					if (!string.IsNullOrEmpty(text))
					{
						_originalName = NameStyler.StripMarkup(text);
						_hasOriginal = true;
						SafeLog.Info("SledNameStyler: captured original name '" + _originalName + "'");
					}
				}
				string text2 = (_name.Value ?? "").Trim();
				if (string.IsNullOrEmpty(text2))
				{
					if (!_hasOriginal)
					{
						Status = ApplyStatus.WaitingForLobby;
						return;
					}
					text2 = _originalName;
				}
				else
				{
					text2 = NameStyler.StripMarkup(text2);
				}
				if (string.IsNullOrEmpty(text2))
				{
					Status = ApplyStatus.WaitingForLobby;
					return;
				}
				string s = TextTransform.Apply(text2, _transform.Value);
				string baseName = NameDecoration.Apply(s, _decoration.Value);
				float time = Time.time * Mathf.Max(_animSpeed.Value, 0.01f);
				string content = NameStyler.Render(baseName, _style.Value, time);
				string s2 = NameGlow.Wrap(content, _glow.Value);
				string text3 = NameStyler.Decorate(s2, _bold.Value, _italic.Value, _underline.Value, _strike.Value, _sizePct.Value);
				WriteEverywhere(text3);
				_lastWrittenPreview = text3;
				Status = ApplyStatus.Applied;
			}
			catch
			{
			}
		}

		public static void ForceApply()
		{
			try
			{
				string text = ReadGameInfoName();
				if (string.IsNullOrEmpty(text))
				{
					text = ReadSyncUsername();
				}
				if (!string.IsNullOrEmpty(text))
				{
					_originalName = NameStyler.StripMarkup(text);
					_hasOriginal = true;
					SafeLog.Info("SledNameStyler.ForceApply: captured original '" + _originalName + "'");
				}
				else if (!_hasOriginal)
				{
					SafeLog.Warn("SledNameStyler.ForceApply: couldn't read a name from GameInfo or PlayerUsernameController");
				}
				SaveNow();
			}
			catch (Exception ex)
			{
				SafeLog.Error("Mod.ForceApply", ex);
			}
		}

		public static void RecaptureOriginal()
		{
			_hasOriginal = false;
			_originalName = "";
			SafeLog.Info("SledNameStyler: cleared captured original (will re-read next frame)");
		}

		private static void OnGui()
		{
			try
			{
				StyleMenu.Instance.Render();
			}
			catch (Exception ex)
			{
				SafeLog.Error("SledNameStyler.OnGui", ex);
			}
		}

		private static void ToggleEnabled()
		{
			if (_enabled != null)
			{
				_enabled.Value = !_enabled.Value;
				SaveNow();
				SafeLog.Info("SledNameStyler: " + (_enabled.Value ? "enabled" : "disabled"));
			}
		}

		private static void WriteEverywhere(string value)
		{
			WriteSyncUsername(value);
			WriteGameInfoName(value);
		}

		private static void EnsureCtrlType()
		{
			if (_ctrlType == null)
			{
				_ctrlType = Refl.FindType("Assembly-CSharp", "PlayerUsernameController");
			}
		}

		private static string ReadSyncUsername()
		{
			try
			{
				EnsureCtrlType();
				if (_ctrlType == null)
				{
					return "";
				}
				Type val = Il2CppType.From(_ctrlType);
				Il2CppReferenceArray<Object> val2 = Object.FindObjectsOfType(val);
				if (val2 == null)
				{
					return "";
				}
				foreach (Object item in (Il2CppArrayBase<Object>)(object)val2)
				{
					if (item == (Object)null)
					{
						continue;
					}
					object obj = Refl.CastToIl2Cpp(item, _ctrlType);
					if (obj == null)
					{
						continue;
					}
					PropertyInfo property = obj.GetType().GetProperty("IsOwner", BindingFlags.Instance | BindingFlags.Public);
					if (property == null)
					{
						continue;
					}
					object value = property.GetValue(obj);
					if (value != null && (bool)value)
					{
						FieldInfo field = obj.GetType().GetField("sync_Username", BindingFlags.Instance | BindingFlags.Public);
						object obj2 = ((field != null) ? field.GetValue(obj) : null);
						if (obj2 != null)
						{
							return (obj2.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public)?.GetValue(obj2) as string) ?? "";
						}
					}
				}
			}
			catch
			{
			}
			return "";
		}

		private static void WriteSyncUsername(string value)
		{
			try
			{
				EnsureCtrlType();
				if (_ctrlType == null)
				{
					return;
				}
				Type val = Il2CppType.From(_ctrlType);
				Il2CppReferenceArray<Object> val2 = Object.FindObjectsOfType(val);
				if (val2 == null || ((Il2CppArrayBase<Object>)(object)val2).Length == 0)
				{
					return;
				}
				object obj = null;
				foreach (Object item in (Il2CppArrayBase<Object>)(object)val2)
				{
					if (item == (Object)null)
					{
						continue;
					}
					object obj2 = Refl.CastToIl2Cpp(item, _ctrlType);
					if (obj2 == null)
					{
						continue;
					}
					PropertyInfo property = obj2.GetType().GetProperty("IsOwner", BindingFlags.Instance | BindingFlags.Public);
					if (!(property == null))
					{
						object value2 = property.GetValue(obj2);
						if (value2 != null && (bool)value2)
						{
							obj = obj2;
							break;
						}
					}
				}
				if (obj == null)
				{
					obj = Refl.CastToIl2Cpp(((Il2CppArrayBase<Object>)(object)val2)[0], _ctrlType);
				}
				if (obj != null)
				{
					object obj3 = obj.GetType().GetField("sync_Username", BindingFlags.Instance | BindingFlags.Public)?.GetValue(obj);
					(obj3?.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public))?.SetValue(obj3, value);
				}
			}
			catch
			{
			}
		}

		private static void WriteGameInfoName(string value)
		{
			if (_giInstanceProp == null || _giNameProp == null)
			{
				return;
			}
			try
			{
				object value2 = _giInstanceProp.GetValue(null);
				if (value2 != null)
				{
					object obj = Refl.CastToIl2Cpp(value2, _gameInfoType) ?? value2;
					_giNameProp.SetValue(obj, value);
				}
			}
			catch
			{
			}
		}

		private static string ReadGameInfoName()
		{
			if (_giInstanceProp == null || _giNameProp == null)
			{
				return "";
			}
			try
			{
				object value = _giInstanceProp.GetValue(null);
				if (value == null)
				{
					return "";
				}
				object obj = Refl.CastToIl2Cpp(value, _gameInfoType) ?? value;
				return (_giNameProp.GetValue(obj) as string) ?? "";
			}
			catch
			{
				return "";
			}
		}
	}
	internal static class TextTransform
	{
		public static readonly IReadOnlyList<string> Names = new string[6] { "none", "uppercase", "lowercase", "fullwidth", "bubble", "smallcaps" };

		private static readonly char[] _smallcaps = new char[26]
		{
			'ᴀ', 'ʙ', 'ᴄ', 'ᴅ', 'ᴇ', 'ꜰ', 'ɢ', 'ʜ', 'ɪ', 'ᴊ',
			'ᴋ', 'ʟ', 'ᴍ', 'ɴ', 'ᴏ', 'ᴘ', 'ǫ', 'ʀ', 'ꜱ', 'ᴛ',
			'ᴜ', 'ᴠ', 'ᴡ', 'x', 'ʏ', 'ᴢ'
		};

		public static string Apply(string s, string mode)
		{
			if (string.IsNullOrEmpty(s) || string.IsNullOrEmpty(mode) || mode == "none")
			{
				return s;
			}
			return mode switch
			{
				"uppercase" => s.ToUpperInvariant(), 
				"lowercase" => s.ToLowerInvariant(), 
				"fullwidth" => MapPerChar(s, FullwidthChar), 
				"bubble" => MapPerChar(s, BubbleChar), 
				"smallcaps" => MapPerChar(s, SmallcapChar), 
				_ => s, 
			};
		}

		private static string MapPerChar(string s, Func<char, string> map)
		{
			StringBuilder stringBuilder = new StringBuilder(s.Length * 2);
			foreach (char arg in s)
			{
				stringBuilder.Append(map(arg));
			}
			return stringBuilder.ToString();
		}

		private static string FullwidthChar(char c)
		{
			if (c == ' ')
			{
				return "\u3000";
			}
			if (c >= '!' && c <= '~')
			{
				return ((char)(c - 32 + 65280)).ToString();
			}
			return c.ToString();
		}

		private static string BubbleChar(char c)
		{
			if (c >= 'A' && c <= 'Z')
			{
				return ((char)(c - 65 + 9398)).ToString();
			}
			if (c >= 'a' && c <= 'z')
			{
				return ((char)(c - 97 + 9424)).ToString();
			}
			if (c == '0')
			{
				return "⓪";
			}
			if (c >= '1' && c <= '9')
			{
				return ((char)(c - 49 + 9312)).ToString();
			}
			return c.ToString();
		}

		private static string SmallcapChar(char c)
		{
			char c2 = c;
			if (c >= 'A' && c <= 'Z')
			{
				c2 = (char)(c - 65 + 97);
			}
			if (c2 >= 'a' && c2 <= 'z')
			{
				return _smallcaps[c2 - 97].ToString();
			}
			return c.ToString();
		}
	}
	internal static class NameDecoration
	{
		private struct Pair
		{
			public string L;

			public string R;

			public Pair(string l, string r)
			{
				L = l;
				R = r;
			}
		}

		private static readonly Dictionary<string, Pair> _wraps = new Dictionary<string, Pair>(StringComparer.OrdinalIgnoreCase)
		{
			["none"] = new Pair("", ""),
			["stars"] = new Pair("★ ", " ★"),
			["sparkles"] = new Pair("✦ ", " ✦"),
			["hearts"] = new Pair("♥ ", " ♥"),
			["diamonds"] = new Pair("♦ ", " ♦"),
			["crowns"] = new Pair("♚ ", " ♚"),
			["swords"] = new Pair("⚔ ", " ⚔"),
			["skulls"] = new Pair("☠ ", " ☠"),
			["music"] = new Pair("♫ ", " ♫"),
			["brackets"] = new Pair("「 ", " 」"),
			["squarebrackets"] = new Pair("[ ", " ]"),
			["parens"] = new Pair("( ", " )"),
			["chevrons"] = new Pair("« ", " »"),
			["arrows"] = new Pair("» ", " «"),
			["waves"] = new Pair("~ ", " ~"),
			["dots"] = new Pair("• ", " •"),
			["vip"] = new Pair("[VIP] ", ""),
			["pro"] = new Pair("[PRO] ", ""),
			["mvp"] = new Pair("[MVP] ", ""),
			["god"] = new Pair("[GOD] ", "")
		};

		public static IReadOnlyList<string> Names { get; } = new List<string>(_wraps.Keys);


		public static string Apply(string s, string mode)
		{
			if (string.IsNullOrEmpty(mode) || mode == "none" || string.IsNullOrEmpty(s))
			{
				return s;
			}
			if (_wraps.TryGetValue(mode, out var value))
			{
				return value.L + s + value.R;
			}
			return s;
		}
	}
	internal static class NameGlow
	{
		private static readonly Dictionary<string, string> _hex = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
		{
			["none"] = null,
			["red"] = "FF334488",
			["orange"] = "FF880088",
			["yellow"] = "FFCC0088",
			["green"] = "22DD5588",
			["cyan"] = "00CCFF88",
			["blue"] = "3366FF88",
			["purple"] = "9933FF88",
			["pink"] = "FF66CC88",
			["white"] = "FFFFFF55",
			["black"] = "11111188"
		};

		public static IReadOnlyList<string> Names { get; } = new List<string>(_hex.Keys);


		public static string Wrap(string content, string color)
		{
			if (string.IsNullOrEmpty(content))
			{
				return content;
			}
			if (string.IsNullOrEmpty(color) || color == "none")
			{
				return content;
			}
			if (!_hex.TryGetValue(color, out var value) || value == null)
			{
				return content;
			}
			return $"<mark=#{value}>{content}</mark>";
		}
	}
	internal static class NameStyler
	{
		public delegate string Renderer(string baseName, float time);

		internal struct ColorRgb
		{
			public float R;

			public float G;

			public float B;

			public ColorRgb(float r, float g, float b)
			{
				R = r;
				G = g;
				B = b;
			}
		}

		private static readonly Dictionary<string, Renderer> _styles;

		private static readonly List<string> _names;

		private static readonly Regex _stripMarkup;

		public static IReadOnlyList<string> StyleNames => _names;

		static NameStyler()
		{
			_styles = new Dictionary<string, Renderer>(StringComparer.OrdinalIgnoreCase);
			_names = new List<string>();
			_stripMarkup = new Regex("<[^>]+>", RegexOptions.Compiled);
			Register();
		}

		public static string StripMarkup(string s)
		{
			return string.IsNullOrEmpty(s) ? "" : _stripMarkup.Replace(s, "");
		}

		public static string Render(string baseName, string styleName, float time)
		{
			if (string.IsNullOrEmpty(baseName))
			{
				return "";
			}
			if (string.IsNullOrEmpty(styleName))
			{
				return baseName;
			}
			if (_styles.TryGetValue(styleName, out var value))
			{
				try
				{
					return value(baseName, time);
				}
				catch
				{
					return baseName;
				}
			}
			return baseName;
		}

		public static string Decorate(string s, bool bold, bool italic, bool underline, bool strike, int sizePct)
		{
			StringBuilder stringBuilder = new StringBuilder(s.Length + 32);
			bool flag = sizePct > 0 && sizePct != 100;
			if (flag)
			{
				stringBuilder.Append("<size=").Append(sizePct).Append("%>");
			}
			if (bold)
			{
				stringBuilder.Append("<b>");
			}
			if (italic)
			{
				stringBuilder.Append("<i>");
			}
			if (underline)
			{
				stringBuilder.Append("<u>");
			}
			if (strike)
			{
				stringBuilder.Append("<s>");
			}
			stringBuilder.Append(s);
			if (strike)
			{
				stringBuilder.Append("</s>");
			}
			if (underline)
			{
				stringBuilder.Append("</u>");
			}
			if (italic)
			{
				stringBuilder.Append("</i>");
			}
			if (bold)
			{
				stringBuilder.Append("</b>");
			}
			if (flag)
			{
				stringBuilder.Append("</size>");
			}
			return stringBuilder.ToString();
		}

		private static void Register()
		{
			Solid("none", null);
			Solid("white", "FFFFFF");
			Solid("black", "111111");
			Solid("red", "FF3344");
			Solid("orange", "FF8800");
			Solid("yellow", "FFCC00");
			Solid("lime", "AAFF22");
			Solid("green", "22DD55");
			Solid("mint", "66FFCC");
			Solid("cyan", "00CCFF");
			Solid("blue", "3366FF");
			Solid("purple", "9933FF");
			Solid("magenta", "FF22AA");
			Solid("pink", "FF66CC");
			Solid("gold", "DAA520");
			Solid("silver", "C0C0C0");
			Gradient("fire", new string[3] { "FFEE44", "FF8800", "FF2222" });
			Gradient("ice", new string[3] { "FFFFFF", "AAEEFF", "3366FF" });
			Gradient("galaxy", new string[3] { "9933FF", "FF44AA", "3366FF" });
			Gradient("sunset", new string[3] { "FFCC66", "FF6688", "AA33CC" });
			Gradient("sunrise", new string[3] { "FFEE44", "FF88AA", "DD3344" });
			Gradient("dusk", new string[3] { "FF8844", "AA44CC", "223388" });
			Gradient("ocean", new string[3] { "00FFCC", "00AACC", "0044AA" });
			Gradient("deepsea", new string[3] { "00CCAA", "0066AA", "112255" });
			Gradient("toxic", new string[3] { "DDFF22", "55DD22", "117711" });
			Gradient("candy", new string[3] { "FF66CC", "AA66FF", "66CCFF" });
			Gradient("bubblegum", new string[3] { "FF77CC", "FFFFFF", "66DDFF" });
			Gradient("cyberpunk", new string[3] { "00FFEE", "FF22AA", "FFEE00" });
			Gradient("plasma", new string[3] { "00FFEE", "FF22AA", "FFCC00" });
			Gradient("grayscale", new string[3] { "FFFFFF", "808080", "222222" });
			Gradient("lava", new string[4] { "FFEE99", "FF8800", "DD2200", "660000" });
			Gradient("blood", new string[3] { "660000", "DD0022", "FF4444" });
			Gradient("neon", new string[3] { "AAFF22", "00FFEE", "FF22AA" });
			Gradient("aurora", new string[3] { "22EE88", "00CCFF", "AA66FF" });
			Gradient("sakura", new string[3] { "FFCCEE", "FF88BB", "FFCCEE" });
			Gradient("royal", new string[3] { "FFD700", "8833DD", "440088" });
			Gradient("rosegold", new string[3] { "FFD8B0", "FFA0A0", "DD7799" });
			Gradient("forest", new string[3] { "AAFF44", "22AA33", "445522" });
			Gradient("jungle", new string[3] { "AAEE44", "228833", "554422" });
			Gradient("ember", new string[3] { "FFFFCC", "FFAA22", "DD3300" });
			Gradient("arctic", new string[3] { "FFFFFF", "AADDFF", "5577CC" });
			Gradient("cottoncandy", new string[3] { "FFCCEE", "DDBBFF", "BBDDFF" });
			Gradient("tropical", new string[3] { "FFEE22", "00DDAA", "00AAFF" });
			Gradient("dreamsicle", new string[3] { "FFFFEE", "FFCC88", "FF8844" });
			Gradient("emerald", new string[3] { "EEFFEE", "44DD66", "117733" });
			Gradient("twilight", new string[3] { "AA44CC", "FF6688", "FF9944" });
			Gradient("nebula", new string[3] { "AA44FF", "FF44AA", "44CCFF" });
			Gradient("watermelon", new string[3] { "55DD55", "FFFFFF", "FF3366" });
			Gradient("peacock", new string[3] { "00DDCC", "0099CC", "224488" });
			Gradient("chrome", new string[3] { "FFFFFF", "888899", "DDDDEE" });
			Cycle("pride", new string[6] { "FF3344", "FF8800", "FFCC00", "22DD55", "3366FF", "9933FF" });
			Cycle("ace", new string[4] { "111111", "808080", "FFFFFF", "800080" });
			Cycle("candycane", new string[2] { "FF2233", "FFFFFF" });
			Cycle("zebra", new string[2] { "111111", "FFFFFF" });
			Cycle("bumblebee", new string[2] { "FFCC00", "111111" });
			Cycle("pumpkin", new string[2] { "FF7700", "111111" });
			Cycle("mintcookie", new string[2] { "66FFCC", "222222" });
			Cycle("cyberlines", new string[2] { "00FFEE", "FF22AA" });
			Cycle("rainbow", new string[8] { "FF3344", "FF8800", "FFCC00", "22DD55", "00CCFF", "3366FF", "9933FF", "FF66CC" });
			Banded("canada", new string[3] { "FF0000", "FFFFFF", "FF0000" });
			Banded("france", new string[3] { "0055A4", "FFFFFF", "EF4135" });
			Banded("germany", new string[3] { "111111", "DD0000", "FFCC00" });
			Banded("italy", new string[3] { "008C45", "FFFFFF", "CD212A" });
			Banded("ireland", new string[3] { "169B62", "FFFFFF", "FF883E" });
			Banded("mexico", new string[3] { "006847", "FFFFFF", "CE1126" });
			Banded("netherlands", new string[3] { "AE1C28", "FFFFFF", "21468B" });
			Banded("usa", new string[3] { "BB1133", "FFFFFF", "1144AA" });
			Banded("argentina", new string[3] { "75AADB", "FFFFFF", "75AADB" });
			Banded("spain", new string[3] { "AA151B", "F1BF00", "AA151B" });
			Banded("austria", new string[3] { "C8102E", "FFFFFF", "C8102E" });
			Banded("belgium", new string[3] { "111111", "FAE042", "EF3340" });
			Banded("india", new string[3] { "FF9933", "FFFFFF", "138808" });
			Banded("thailand", new string[3] { "ED1C24", "F4F5F8", "241D4F" });
			Banded("portugal", new string[3] { "046A38", "FFFFFF", "DA291C" });
			_styles["confetti"] = (string n, float _) => Flicker(n, 0f);
			_names.Add("confetti");
			_styles["glitch"] = (string n, float _) => Glitch(n, 0f);
			_names.Add("glitch");
			_styles["police"] = (string n, float _) => Police(n, 0f);
			_names.Add("police");
			_styles["matrix"] = (string n, float _) => Matrix(n, 0f);
			_names.Add("matrix");
			_styles["invisible"] = (string n, float _) => "<color=#FFFFFF00>" + n + "</color>";
			_names.Add("invisible");
		}

		private static void Solid(string key, string hex)
		{
			if (hex == null)
			{
				_styles[key] = (string n, float _) => n;
			}
			else
			{
				_styles[key] = (string n, float _) => $"<color=#{hex}>{n}</color>";
			}
			_names.Add(key);
		}

		private static void Gradient(string key, string[] stopHexes)
		{
			ColorRgb[] stops = new ColorRgb[stopHexes.Length];
			for (int i = 0; i < stopHexes.Length; i++)
			{
				stops[i] = ParseHex(stopHexes[i]);
			}
			_styles[key] = (string n, float _) => GradientPerChar(n, stops);
			_names.Add(key);
		}

		private static void Cycle(string key, string[] hexes)
		{
			_styles[key] = (string n, float _) => CyclingColors(n, hexes);
			_names.Add(key);
		}

		private static void Banded(string key, string[] hexes)
		{
			_styles[key] = (string n, float _) => BandedColors(n, hexes);
			_names.Add(key);
		}

		private static string GradientPerChar(string name, ColorRgb[] stops)
		{
			if (string.IsNullOrEmpty(name) || stops.Length == 0)
			{
				return name;
			}
			StringBuilder stringBuilder = new StringBuilder(name.Length * 18);
			for (int i = 0; i < name.Length; i++)
			{
				float t = ((name.Length == 1) ? 0f : ((float)i / (float)(name.Length - 1)));
				ColorRgb c = LerpStops(stops, t);
				stringBuilder.Append("<color=#").Append(HexFrom(c)).Append('>')
					.Append(name[i])
					.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static string CyclingColors(string name, string[] hexes)
		{
			if (string.IsNullOrEmpty(name) || hexes.Length == 0)
			{
				return name;
			}
			StringBuilder stringBuilder = new StringBuilder(name.Length * 18);
			for (int i = 0; i < name.Length; i++)
			{
				stringBuilder.Append("<color=#").Append(hexes[i % hexes.Length]).Append('>')
					.Append(name[i])
					.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static string BandedColors(string name, string[] hexes)
		{
			if (string.IsNullOrEmpty(name) || hexes.Length == 0)
			{
				return name;
			}
			int length = name.Length;
			int num = hexes.Length;
			StringBuilder stringBuilder = new StringBuilder();
			for (int i = 0; i < num; i++)
			{
				int num2 = i * length / num;
				int num3 = (i + 1) * length / num;
				if (num3 > num2)
				{
					stringBuilder.Append("<color=#").Append(hexes[i]).Append('>')
						.Append(name, num2, num3 - num2)
						.Append("</color>");
				}
			}
			return stringBuilder.ToString();
		}

		private static string Flicker(string name, float time)
		{
			string[] array = new string[7] { "FF3344", "FF8800", "FFCC00", "22DD55", "00CCFF", "9933FF", "FF66CC" };
			int seed = (int)(time * 8f);
			Random random = new Random(seed);
			StringBuilder stringBuilder = new StringBuilder(name.Length * 18);
			for (int i = 0; i < name.Length; i++)
			{
				stringBuilder.Append("<color=#").Append(array[random.Next(array.Length)]).Append('>')
					.Append(name[i])
					.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static string Glitch(string name, float time)
		{
			string[] array = new string[4] { "FF1144", "AA00FF", "00FFEE", "FFFFFF" };
			int seed = (int)(time * 12f);
			Random random = new Random(seed);
			StringBuilder stringBuilder = new StringBuilder(name.Length * 32);
			for (int i = 0; i < name.Length; i++)
			{
				string value = array[random.Next(array.Length)];
				bool flag = random.NextDouble() < 0.18;
				stringBuilder.Append("<color=#").Append(value).Append('>');
				if (flag)
				{
					stringBuilder.Append("<s>");
				}
				stringBuilder.Append(name[i]);
				if (flag)
				{
					stringBuilder.Append("</s>");
				}
				stringBuilder.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static string Police(string name, float time)
		{
			bool flag = (int)(time * 3f) % 2 == 0;
			StringBuilder stringBuilder = new StringBuilder(name.Length * 18);
			for (int i = 0; i < name.Length; i++)
			{
				string value = (((i % 2 == 0) ^ flag) ? "FF1133" : "1144FF");
				stringBuilder.Append("<color=#").Append(value).Append('>')
					.Append(name[i])
					.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static string Matrix(string name, float time)
		{
			int seed = (int)(time * 5f);
			Random random = new Random(seed);
			StringBuilder stringBuilder = new StringBuilder(name.Length * 18);
			for (int i = 0; i < name.Length; i++)
			{
				double num = random.NextDouble();
				string value = ((!(num < 0.05)) ? ((!(num < 0.7)) ? "008822" : "00FF44") : "FFFFFF");
				stringBuilder.Append("<color=#").Append(value).Append('>')
					.Append(name[i])
					.Append("</color>");
			}
			return stringBuilder.ToString();
		}

		private static ColorRgb ParseHex(string hex)
		{
			if (string.IsNullOrEmpty(hex) || hex.Length < 6)
			{
				return new ColorRgb(1f, 1f, 1f);
			}
			int num = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			int num2 = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			int num3 = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
			return new ColorRgb((float)num / 255f, (float)num2 / 255f, (float)num3 / 255f);
		}

		private static string HexFrom(ColorRgb c)
		{
			int value = Mathf.Clamp((int)(c.R * 255f + 0.5f), 0, 255);
			int value2 = Mathf.Clamp((int)(c.G * 255f + 0.5f), 0, 255);
			int value3 = Mathf.Clamp((int)(c.B * 255f + 0.5f), 0, 255);
			return $"{value:X2}{value2:X2}{value3:X2}";
		}

		private static ColorRgb Lerp(ColorRgb a, ColorRgb b, float t)
		{
			return new ColorRgb(a.R + (b.R - a.R) * t, a.G + (b.G - a.G) * t, a.B + (b.B - a.B) * t);
		}

		private static ColorRgb LerpStops(ColorRgb[] stops, float t)
		{
			if (stops.Length == 0)
			{
				return new ColorRgb(1f, 1f, 1f);
			}
			if (stops.Length == 1)
			{
				return stops[0];
			}
			t = Mathf.Clamp01(t);
			float num = t * (float)(stops.Length - 1);
			int num2 = (int)Math.Floor(num);
			if (num2 >= stops.Length - 1)
			{
				return stops[^1];
			}
			return Lerp(stops[num2], stops[num2 + 1], num - (float)num2);
		}
	}
}
namespace SledNameStyler.Util
{
	internal static class Refl
	{
		private static readonly Dictionary<string, Type> _typeCache = new Dictionary<string, Type>();

		private static bool _loggedAssemblies = false;

		private static MethodInfo _il2cppCastGeneric;

		public static Type FindType(string assemblyHint, string fullName)
		{
			if (_typeCache.TryGetValue(fullName, out var value))
			{
				return value;
			}
			try
			{
				string[] array = new string[2]
				{
					fullName,
					"Il2Cpp." + fullName
				};
				string[] array2 = new string[3]
				{
					assemblyHint,
					"Il2Cpp" + assemblyHint,
					assemblyHint + "-firstpass"
				};
				Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
				foreach (Assembly assembly in assemblies)
				{
					string name = assembly.GetName().Name;
					string[] array3 = array2;
					foreach (string text in array3)
					{
						if (name != text)
						{
							continue;
						}
						string[] array4 = array;
						foreach (string name2 in array4)
						{
							Type type = assembly.GetType(name2);
							if (type != null)
							{
								_typeCache[fullName] = type;
								return type;
							}
						}
					}
				}
				Assembly[] assemblies2 = AppDomain.CurrentDomain.GetAssemblies();
				foreach (Assembly assembly2 in assemblies2)
				{
					string[] array5 = array;
					foreach (string name3 in array5)
					{
						Type type2;
						try
						{
							type2 = assembly2.GetType(name3);
						}
						catch
						{
							continue;
						}
						if (type2 != null)
						{
							_typeCache[fullName] = type2;
							return type2;
						}
					}
				}
				Assembly[] assemblies3 = AppDomain.CurrentDomain.GetAssemblies();
				foreach (Assembly assembly3 in assemblies3)
				{
					Type[] types;
					try
					{
						types = assembly3.GetTypes();
					}
					catch (ReflectionTypeLoadException ex)
					{
						types = ex.Types;
					}
					catch
					{
						continue;
					}
					string text2 = fullName;
					int num = fullName.LastIndexOf('.');
					if (num >= 0 && num < fullName.Length - 1)
					{
						text2 = fullName.Substring(num + 1);
					}
					Type[] array6 = types;
					foreach (Type type3 in array6)
					{
						if (!(type3 == null) && (type3.FullName == fullName || type3.FullName == "Il2Cpp." + fullName || (type3.FullName != null && type3.FullName.EndsWith("." + fullName)) || type3.Name == fullName || type3.Name == text2))
						{
							_typeCache[fullName] = type3;
							SafeLog.Info($"Refl.FindType: '{fullName}' resolved via full scan as '{type3.FullName}' in {assembly3.GetName().Name}");
							return type3;
						}
					}
				}
				if (!_loggedAssemblies)
				{
					SafeLog.Warn("Refl.FindType: '" + fullName + "' not found. Loaded assemblies:");
					Assembly[] assemblies4 = AppDomain.CurrentDomain.GetAssemblies();
					foreach (Assembly assembly4 in assemblies4)
					{
						SafeLog.Warn("  - " + assembly4.GetName().Name);
					}
					_loggedAssemblies = true;
				}
				return null;
			}
			catch (Exception ex2)
			{
				SafeLog.Error($"Refl.FindType({assemblyHint},{fullName})", ex2);
				return null;
			}
		}

		public static object CastToIl2Cpp(object obj, Type targetType)
		{
			if (obj == null || targetType == null)
			{
				return null;
			}
			if (targetType.IsInstanceOfType(obj))
			{
				return obj;
			}
			try
			{
				if (_il2cppCastGeneric == null)
				{
					Type type = FindType("Il2CppInterop.Runtime", "Il2CppInterop.Runtime.InteropTypes.Il2CppObjectBase");
					if (type == null)
					{
						type = obj.GetType();
					}
					while (type != null)
					{
						MethodInfo method = type.GetMethod("Cast", BindingFlags.Instance | BindingFlags.Public);
						if (method != null && method.IsGenericMethodDefinition)
						{
							_il2cppCastGeneric = method;
							break;
						}
						type = type.BaseType;
					}
				}
				if (_il2cppCastGeneric == null)
				{
					return null;
				}
				MethodInfo methodInfo = _il2cppCastGeneric.MakeGenericMethod(targetType);
				return methodInfo.Invoke(obj, null);
			}
			catch (Exception ex)
			{
				SafeLog.Error("Refl.CastToIl2Cpp(" + targetType.FullName + ")", ex);
				return null;
			}
		}
	}
	internal static class SafeLog
	{
		private static Instance _logger;

		private static readonly LinkedList<string> _ring = new LinkedList<string>();

		private const int RingMax = 200;

		public static IEnumerable<string> Recent => _ring;

		public static void Bind(Instance logger)
		{
			_logger = logger;
		}

		public static void Info(string msg)
		{
			Instance logger = _logger;
			if (logger != null)
			{
				logger.Msg(msg);
			}
			Push("INFO  " + msg);
		}

		public static void Warn(string msg)
		{
			Instance logger = _logger;
			if (logger != null)
			{
				logger.Warning(msg);
			}
			Push("WARN  " + msg);
		}

		public static void Error(string msg, Exception ex = null)
		{
			if (_logger != null)
			{
				if (ex != null)
				{
					_logger.Error($"{msg}: {ex.GetType().Name}: {ex.Message}\n{ex.StackTrace}");
				}
				else
				{
					_logger.Error(msg);
				}
			}
			Push("ERROR " + ((ex != null) ? (msg + ": " + ex.Message) : msg));
		}

		private static void Push(string line)
		{
			_ring.AddLast(line);
			while (_ring.Count > 200)
			{
				_ring.RemoveFirst();
			}
		}
	}
}
namespace SledNameStyler.Menu
{
	internal sealed class StyleMenu
	{
		private const int W = 580;

		private const int H = 720;

		private Vector2 _styleScroll;

		private string _nameDraft = "";

		private static readonly Regex _stripUnsupported = new Regex("</?(voffset|cspace|mspace|rotate|sprite)[^>]*>", RegexOptions.Compiled);

		private static GUIStyle _label;

		private static GUIStyle _header;

		private static GUIStyle _btn;

		private static GUIStyle _btnSel;

		private static GUIStyle _tf;

		private static GUIStyle _preview;

		private static GUIStyle _help;

		private static Texture2D _bgTex;

		private CursorLockMode _savedLock;

		private bool _savedCursorVis;

		private bool _cursorOverridden;

		public static StyleMenu Instance { get; } = new StyleMenu();


		public bool Visible { get; private set; }

		public void Toggle()
		{
			Visible = !Visible;
			if (Visible)
			{
				OnShow();
			}
			else
			{
				OnHide();
			}
		}

		public void Hide()
		{
			if (Visible)
			{
				Visible = false;
				OnHide();
			}
		}

		private void OnShow()
		{
			//IL_0011: 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)
			try
			{
				if (!_cursorOverridden)
				{
					_savedLock = Cursor.lockState;
					_savedCursorVis = Cursor.visible;
					_cursorOverridden = true;
				}
				Cursor.lockState = (CursorLockMode)0;
				Cursor.visible = true;
				_nameDraft = Mod.NameOverride ?? "";
			}
			catch
			{
			}
		}

		private void OnHide()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (_cursorOverridden)
				{
					Cursor.lockState = _savedLock;
					Cursor.visible = _savedCursorVis;
					_cursorOverridden = false;
				}
				Mod.SaveNow();
			}
			catch
			{
			}
		}

		public void Render()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Invalid comparison between Unknown and I4
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Invalid comparison between Unknown and I4
			if (!Visible)
			{
				return;
			}
			try
			{
				EnsureStyles();
				int num = Mathf.Max(8, (Screen.width - 580) / 2);
				Rect val = default(Rect);
				((Rect)(ref val))..ctor((float)num, 8f, 580f, 720f);
				GUI.DrawTexture(val, (Texture)(object)_bgTex);
				GUILayout.BeginArea(new Rect(((Rect)(ref val)).x + 14f, ((Rect)(ref val)).y + 14f, ((Rect)(ref val)).width - 28f, ((Rect)(ref val)).height - 28f));
				try
				{
					RenderHeader();
					GUILayout.Space(4f);
					RenderStatus();
					GUILayout.Space(6f);
					RenderNameField();
					GUILayout.Space(6f);
					RenderPreview();
					GUILayout.Space(6f);
					RenderStyleList();
					GUILayout.Space(6f);
					RenderModifiers();
					GUILayout.Space(4f);
					RenderFontEffects();
					GUILayout.Space(4f);
					RenderSliders();
					GUILayout.Space(6f);
					RenderApplyRow();
					GUILayout.Space(4f);
					RenderEnableToggle();
					GUILayout.Space(4f);
					GUILayout.Label("F11: open/close menu  ·  F12: toggle on/off  ·  Esc: close", _help, (Il2CppReferenceArray<GUILayoutOption>)null);
				}
				finally
				{
					GUILayout.EndArea();
				}
				if (Event.current != null && (int)Event.current.type == 4 && (int)Event.current.keyCode == 27)
				{
					Hide();
					Event.current.Use();
				}
			}
			catch (Exception ex)
			{
				SafeLog.Error("StyleMenu.Render", ex);
			}
		}

		private void RenderHeader()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null);
			GUILayout.Label("SledNameStyler v0.2.0", _header, (Il2CppReferenceArray<GUILayoutOption>)null);
			GUILayout.FlexibleSpace();
			Color color = GUI.color;
			GUI.color = (Mod.IsEnabled ? new Color(0f, 1f, 0.4f) : new Color(1f, 0.4f, 0.4f));
			GUILayout.Label(Mod.IsEnabled ? "[ON]" : "[OFF]", _header, (Il2CppReferenceArray<GUILayoutOption>)null);
			GUI.color = color;
			GUILayout.EndHorizontal();
		}

		private void RenderStatus()
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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)
			string text;
			Color color = default(Color);
			switch (Mod.Status)
			{
			case Mod.ApplyStatus.Applied:
				text = "● APPLYING — your name is styled in-game right now";
				((Color)(ref color))..ctor(0f, 1f, 0.4f);
				break;
			case Mod.ApplyStatus.Disabled:
				text = "○ DISABLED — press F12 or the Enable button below";
				((Color)(ref color))..ctor(1f, 0.4f, 0.4f);
				break;
			default:
				text = "… WAITING — join a lobby (or set a custom name) to apply";
				((Color)(ref color))..ctor(1f, 0.85f, 0.3f);
				break;
			}
			Color color2 = GUI.color;
			GUI.color = color;
			GUILayout.Label(text, _label, (Il2CppReferenceArray<GUILayoutOption>)null);
			GUI.color = color2;
			string text2 = (Mod.HasOriginal ? ("Real username: " + Mod.OriginalName) : "Real username: (not captured yet)");
			GUILayout.Label(text2, _help, (Il2CppReferenceArray<GUILayoutOption>)null);
		}

		private void RenderApplyRow()
		{
			GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null);
			if (GUILayout.Button("Apply now", _btn, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(140f),
				GUILayout.Height(28f)
			}))
			{
				Mod.ForceApply();
			}
			if (GUILayout.Button("Re-read real name", _btn, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(180f),
				GUILayout.Height(28f)
			}))
			{
				Mod.RecaptureOriginal();
			}
			GUILayout.FlexibleSpace();
			GUILayout.EndHorizontal();
		}

		private void RenderNameField()
		{
			GUILayout.Label("Custom name (empty = use your real username):", _label, (Il2CppReferenceArray<GUILayoutOption>)null);
			string text = GUILayout.TextField(_nameDraft ?? "", _tf, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(544f) });
			if (text != _nameDraft)
			{
				_nameDraft = text;
				Mod.NameOverride = _nameDraft;
			}
		}

		private void RenderPreview()
		{
			string s = (string.IsNullOrEmpty(_nameDraft) ? "PreviewName" : NameStyler.StripMarkup(_nameDraft));
			string s2 = TextTransform.Apply(s, Mod.Transform);
			string baseName = NameDecoration.Apply(s2, Mod.Decoration);
			string s3 = NameStyler.Render(baseName, Mod.CurrentStyle, Time.time * Mathf.Max(Mod.AnimSpeed, 0.01f));
			string input = NameStyler.Decorate(s3, Mod.Bold, Mod.Italic, Mod.Underline, Mod.Strike, Mod.SizePct);
			string text = _stripUnsupported.Replace(input, "");
			GUILayout.Label(text, _preview, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(544f),
				GUILayout.Height(54f)
			});
		}

		private void RenderModifiers()
		{
			CyclePicker("Letters", TextTransform.Names, Mod.Transform, delegate(string v)
			{
				Mod.Transform = v;
			});
			CyclePicker("Wrap", NameDecoration.Names, Mod.Decoration, delegate(string v)
			{
				Mod.Decoration = v;
			});
			CyclePicker("Glow", NameGlow.Names, Mod.Glow, delegate(string v)
			{
				Mod.Glow = v;
			});
		}

		private void CyclePicker(string label, IReadOnlyList<string> options, string current, Action<string> set)
		{
			if (options.Count == 0)
			{
				return;
			}
			int num = 0;
			for (int i = 0; i < options.Count; i++)
			{
				if (string.Equals(options[i], current, StringComparison.OrdinalIgnoreCase))
				{
					num = i;
					break;
				}
			}
			GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null);
			GUILayout.Label(label, _label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(64f) });
			if (GUILayout.Button("◀", _btn, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(34f) }))
			{
				set(options[(num - 1 + options.Count) % options.Count]);
			}
			GUILayout.Label(options[num], _label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(140f) });
			if (GUILayout.Button("▶", _btn, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(34f) }))
			{
				set(options[(num + 1) % options.Count]);
			}
			GUILayout.FlexibleSpace();
			GUILayout.EndHorizontal();
		}

		private void RenderStyleList()
		{
			//IL_001e: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			GUILayout.Label("Style: " + Mod.CurrentStyle, _label, (Il2CppReferenceArray<GUILayoutOption>)null);
			_styleScroll = GUILayout.BeginScrollView(_styleScroll, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(544f),
				GUILayout.Height(220f)
			});
			try
			{
				IReadOnlyList<string> styleNames = NameStyler.StyleNames;
				for (int i = 0; i < styleNames.Count; i++)
				{
					string text = styleNames[i];
					bool flag = string.Equals(text, Mod.CurrentStyle, StringComparison.OrdinalIgnoreCase);
					if (GUILayout.Button((flag ? "● " : "  ") + text, flag ? _btnSel : _btn, Array.Empty<GUILayoutOption>()))
					{
						Mod.CurrentStyle = text;
					}
				}
			}
			finally
			{
				GUILayout.EndScrollView();
			}
		}

		private void RenderFontEffects()
		{
			GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null);
			ToggleBtn("Bold", Mod.Bold, delegate(bool v)
			{
				Mod.Bold = v;
			});
			ToggleBtn("Italic", Mod.Italic, delegate(bool v)
			{
				Mod.Italic = v;
			});
			ToggleBtn("Underline", Mod.Underline, delegate(bool v)
			{
				Mod.Underline = v;
			});
			ToggleBtn("Strike", Mod.Strike, delegate(bool v)
			{
				Mod.Strike = v;
			});
			GUILayout.EndHorizontal();
		}

		private void ToggleBtn(string label, bool value, Action<bool> set)
		{
			GUIStyle val = (value ? _btnSel : _btn);
			if (GUILayout.Button(label + (value ? " ●" : " ○"), val, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(124f) }))
			{
				set(!value);
			}
		}

		private void RenderSliders()
		{
			SliderRow("Size %", Mod.SizePct, 50, 250, 10, delegate(int v)
			{
				Mod.SizePct = v;
			}, (int v) => v + "%");
			SliderRow("Anim ×", Mathf.RoundToInt(Mod.AnimSpeed * 10f), 1, 50, 1, delegate(int v)
			{
				Mod.AnimSpeed = (float)v / 10f;
			}, (int v) => ((float)v / 10f).ToString("0.0") + "×");
		}

		private void SliderRow(string label, int value, int min, int max, int step, Action<int> set, Func<int, string> fmt)
		{
			GUILayout.BeginHorizontal((Il2CppReferenceArray<GUILayoutOption>)null);
			GUILayout.Label(label, _label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(64f) });
			if (GUILayout.Button("-", _btn, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(36f) }))
			{
				set(Mathf.Max(min, value - step));
			}
			GUILayout.Label(fmt(value), _label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(70f) });
			if (GUILayout.Button("+", _btn, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(36f) }))
			{
				set(Mathf.Min(max, value + step));
			}
			GUILayout.FlexibleSpace();
			GUILayout.EndHorizontal();
		}

		private void RenderEnableToggle()
		{
			string text = (Mod.IsEnabled ? "Disable styling (use real username)" : "Enable styling");
			if (GUILayout.Button(text, _btn, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.Width(544f),
				GUILayout.Height(28f)
			}))
			{
				Mod.IsEnabled = !Mod.IsEnabled;
			}
		}

		private static void EnsureStyles()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_0067: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Expected O, but got Unknown
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: 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_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Expected O, but got Unknown
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Expected O, but got Unknown
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			if (_label == null)
			{
				Color textColor = default(Color);
				((Color)(ref textColor))..ctor(0.85f, 0.95f, 0.85f);
				Color textColor2 = default(Color);
				((Color)(ref textColor2))..ctor(0f, 1f, 0.4f);
				GUIStyle val = new GUIStyle(GUI.skin.label)
				{
					fontSize = 14,
					fontStyle = (FontStyle)1,
					richText = true
				};
				val.normal.textColor = textColor;
				_label = new GUIStyle(val);
				_header = new GUIStyle(val)
				{
					fontSize = 18
				};
				_header.normal.textColor = textColor2;
				_help = new GUIStyle(val)
				{
					fontSize = 11,
					fontStyle = (FontStyle)2
				};
				_help.normal.textColor = new Color(0.7f, 0.85f, 0.7f);
				_btn = new GUIStyle(GUI.skin.button)
				{
					fontSize = 13,
					fontStyle = (FontStyle)1,
					richText = true
				};
				_btnSel = new GUIStyle(_btn);
				_btnSel.normal.textColor = textColor2;
				_btnSel.hover.textColor = textColor2;
				_btnSel.active.textColor = textColor2;
				_tf = new GUIStyle(GUI.skin.textField)
				{
					fontSize = 14,
					richText = false
				};
				_tf.normal.textColor = Color.white;
				_preview = new GUIStyle(val)
				{
					fontSize = 22,
					alignment = (TextAnchor)4
				};
				_preview.normal.textColor = Color.white;
				_bgTex = new Texture2D(1, 1);
				_bgTex.SetPixel(0, 0, new Color(0f, 0f, 0f, 0.82f));
				_bgTex.Apply();
			}
		}
	}
}