Decompiled source of EmbeddedCharacterSheetPlugin v1.8.5

EmbeddedCharacterSheetPlugin.dll

Decompiled 5 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Media;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Bounce.Singletons;
using HarmonyLib;
using ModdingTales;
using Newtonsoft.Json;
using RadialUI;
using TMPro;
using Unity.Mathematics;
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("EmbeddedCharacterSheetPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EmbeddedCharacterSheetPlugin")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("EmbeddedCharacterSheetPlugin")]
[assembly: ComVisible(false)]
[assembly: Guid("c303405d-e66c-4316-9cdb-4e3ca15c6360")]
[assembly: AssemblyFileVersion("1.8.5.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.8.5.0")]
namespace LordAshes;

[BepInPlugin("org.lordashes.plugins.embeddedcharactersheet", "Embedded Character Sheet Plugin", "1.8.5.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class EmbeddedCharacterSheetPlugin : BaseUnityPlugin
{
	public enum GuiElementType
	{
		legacy,
		button,
		layout
	}

	public class GuiLocation
	{
		public int x { get; set; } = 0;


		public int y { get; set; } = 0;

	}

	public class GuiSize
	{
		public int w { get; set; } = 0;


		public int h { get; set; } = 0;

	}

	public class GuiElement
	{
		[NonSerialized]
		public Texture2D _texture = null;

		[NonSerialized]
		public GUIStyle _style = new GUIStyle();

		public string id { get; set; } = "";


		public GuiElementType type { get; set; } = GuiElementType.button;


		public GuiLocation position { get; set; } = new GuiLocation();


		public GuiSize size { get; set; } = new GuiSize();


		public string style { get; set; } = "";


		public string name { get; set; } = "";


		public string content { get; set; } = "";


		public string target { get; set; } = "";


		public string roll { get; set; } = "";


		public GuiElement()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			_style.normal.textColor = defaultEntryTextColor.Value;
			_style.fontSize = defaultEntryTextSize.Value;
			_style.fontStyle = (FontStyle)0;
			_style.richText = false;
			_style.wordWrap = false;
		}
	}

	public class GuiLayout
	{
		public GuiLocation position = new GuiLocation
		{
			x = 10,
			y = 40
		};

		public GuiSize size = new GuiSize
		{
			w = Screen.width - 20,
			h = Screen.height - 20
		};

		public List<GuiElement> elements = new List<GuiElement>();

		public string background = "";

		[NonSerialized]
		public Texture2D _background = null;

		public GuiLayout Clone()
		{
			GuiLayout guiLayout = new GuiLayout();
			guiLayout.position = position;
			guiLayout.size = size;
			guiLayout.background = background;
			guiLayout._background = _background;
			foreach (GuiElement element in elements)
			{
				guiLayout.elements.Add(new GuiElement
				{
					id = element.id,
					type = element.type,
					position = element.position,
					size = element.size,
					style = element.style,
					name = element.name,
					content = element.content,
					target = element.target,
					roll = element.roll,
					_texture = element._texture,
					_style = element._style
				});
			}
			return guiLayout;
		}
	}

	public class CharacterData
	{
		[NonSerialized]
		public string _id = "";

		public string layout { get; set; } = "";


		public Dictionary<string, string> stats { get; set; } = new Dictionary<string, string>();


		public string Formula(string roll)
		{
			return roll.Replace("{", "").Replace("}", "");
		}

		public string Evaluate(string roll)
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Evaluating Raw Roll '" + roll + "'"));
			}
			bool flag = true;
			int num = 0;
			while (flag)
			{
				num++;
				flag = false;
				foreach (KeyValuePair<string, string> stat in stats)
				{
					string text = roll;
					if (roll.Contains(stat.Key))
					{
						roll = roll.Replace(stat.Key, Evaluate(stat.Value));
						flag = true;
					}
				}
				if (logDiagnostics.Value)
				{
					Debug.Log((object)("Embedded Character Sheet Plugin: Evaluating Substituted Roll '" + roll + "'"));
				}
				if (num >= 10)
				{
					break;
				}
			}
			DataTable dataTable = new DataTable();
			string[] array = roll.Split(new char[1] { '/' });
			for (int i = 0; i < array.Length; i++)
			{
				if (logDiagnostics.Value)
				{
					Debug.Log((object)("Embedded Character Sheet Plugin: Computing '" + array[i].Replace("&", "/").Replace("÷", "/") + "'"));
				}
				object obj = null;
				try
				{
					obj = dataTable.Compute(array[i].Replace("&", "/").Replace("÷", "/"), "");
				}
				catch
				{
				}
				if (logDiagnostics.Value)
				{
					Debug.Log((object)("Embedded Character Sheet Plugin: Computation Result '" + Convert.ToString(obj) + "'"));
				}
				if (obj != null)
				{
					int result = 0;
					float result2 = 0f;
					if (int.TryParse(obj.ToString(), out result))
					{
						array[i] = result.ToString();
					}
					else if (float.TryParse(obj.ToString(), out result2))
					{
						array[i] = Math.Floor(result2).ToString();
					}
				}
			}
			roll = string.Join("/", array);
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Roll Result '" + roll + "'"));
			}
			roll = roll.ColsolidateModifiers();
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Roll Result After Consolidation Of Modifiers '" + roll + "'"));
			}
			return roll;
		}
	}

	[HarmonyPatch(typeof(UIDiceRollResult), "DisplayResult")]
	public static class PatchDisplayResult
	{
		public static bool Prefix(RollResults rollResultData, ClientGuid sender)
		{
			//IL_0010: 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_0058: 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_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < rollResultData.ResultsGroups.Length; i++)
			{
				if (rollResultData.ResultsGroups[i].Name != null && Convert.ToString(rollResultData.ResultsGroups[i]).Trim() != "")
				{
					Debug.Log((object)("Embedded Character Sheet Plugin: Roll Name '" + rollResultData.ResultsGroups[i].Name + "'"));
					if (rollResultData.ResultsGroups[i].Name.Contains("[") && rollResultData.ResultsGroups[i].Name.Contains("]"))
					{
						rollResultData.ResultsGroups[i] = new RollResultsGroup(rollResultData.ResultsGroups[i].Name.Substring(rollResultData.ResultsGroups[i].Name.IndexOf("]") + 1), rollResultData.ResultsGroups[i].Result);
					}
				}
			}
			return true;
		}
	}

	public static class Utility
	{
		public static void PostOnMainPage(BaseUnityPlugin plugin)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			string text = "Lord Ashes" + ("Lord Ashes".ToUpper().EndsWith("S") ? "'" : "'s");
			ModdingUtils.Initialize(plugin, new ManualLogSource("Embedded Character Sheet Plugin"), text, false);
		}

		public static bool isBoardLoaded()
		{
			return SimpleSingletonBehaviour<CameraController>.HasInstance && SingletonStateMBehaviour<BoardSessionManager, State<BoardSessionManager>>.HasInstance && !BoardSessionManager.IsLoading;
		}

		private static TextMeshProUGUI GetUITextByName(string name)
		{
			TextMeshProUGUI[] array = Object.FindObjectsOfType<TextMeshProUGUI>();
			for (int i = 0; i < array.Length; i++)
			{
				if (((Object)array[i]).name == name)
				{
					return array[i];
				}
			}
			return null;
		}

		public static string GetCreatureName(string name)
		{
			if (name.Contains("<"))
			{
				name = name.Substring(0, name.IndexOf("<"));
			}
			return name;
		}
	}

	public enum RollMethod
	{
		talespire_dice = 1,
		chat_roll
	}

	public const string Name = "Embedded Character Sheet Plugin";

	public const string Guid = "org.lordashes.plugins.embeddedcharactersheet";

	public const string Version = "1.8.5.0";

	public const string Author = "Lord Ashes";

	private bool characterSheetShowing = false;

	public static GuiLayout currentLayout = null;

	public static CharacterData currentData = null;

	public static Dictionary<string, GuiLayout> layouts = new Dictionary<string, GuiLayout>();

	public static Dictionary<string, CharacterData> data = new Dictionary<string, CharacterData>();

	public static Dictionary<string, Font> fonts = new Dictionary<string, Font>();

	public static string layoutTab = "";

	public static bool layoutSwitchInProgress = false;

	public static string selectedKey = "";

	public static string selectedValue = "";

	public static string selectedPrevious = "";

	public static float selectedTime = -1f;

	public static List<string> fastElementPatterns = new List<string>();

	private EmbeddedCharacterSheetPlugin _self = null;

	private ConfigEntry<RollMethod> rollMethod { get; set; }

	private ConfigEntry<KeyboardShortcut> triggerKey { get; set; }

	private ConfigEntry<KeyboardShortcut> triggerReset { get; set; }

	private ConfigEntry<KeyboardShortcut> triggerValueUp { get; set; }

	private ConfigEntry<KeyboardShortcut> triggerValueDown { get; set; }

	private ConfigEntry<KeyboardShortcut> triggerMousePosition { get; set; }

	private ConfigEntry<bool> closeAfteRoll { get; set; }

	private ConfigEntry<bool> applyNameMod { get; set; }

	public static ConfigEntry<bool> logDiagnostics { get; set; }

	public static ConfigEntry<bool> logMousePointer { get; set; }

	private static ConfigEntry<Color> defaultEntryTextColor { get; set; }

	private static ConfigEntry<int> defaultEntryTextSize { get; set; }

	private static ConfigEntry<int> mousePointerVerticalOffset { get; set; }

	private static ConfigEntry<string> fastChangeElements { get; set; }

	private void Awake()
	{
		//IL_0078: 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_00dc: 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_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0205: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ba: Expected O, but got Unknown
		_self = this;
		logDiagnostics = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Log Diagnostics To Log", true, (ConfigDescription)null);
		Debug.Log((object)("Embedded Character Sheet Plugin: " + ((object)this).GetType().AssemblyQualifiedName + " Active. Log Diagnostics = " + logDiagnostics.Value));
		triggerKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Toggle Character Sheet", new KeyboardShortcut((KeyCode)115, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), (ConfigDescription)null);
		triggerReset = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "You Know Nothing Jon Snow", new KeyboardShortcut((KeyCode)115, (KeyCode[])(object)new KeyCode[1] { (KeyCode)305 }), (ConfigDescription)null);
		triggerMousePosition = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Toggle Show Mouse Position", new KeyboardShortcut((KeyCode)115, (KeyCode[])(object)new KeyCode[1] { (KeyCode)307 }), (ConfigDescription)null);
		triggerValueDown = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Decrease Value", new KeyboardShortcut((KeyCode)44, Array.Empty<KeyCode>()), (ConfigDescription)null);
		triggerValueUp = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "Increase Value", new KeyboardShortcut((KeyCode)46, Array.Empty<KeyCode>()), (ConfigDescription)null);
		rollMethod = ((BaseUnityPlugin)this).Config.Bind<RollMethod>("Settings", "Roll Method", RollMethod.talespire_dice, (ConfigDescription)null);
		closeAfteRoll = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Close Character Sheet After Roll", true, (ConfigDescription)null);
		applyNameMod = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Apply Name Mod On Roll Results In Chat", true, (ConfigDescription)null);
		logMousePointer = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Show Mouse Position", false, (ConfigDescription)null);
		mousePointerVerticalOffset = ((BaseUnityPlugin)this).Config.Bind<int>("Settings", "Pixel Height Of Top Toolbar", 38, (ConfigDescription)null);
		fastChangeElements = ((BaseUnityPlugin)this).Config.Bind<string>("Settings", "Comma Delimited Patterns Of Fast Change Elements", "*FastChange*", (ConfigDescription)null);
		defaultEntryTextColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Defaults", "Entry Text Color", Color.black, (ConfigDescription)null);
		defaultEntryTextSize = ((BaseUnityPlugin)this).Config.Bind<int>("Defaults", "Entry Text Size", 16, (ConfigDescription)null);
		RadialSubmenu.EnsureMainMenuItem("org.hollofox.plugins.RadialUIPlugin.Info", (MenuType)1, "Info", Image.LoadSprite("Icon.Info.png", (CacheType)999));
		RadialSubmenu.CreateSubMenuItem("org.hollofox.plugins.RadialUIPlugin.Info", "Character Sheet", Image.LoadSprite("Icon.CharacterSheet.png", (CacheType)999), (Action<CreatureGuid, string, MapMenuItem>)ToggleSheet, true, (Func<bool>)(() => LocalClient.HasControlOfCreature(new CreatureGuid(RadialUIPlugin.GetLastRadialTargetCreature()))));
		if (applyNameMod.Value)
		{
			Harmony val = new Harmony("org.lordashes.plugins.embeddedcharactersheet");
			val.PatchAll();
		}
		string[] array = fastChangeElements.Value.Split(new char[1] { ',' });
		foreach (string item in array)
		{
			fastElementPatterns.Add(item);
		}
		AssetDataPlugin.Subscribe("org.lordashes.plugins.embeddedcharactersheet", (Action<DatumChange>)RequestHandler, (Func<DatumChange, bool>)null);
		Utility.PostOnMainPage((BaseUnityPlugin)(object)this);
	}

	private void Update()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		if (Utility.isBoardLoaded())
		{
			KeyboardShortcut value = triggerKey.Value;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				ToggleSheet(default(CreatureGuid), null, null);
			}
			value = triggerReset.Value;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				SystemMessage.DisplayInfoText("Embedded Character Sheet Plugin:\r\nYou Know Nothing, Jon Snow", 2.5f, 0f);
				layouts.Clear();
				data.Clear();
				layoutTab = "";
				layoutSwitchInProgress = false;
			}
			value = triggerValueDown.Value;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				Debug.Log((object)"Embedded Character Sheet Plugin: Requesting Element Value Decrease");
				ModifyValue(-1f);
			}
			value = triggerValueUp.Value;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				Debug.Log((object)"Embedded Character Sheet Plugin: Requesting Element Value Increase");
				ModifyValue(1f);
			}
			value = triggerMousePosition.Value;
			if (((KeyboardShortcut)(ref value)).IsUp())
			{
				logMousePointer.Value = !logMousePointer.Value;
				Debug.Log((object)("Embedded Character Sheet Plugin: Toggled Show Mouse Position To " + logMousePointer.Value));
			}
		}
	}

	private void ToggleSheet(CreatureGuid arg1, string arg2, MapMenuItem arg3)
	{
		if (!characterSheetShowing)
		{
			Debug.Log((object)"Embedded Character Sheet Plugin: Toggling Embedded Character Sheet View To On");
			GetCharacterSheet();
		}
		else
		{
			Debug.Log((object)"Embedded Character Sheet Plugin: Toggling Embedded Character Sheet View To Off");
			currentData = null;
			currentLayout = null;
		}
		characterSheetShowing = !characterSheetShowing;
	}

	private void OnGUI()
	{
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		if (!characterSheetShowing)
		{
			return;
		}
		try
		{
			if ((Object)(object)currentLayout._background != (Object)null)
			{
				GUI.DrawTexture(new Rect((float)currentLayout.position.x, (float)currentLayout.position.y, (float)currentLayout.size.w, (float)currentLayout.size.h), (Texture)(object)currentLayout._background, (ScaleMode)0);
			}
			foreach (GuiElement element in currentLayout.elements)
			{
				switch (element.type)
				{
				case GuiElementType.legacy:
				case GuiElementType.button:
					ClickableButton(element, currentData);
					break;
				case GuiElementType.layout:
					ClickableLayout(element, currentData);
					break;
				}
			}
		}
		catch
		{
		}
		if (logMousePointer.Value)
		{
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor(MouseManager.Position.x, (float)Screen.height - MouseManager.Position.y - (float)mousePointerVerticalOffset.Value);
			GUI.Label(new Rect(10f, 10f, 320f, 60f), val.x + "," + val.y);
		}
	}

	private void ClickableButton(GuiElement el, CharacterData data)
	{
		//IL_00d6: 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)
		bool flag = false;
		if ((Object)(object)el._texture != (Object)null)
		{
			if (GUI.Button(new Rect((float)(currentLayout.position.x + el.position.x), (float)(currentLayout.position.y + el.position.y), (float)el.size.w, (float)el.size.h), (Texture)(object)el._texture, el._style))
			{
				flag = true;
			}
		}
		else if (GUI.Button(new Rect((float)(currentLayout.position.x + el.position.x), (float)(currentLayout.position.y + el.position.y), (float)el.size.w, (float)el.size.h), el.content, el._style))
		{
			flag = true;
		}
		if (!flag)
		{
			return;
		}
		if (Input.GetMouseButtonUp(0))
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Roll Triggered. Name='" + el.target + "', Content='" + el.content + "', Target='" + el?.ToString() + "'"));
			}
			string text = ((el.name.Trim() != "") ? el.name : el.content);
			if (el.target.Trim() != "")
			{
				text = text + "\u00a0(" + el.target.Trim() + ")";
			}
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Roll Name='" + text + "'"));
			}
			Roll(text, data.Evaluate(el.roll));
		}
		else if (Input.GetMouseButtonUp(2))
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)"Embedded Character Sheet Plugin: Edit Triggered");
			}
			EditValue(el.roll);
		}
	}

	private void ClickableLayout(GuiElement el, CharacterData data)
	{
		//IL_0250: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		bool flag = false;
		if ((Object)(object)el._texture != (Object)null)
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Drawing Layout Texture '" + el.name + " (" + el.id + ")' at " + currentLayout.position.x + el.position.x + "," + currentLayout.position.y + el.position.y));
			}
			if (GUI.Button(new Rect((float)(currentLayout.position.x + el.position.x), (float)(currentLayout.position.y + el.position.y), (float)el.size.w, (float)el.size.h), (Texture)(object)el._texture, el._style))
			{
				flag = true;
			}
		}
		else
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Drawing Layout Text '" + el.name + " (" + el.id + ")' at " + currentLayout.position.x + el.position.x + "," + currentLayout.position.y + el.position.y));
			}
			if (GUI.Button(new Rect((float)(currentLayout.position.x + el.position.x), (float)(currentLayout.position.y + el.position.y), (float)el.size.w, (float)el.size.h), el.content, el._style))
			{
				flag = true;
			}
		}
		if (!flag)
		{
			return;
		}
		if (el.roll.Trim() == "")
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)"Embedded Character Sheet Plugin: Switching Layout To Default");
			}
			layoutTab = "";
		}
		else
		{
			layoutTab = data.Evaluate(el.roll);
			if (logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Switching Layout To Tab '" + layoutTab + "'"));
			}
		}
		GetCharacterSheet();
	}

	private void Roll(string content, string roll)
	{
		RollMethod value = this.rollMethod.Value;
		RollMethod rollMethod = value;
		if (rollMethod == RollMethod.chat_roll)
		{
			RollChatRoll(content, roll);
		}
		else
		{
			RollTalespire(content, roll);
		}
		if (closeAfteRoll.Value)
		{
			characterSheetShowing = false;
			currentData = null;
			currentLayout = null;
		}
	}

	private void RollChatRoll(string content, string rolls)
	{
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		//IL_0149: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		string[] array = rolls.Split(new char[1] { '/' });
		foreach (string text in array)
		{
			try
			{
				Regex regex = new Regex("^(.+:([0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)([\\+|-][0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)*)(\\/.+:([0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)([\\+|-][0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)*)*$");
				string text2 = text;
				if (!text2.Contains(":"))
				{
					text2 = content + ":" + text2;
				}
				Debug.Log((object)("Embedded Character Sheet Plugin: Content: " + content + ", Roll: '" + text + "', ContentRoll: " + text2 + ", RegEx Match: " + regex.IsMatch(text2)));
				if (regex.IsMatch(text2))
				{
					ChatManager.SendChatMessageToBoard("/rn " + text2.Replace(":", " "), LocalClient.SelectedCreatureId.Value, (float3?)null, false);
					continue;
				}
				SystemMessage.DisplayInfoText(text2.Replace(":", " "), 2.5f, 0f);
				ChatManager.SendChatMessageToBoard(text2.Replace(":", " "), LocalClient.SelectedCreatureId.Value, (float3?)null, false);
			}
			catch
			{
				ChatManager.SendChatMessageToBoard(text, LocalClient.SelectedCreatureId.Value, (float3?)null, false);
			}
		}
	}

	private void RollTalespire(string content, string rolls)
	{
		//IL_0019: 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_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)
		Debug.Log((object)("Embedded Character Sheet Plugin: Talespire Rolling '" + rolls + "'"));
		CreatureBoardAsset val = null;
		CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val);
		string text = (((Object)(object)val != (Object)null) ? ("[" + Utility.GetCreatureName(val.Name) + "]") : "");
		try
		{
			string[] array = rolls.Split(new char[1] { '/' });
			foreach (string text2 in array)
			{
				Regex regex = new Regex("^(.+:([0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)([\\+|-][0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)*)(\\/.+:([0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)([\\+|-][0-9]+[d|D][0-9]+([\\+|-][0-9]+)?)*)*$");
				string text3 = text2;
				if (!text3.Contains(":"))
				{
					text3 = content + ":" + text3;
				}
				Debug.Log((object)("Embedded Character Sheet Plugin: Content: " + content + ", Roll: '" + text2 + "', ContentRoll: " + text3 + ", RegEx Match: " + regex.IsMatch(text3)));
				if (regex.IsMatch(text3))
				{
					text = text + text3 + "/";
					continue;
				}
				SystemMessage.DisplayInfoText(text2, 2.5f, 0f);
				ChatManager.SendChatMessageToBoard(text2, LocalClient.SelectedCreatureId.Value, (float3?)null, false);
			}
		}
		catch
		{
			ChatManager.SendChatMessageToBoard(rolls, LocalClient.SelectedCreatureId.Value, (float3?)null, false);
		}
		if (text.EndsWith("/"))
		{
			text = text.Substring(0, text.Length - 1);
			Debug.Log((object)("Embedded Character Sheet Plugin: Executing \"talespire://dice/" + text + "\""));
			Process process = new Process();
			process.StartInfo = new ProcessStartInfo
			{
				FileName = "talespire://dice/" + text,
				Arguments = "",
				CreateNoWindow = true
			};
			process.Start();
		}
	}

	private void GetCharacterSheet()
	{
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		string json = "";
		if (layoutSwitchInProgress)
		{
			if (logDiagnostics.Value)
			{
				Debug.Log((object)"Embedded Character Sheet Plugin: Layout Switch In Progress. Ignoring Link Click");
			}
			SystemSounds.Beep.Play();
			SystemSounds.Beep.Play();
			SystemSounds.Beep.Play();
			return;
		}
		layoutSwitchInProgress = true;
		CreatureBoardAsset val = null;
		CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val);
		if ((Object)(object)val != (Object)null)
		{
			try
			{
				string creatureName = Utility.GetCreatureName(val.Name);
				if (data.ContainsKey(creatureName))
				{
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Using Cached Data For '" + creatureName + "'"));
					}
					currentData = data[creatureName];
				}
				else
				{
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Looking For Data For '" + creatureName + "'"));
					}
					if (!File.Exists("EmbeddedCharacterSheet.Data." + creatureName + ".csd"))
					{
						if (logDiagnostics.Value)
						{
							Debug.Log((object)("Embedded Character Sheet Plugin: No Data File For '" + creatureName + "' Name 'EmbeddedCharacterSheet.Data." + creatureName + ".csd'"));
						}
						characterSheetShowing = false;
						currentData = null;
						currentLayout = null;
						return;
					}
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Found 'EmbeddedCharacterSheet.Data." + creatureName + ".csd'"));
					}
					json = "{#EmbeddedCharacterSheet.Data." + creatureName + ".csd#}";
					LoadEmbeddedFiles(ref json, creatureName);
					currentData = JsonConvert.DeserializeObject<CharacterData>(json);
					currentData._id = creatureName;
					data.Add(creatureName, currentData);
				}
				if (layouts.ContainsKey(currentData.layout + layoutTab))
				{
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Using Cached Layout For '" + currentData.layout + "'"));
					}
					currentLayout = layouts[currentData.layout + layoutTab].Clone();
					Debug.Log((object)("Embedded Character Sheet Plugin: Cached = " + JsonConvert.SerializeObject((object)currentLayout, (Formatting)1)));
				}
				else
				{
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Looking For Layout For '" + currentData.layout + "'"));
					}
					if (!File.Exists("EmbeddedCharacterSheet.Layout." + currentData.layout + layoutTab + ".csl"))
					{
						Debug.LogWarning((object)("Embedded Character Sheet Plugin: No Layout File For 'EmbeddedCharacterSheet.Layout." + currentData.layout + layoutTab + ".csl'"));
						characterSheetShowing = false;
						currentData = null;
						currentLayout = null;
						return;
					}
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Found 'EmbeddedCharacterSheet.Layout." + currentData.layout + layoutTab + ".csl'"));
					}
					json = "{#EmbeddedCharacterSheet.Layout." + currentData.layout + layoutTab + ".csl#}";
					LoadEmbeddedFiles(ref json, creatureName, currentData.layout + layoutTab);
					GuiLayout guiLayout = JsonConvert.DeserializeObject<GuiLayout>(json);
					if (logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Loaded Layout '" + currentData.layout + layoutTab + "'"));
					}
					Debug.Log((object)("Embedded Character Sheet Plugin: Loaded = " + JsonConvert.SerializeObject((object)guiLayout, (Formatting)1)));
					if (guiLayout.background != "")
					{
						guiLayout._background = Image.LoadTexture(guiLayout.background, (CacheType)999);
					}
					bool flag = false;
					foreach (GuiElement element in guiLayout.elements)
					{
						if (element.style != null)
						{
							if (element.type == GuiElementType.legacy)
							{
								flag = true;
							}
							if (element.style.ToString().Trim() != "")
							{
								ReflectionObjectModifier.ApplyStyleCustomization(element._style, element.style);
							}
						}
					}
					if (flag)
					{
						SystemMessage.DisplayInfoText("Embedded Character Sheet:\r\nLayout Uses Legacy Type 0\r\nPlease Change To Type 1", 2.5f, 0f);
						Debug.LogWarning((object)"Embedded Character Sheet: Layout Uses Legacy 'Type 0' Element. Please Change To 'Type 1' For Future Compatibility.");
					}
					layouts.Add(currentData.layout + layoutTab, guiLayout);
					currentLayout = guiLayout.Clone();
				}
				foreach (GuiElement element2 in currentLayout.elements)
				{
					int num = 0;
					Debug.Log((object)("Embedded Character Sheet Plugin: Raw Element Content Is '" + element2.content + "'"));
					while (element2.content.Contains("{") || element2.content.Contains("+") || element2.content.Contains("-"))
					{
						element2.content = currentData.Evaluate(element2.content);
						element2.content = element2.content.Replace(" ", "\u00a0");
						element2.name = currentData.Evaluate(element2.name);
						element2.name = element2.name.Replace(" ", "\u00a0");
						element2.target = currentData.Evaluate(element2.target);
						element2.target = element2.target.Replace(" ", "\u00a0");
						num++;
						if (num >= 10)
						{
							break;
						}
					}
					Debug.Log((object)("Embedded Character Sheet Plugin: Evaluated Element Content Is '" + element2.content + "'"));
					if (element2.content.StartsWith("#") && element2.content.EndsWith("#") && (Object)(object)element2._texture == (Object)null)
					{
						Debug.Log((object)("Embedded Character Sheet Plugin: Loading Texture '" + element2.content.Replace("#", "") + "'"));
						element2._texture = Image.LoadTexture(element2.content.Replace("#", ""), (CacheType)999);
					}
				}
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)"Embedded Character Sheet Plugin: Exception In GetCharacterSheet");
				Debug.LogException(ex);
				Debug.Log((object)("JSON:\r\n" + json));
			}
		}
		Debug.Log((object)"Embedded Character Sheet Plugin: Building Character Sheet Complete");
		layoutSwitchInProgress = false;
	}

	private void LoadEmbeddedFiles(ref string json, string assetName = "", string layoutName = "")
	{
		while (json.Contains("{#"))
		{
			string text = json.Substring(json.IndexOf("{#"));
			text = text.Substring(0, text.IndexOf("#}") + 2);
			string text2 = text.Replace("{#", "").Replace("#}", "").Replace("{NAME}", assetName)
				.Replace("{LAYOUT}", "");
			Debug.Log((object)("Embedded Character Sheet Plugin: Replacing '" + text + "' With Embedded File '" + text2 + "' Contents"));
			try
			{
				string newValue = File.ReadAllText(text2, (CacheType)999);
				json = json.Replace(text, newValue);
			}
			catch
			{
				Debug.LogWarning((object)("Embedded Character Sheet Plugin: Unable To Load File '" + text2 + "'"));
				json = json.Replace(text, "");
			}
		}
	}

	private void EditValue(string shard)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		CreatureBoardAsset val = null;
		CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref val);
		string assetName = Utility.GetCreatureName(val.Name);
		string text = "EmbeddedCharacterSheet.Data." + Utility.GetCreatureName(val.Name) + ".csd";
		if (shard.Contains("{"))
		{
			string key = shard.Substring(shard.LastIndexOf("{"));
			key = key.Substring(0, key.LastIndexOf("}") + 1);
			string value = currentData.stats[key];
			SystemMessage.AskForTextInput(shard, key.Replace("{", "").Replace("}", "") + " Value:", 1, "Apply", (Action<string>)delegate(string newValue)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Replacing Data Key '" + key + "' Value '" + value + "' With '" + newValue + "'"));
				AssetDataPlugin.SendInfo("org.lordashes.plugins.embeddedcharactersheet", assetName + "," + key + "," + value + "," + newValue);
			}, (Action)null, "Cancel", (Action)null, value);
		}
	}

	private void ModifyValue(float amount)
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: 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_015b: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: 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)
		Vector2 val = default(Vector2);
		foreach (GuiElement element in currentLayout.elements)
		{
			((Vector2)(ref val))..ctor(MouseManager.Position.x, (float)Screen.height - MouseManager.Position.y - (float)mousePointerVerticalOffset.Value);
			Debug.Log((object)("Embedded Character Sheet Plugin: Mouse At " + val.x + " vs " + element.position.x + "->" + (element.position.x + element.size.w) + ", " + val.y + " vs " + element.position.y + "->" + (element.position.y + element.size.h) + ", Content: " + element.content + ", Roll: " + element.roll));
			if (!(val.x >= (float)element.position.x) || !(val.x <= (float)(element.position.x + element.size.w)) || !(val.y >= (float)element.position.y) || !(val.y <= (float)(element.position.y + element.size.h)))
			{
				continue;
			}
			Debug.Log((object)("Embedded Character Sheet Plugin: Mouse Is Inside Element. Id = " + element.id + ", Content = " + element.content + ", Roll = " + element.roll));
			bool flag = false;
			foreach (string fastElementPattern in fastElementPatterns)
			{
				if (element.id.IsMatch(fastElementPattern))
				{
					flag = true;
					break;
				}
			}
			if (flag)
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Hover Element '" + element.id + "' Is A Fast Change Element"));
				float result = 0f;
				if (element.roll.Contains("{") && float.TryParse(element.content.Trim(), out result))
				{
					selectedKey = element.roll.Substring(element.roll.LastIndexOf("{"));
					selectedKey = selectedKey.Substring(0, selectedKey.LastIndexOf("}") + 1);
					selectedValue = currentData.stats[selectedKey];
					if (selectedTime < 0f)
					{
						selectedPrevious = selectedValue;
					}
					Debug.Log((object)("Embedded Character Sheet Plugin: Key = " + selectedKey + ", Value = " + selectedValue + "->" + (float.Parse(selectedValue) + amount)));
					selectedValue = (float.Parse(selectedValue) + amount).ToString();
					element.content = selectedValue;
					currentData.stats[selectedKey] = selectedValue;
				}
			}
			else
			{
				Debug.Log((object)("Embedded Character Sheet Plugin: Hover Element '" + element.id + "' Is Not A Fast Change Element"));
			}
		}
		if (selectedTime < 0f)
		{
			selectedTime = 10f;
			((MonoBehaviour)_self).StartCoroutine(DetectModificationEnd());
		}
		else
		{
			selectedTime = 10f;
		}
	}

	private static IEnumerator DetectModificationEnd()
	{
		while (selectedTime > 0f)
		{
			Debug.Log((object)("Embedded Character Sheet Plugin: Modify Timer = " + selectedTime));
			yield return (object)new WaitForSeconds(0.1f);
			selectedTime -= 1f;
		}
		selectedTime = -1f;
		CreatureBoardAsset asset = null;
		CreaturePresenter.TryGetAsset(LocalClient.SelectedCreatureId, ref asset);
		string[] obj = new string[8] { "Embedded Character Sheet Plugin: Distributing Update For Asset ", null, null, null, null, null, null, null };
		CreatureGuid creatureId = asset.CreatureId;
		obj[1] = ((object)(CreatureGuid)(ref creatureId)).ToString();
		obj[2] = " Key ";
		obj[3] = selectedKey;
		obj[4] = " From ";
		obj[5] = selectedPrevious;
		obj[6] = " To ";
		obj[7] = selectedValue;
		Debug.Log((object)string.Concat(obj));
		AssetDataPlugin.SendInfo("org.lordashes.plugins.embeddedcharactersheet", Utility.GetCreatureName(asset.Name) + "," + selectedKey + "," + selectedPrevious + "," + selectedValue);
	}

	private void RequestHandler(DatumChange change)
	{
		string[] array = change.value.ToString().Split(new char[1] { ',' });
		try
		{
			string text = File.Find("EmbeddedCharacterSheet.Data." + array[0] + ".csd", (CacheType)999)[0];
			string text2 = File.ReadAllText(text, (CacheType)999);
			text2 = text2.Replace("\"" + array[1] + "\": \"" + array[2] + "\"", "\"" + array[1] + "\": \"" + array[3] + "\"");
			File.WriteAllText(text, text2, (CacheType)999);
			Debug.Log((object)("Embedded Character Sheet Plugin: Replaced \"" + array[1] + "\": \"" + array[2] + "\" To \"" + array[1] + "\": \"" + array[3] + "\" In " + text));
			Debug.Log((object)("Embedded Character Sheet Plugin: Removing Cached Data For '" + array[0] + "'"));
			if (data.ContainsKey(array[0]))
			{
				data.Remove(array[0]);
			}
			Debug.Log((object)("Embedded Character Sheet Plugin: Removing Cached Layout '" + currentData.layout + layoutTab + "'"));
			if (layouts.ContainsKey(currentData.layout + layoutTab))
			{
				layouts.Remove(array[0]);
			}
			Debug.Log((object)("Embedded Character Sheet Plugin: Reloading Character Sheet For '" + array[0] + "'"));
			GetCharacterSheet();
		}
		catch (Exception)
		{
			Debug.Log((object)("Embedded Character Sheet Plugin: Device Does Not Have Character Sheet For '" + array[0] + "'"));
		}
	}
}
public static class ReflectionObjectModifier
{
	public static void ApplyStyleCustomization(object obj, string mods)
	{
		string[] array = mods.Split(new char[1] { '|' });
		if (array.Length == 0)
		{
			return;
		}
		string[] array2 = array;
		foreach (string text in array2)
		{
			if (EmbeddedCharacterSheetPlugin.logDiagnostics.Value)
			{
				Debug.Log((object)("Embedded Characater Sheet Plugin: Applying Style Customizations '" + text + "'"));
			}
			string key = text.Substring(0, text.IndexOf("="));
			string text2 = text.Substring(text.IndexOf("=") + 1);
			if (!text2.StartsWith("&") || !text2.EndsWith("&"))
			{
				Modify(obj, key, text2);
			}
		}
	}

	public static void Modify(object baseObj, string key, object value)
	{
		string text = "";
		if (key.Contains("."))
		{
			text = key.Substring(key.LastIndexOf(".") + 1);
			key = key.Substring(0, key.LastIndexOf("."));
		}
		else
		{
			text = key;
			key = "";
		}
		object parent = baseObj;
		if (key != "")
		{
			string[] array = key.Split(new char[1] { '.' });
			foreach (string childName in array)
			{
				parent = GetObject(parent, childName);
			}
		}
		SetValue(parent, text, value);
	}

	public static object GetObject(object parent, string childName)
	{
		try
		{
			Type type = parent.GetType();
			foreach (FieldInfo runtimeField in type.GetRuntimeFields())
			{
				if (runtimeField.Name == childName)
				{
					return runtimeField.GetValue(parent);
				}
			}
			foreach (PropertyInfo runtimeProperty in type.GetRuntimeProperties())
			{
				if (runtimeProperty.Name == childName)
				{
					return runtimeProperty.GetValue(parent);
				}
			}
			return null;
		}
		catch
		{
			Debug.LogWarning((object)("Embedded Characater Sheet Plugin: Error Getting '" + childName + "' Of '" + parent.ToString() + "'"));
			return null;
		}
	}

	public static void SetValue(object parent, string prop, object value)
	{
		try
		{
			Type type = parent.GetType();
			foreach (FieldInfo runtimeField in type.GetRuntimeFields())
			{
				if (runtimeField.Name == prop)
				{
					if (EmbeddedCharacterSheetPlugin.logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Characater Sheet Plugin: Setting Field (Type " + runtimeField.FieldType.Name + ") To " + value));
					}
					runtimeField.SetValue(parent, ConvertToType(value, runtimeField.FieldType));
					return;
				}
			}
			foreach (PropertyInfo runtimeProperty in type.GetRuntimeProperties())
			{
				if (runtimeProperty.Name == prop)
				{
					if (EmbeddedCharacterSheetPlugin.logDiagnostics.Value)
					{
						Debug.Log((object)("Embedded Characater Sheet Plugin: Setting Property (Type " + runtimeProperty.PropertyType.Name + ") To " + value));
					}
					runtimeProperty.SetValue(parent, ConvertToType(value, runtimeProperty.PropertyType));
					break;
				}
			}
		}
		catch (Exception ex)
		{
			Debug.LogWarning((object)("Embedded Characater Sheet Plugin: Error Setting Property '" + prop + "' To '" + value?.ToString() + "'"));
			Debug.LogException(ex);
		}
	}

	private static object ConvertToType(object value, Type type)
	{
		//IL_018a: 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_01b8: 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_0253: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Unknown result type (might be due to invalid IL or missing references)
		//IL_02de: Unknown result type (might be due to invalid IL or missing references)
		switch (type.Name)
		{
		case "String":
			return value.ToString();
		case "Color":
		{
			Color clear = Color.clear;
			if (!value.ToString().Contains(","))
			{
				ColorUtility.TryParseHtmlString(value.ToString(), ref clear);
				return clear;
			}
			string[] array = value.ToString().Split(new char[1] { ',' });
			return array.Length switch
			{
				1 => (object)new Color(float.Parse(array[0]) / 255f, 0f, 0f), 
				2 => (object)new Color(float.Parse(array[0]) / 255f, float.Parse(array[1]) / 255f, 0f), 
				3 => (object)new Color(float.Parse(array[0]) / 255f, float.Parse(array[1]) / 255f, float.Parse(array[2]) / 255f), 
				4 => (object)new Color(float.Parse(array[0]) / 255f, float.Parse(array[1]) / 255f, float.Parse(array[2]) / 255f, float.Parse(array[3]) / 255f), 
				_ => null, 
			};
		}
		case "Font":
			return null;
		case "Int16":
			return short.Parse(value.ToString());
		case "Int32":
			return int.Parse(value.ToString());
		case "Int64":
			return long.Parse(value.ToString());
		case "UInt16":
			return ushort.Parse(value.ToString());
		case "UInt32":
			return uint.Parse(value.ToString());
		case "UInt64":
			return ulong.Parse(value.ToString());
		case "Texture2D":
			return Image.LoadTexture(value.ToString(), (CacheType)999);
		default:
			try
			{
				foreach (MethodInfo runtimeMethod in type.GetRuntimeMethods())
				{
					if (runtimeMethod.Name == "Parse")
					{
						if (EmbeddedCharacterSheetPlugin.logDiagnostics.Value)
						{
							Debug.Log((object)("Embedded Characater Sheet Plugin: Attempting Conversion Of '" + value.ToString() + "' Using Parse Method Of '" + type.Name + "'"));
						}
						return runtimeMethod.Invoke(null, new object[1] { value.ToString() });
					}
				}
				int result = 0;
				if (int.TryParse(value.ToString(), out result))
				{
					if (EmbeddedCharacterSheetPlugin.logDiagnostics.Value)
					{
						Debug.Log((object)"Embedded Characater Sheet Plugin: Attempting Return As An Enum Int");
					}
					return result;
				}
				return value.ToString();
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)"Embedded Characater Sheet Plugin: Error In Parse Conversion");
				Debug.LogException(ex);
			}
			return value.ToString();
		}
	}
}
public static class ExtensionMethods
{
	public static bool IsMatch(this string str, string check)
	{
		string text = check;
		text = text.Replace("*", "\u00a0*").Replace("?", "\u00a0");
		text = text.Replace(".", "\\.");
		text = text.Replace("(", "\\(");
		text = text.Replace(")", "\\)");
		text = text.Replace("[", "\\[");
		text = text.Replace("]", "\\]");
		text = text.Replace("{", "\\{");
		text = text.Replace("}", "\\}");
		text = text.Replace("^", "\\^");
		text = text.Replace("$", "\\$");
		text = text.Replace("|", "\\|");
		text = text.Replace("?", "\\?");
		text = text.Replace("+", "\\+");
		text = text.Replace("+", "\\+");
		text = text.Replace("\u00a0", ".");
		text = "^" + text + "$";
		Debug.Log((object)("Embedded Character Sheet Plugin: Checking String '" + str + "' Against Pattern '" + check + "' Using Regex '" + text + "'"));
		return new Regex(text).IsMatch(str);
	}

	public static string ColsolidateModifiers(this string str)
	{
		Regex regex = new Regex("[\\+,\\-][\\d]+[\\+,\\-][\\d]+");
		MatchCollection matchCollection = regex.Matches(str);
		DataTable dataTable = new DataTable();
		foreach (Match item in matchCollection)
		{
			string text = dataTable.Compute(item.Value, "").ToString();
			if (!text.StartsWith("-"))
			{
				text = "+" + text;
			}
			Debug.Log((object)("Embedded Character Sheet Plugin: Consolidating " + item.Value + " To " + text));
			str = str.Replace(item.Value, text);
		}
		Debug.Log((object)("Embedded Character Sheet Plugin: Consolidated Modfiier String = " + str));
		return str;
	}
}