Decompiled source of Obeliskial Content v1.3.0

BepInEx/plugins/Obeliskial Content.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Obeliskial_Essentials;
using Photon.Pun;
using TMPro;
using Unity.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Rendering;
using UnityEngine.TextCore;
using UnityEngine.U2D;
using UnityEngine.U2D.Animation;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.stiffmeds.obeliskialcontent")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Enables custom content in Across the Obelisk.")]
[assembly: AssemblyFileVersion("1.3.1.0")]
[assembly: AssemblyInformationalVersion("1.3.1")]
[assembly: AssemblyProduct("Obeliskial Content")]
[assembly: AssemblyTitle("com.stiffmeds.obeliskialcontent")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Obeliskial_Content
{
	[BepInPlugin("com.stiffmeds.obeliskialcontent", "Obeliskial Content", "1.3.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("AcrossTheObelisk.exe")]
	public class Content : BaseUnityPlugin
	{
		internal const int ModDate = 20240311;

		private readonly Harmony harmony = new Harmony("com.stiffmeds.obeliskialcontent");

		internal static ManualLogSource Log;

		public static Dictionary<string, CardData> medsCardsSource = new Dictionary<string, CardData>();

		public static Dictionary<string, SubClassData> medsSubClassesSource = new Dictionary<string, SubClassData>();

		public static Dictionary<string, CardbackData> medsCardbacksSource = new Dictionary<string, CardbackData>();

		public static Dictionary<string, SkinData> medsSkinsSource = new Dictionary<string, SkinData>();

		public static Dictionary<string, TraitData> medsTraitsSource = new Dictionary<string, TraitData>();

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

		public static Dictionary<string, NPCData> medsNPCsSource = new Dictionary<string, NPCData>();

		public static Dictionary<string, AuraCurseData> medsAurasCursesSource = new Dictionary<string, AuraCurseData>();

		public static Dictionary<string, NodeData> medsNodeDataSource = new Dictionary<string, NodeData>();

		public static Dictionary<string, LootData> medsLootDataSource = new Dictionary<string, LootData>();

		public static Dictionary<string, PerkData> medsPerksSource = new Dictionary<string, PerkData>();

		public static Dictionary<string, PerkNodeData> medsPerksNodesSource = new Dictionary<string, PerkNodeData>();

		public static Dictionary<string, ChallengeTrait> medsChallengeTraitsSource = new Dictionary<string, ChallengeTrait>();

		public static Dictionary<string, CombatData> medsCombatDataSource = new Dictionary<string, CombatData>();

		public static Dictionary<string, EventData> medsEventDataSource = new Dictionary<string, EventData>();

		public static Dictionary<string, EventRequirementData> medsEventRequirementDataSource = new Dictionary<string, EventRequirementData>();

		public static Dictionary<string, ZoneData> medsZoneDataSource = new Dictionary<string, ZoneData>();

		public static SortedDictionary<string, KeyNotesData> medsKeyNotesDataSource = new SortedDictionary<string, KeyNotesData>();

		public static Dictionary<string, ChallengeData> medsChallengeDataSource = new Dictionary<string, ChallengeData>();

		public static Dictionary<string, PackData> medsPackDataSource = new Dictionary<string, PackData>();

		public static Dictionary<string, ItemData> medsItemDataSource = new Dictionary<string, ItemData>();

		public static Dictionary<string, CardPlayerPackData> medsCardPlayerPackDataSource = new Dictionary<string, CardPlayerPackData>();

		public static Dictionary<string, CorruptionPackData> medsCorruptionPackDataSource = new Dictionary<string, CorruptionPackData>();

		public static Dictionary<string, CinematicData> medsCinematicDataSource = new Dictionary<string, CinematicData>();

		public static Dictionary<string, Sprite> medsSprites = new Dictionary<string, Sprite>();

		public static Dictionary<int, TierRewardData> medsTierRewardDataSource = new Dictionary<int, TierRewardData>();

		public static Dictionary<string, Node> medsNodeSource = new Dictionary<string, Node>();

		public static Dictionary<string, string[]> medsSecondRunImport = new Dictionary<string, string[]>();

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

		public static Dictionary<string[], string> medsSecondRunImport3 = new Dictionary<string[], string>();

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

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

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

		public static TMP_SpriteAsset medsFallbackSpriteAsset = ScriptableObject.CreateInstance<TMP_SpriteAsset>();

		public static Dictionary<string, AudioClip> medsAudioClips = new Dictionary<string, AudioClip>();

		public static Dictionary<string, Sprite> medsVanillaSprites = new Dictionary<string, Sprite>();

		public static Dictionary<string, GameObject> medsGOs = new Dictionary<string, GameObject>();

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

		public static Dictionary<string, CardPlayerPairsPackData> medsCardPlayerPairsPackDataSource = new Dictionary<string, CardPlayerPairsPackData>();

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

		public static Dictionary<string, int> medsNodeEventPercent = new Dictionary<string, int>();

		public static Dictionary<string, int> medsNodeEventPriority = new Dictionary<string, int>();

		public static Dictionary<string, ThermometerTierData> medsThermometerTierData = new Dictionary<string, ThermometerTierData>();

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

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

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

		public static Dictionary<string, string[]> medsSecondRunNodesConnected = new Dictionary<string, string[]>();

		public static Dictionary<string, EventReplyDataText> medsEventReplyDataText = new Dictionary<string, EventReplyDataText>();

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

		public static int medsMaxHeroesInClass = 6;

		public static Dictionary<string, ZoneDataText> medsCustomZones = new Dictionary<string, ZoneDataText>();

		public static Dictionary<string, GameObject> medsCustomZoneGOs = new Dictionary<string, GameObject>();

		public static Dictionary<string, List<NodeDataText>> medsNodesByZone = new Dictionary<string, List<NodeDataText>>();

		public static bool medsLoadedCustomNodes = false;

		public static Dictionary<string, Vector3> medsNodePositions = new Dictionary<string, Vector3>();

		public static GameObject medsBaseRoadGO = null;

		public static Dictionary<string, List<Vector3>> medsCustomRoads = new Dictionary<string, List<Vector3>>();

		public static GameObject medsInvisibleGOHolder = new GameObject();

		public static List<string> medsVanillaIntroNodes = new List<string>
		{
			"sen_0", "tutorial_0", "secta_0", "spider_0", "forge_0", "sewers_0", "sewers_1", "wolf_0", "pyr_0", "velka_0",
			"aqua_0", "voidlow_0", "faen_0", "ulmin_0", "voidhigh_0"
		};

		public static GameObject medsZoneTransitionGO = null;

		public static Dictionary<string, PrestigeDeck> medsPrestigeDecks = new Dictionary<string, PrestigeDeck>();

		public static bool medsDoNotLetCombatFinish = false;

		public static Dictionary<string, CardData> medsExtendedEnchantments = new Dictionary<string, CardData>();

		public static string medsAwaitingKill = "";

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

		internal static List<string> medsACIndex = new List<string>();

		internal static Dictionary<string, NPCData> medsNPCs = new Dictionary<string, NPCData>();

		internal static Dictionary<string, NPCData> medsNPCsNamed = new Dictionary<string, NPCData>();

		internal static SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>();

		internal static Dictionary<string, TraitData> medsTraitsCopy = new Dictionary<string, TraitData>();

		internal static Dictionary<string, SubClassData> medsSubClassCopy = new Dictionary<string, SubClassData>();

		public static ConfigEntry<bool> medsVanillaContentLog { get; private set; }

		private void Awake()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0037: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			medsVanillaContentLog = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Debug", "Vanilla Content Logging"), false, new ConfigDescription("Logs the loading of each individual piece of vanilla content.", (AcceptableValueBase)null, Array.Empty<object>()));
			LogInfo("com.stiffmeds.obeliskialcontent 1.3.1 has loaded!");
			Essentials.RegisterMod("Obeliskial Content", "stiffmeds", "Enables custom content in Across the Obelisk.", "1.3.1", 20240311, "https://across-the-obelisk.thunderstore.io/package/meds/Obeliskial_Content/", (string[])null, "", 2000000000, new string[2] { "Core", "Content" }, "", true);
			harmony.PatchAll();
		}

		internal static void LogDebug(string msg)
		{
			Log.LogDebug((object)msg);
		}

		internal static void LogInfo(string msg)
		{
			Log.LogInfo((object)msg);
		}

		internal static void LogWarning(string msg)
		{
			Log.LogWarning((object)msg);
		}

		internal static void LogError(string msg)
		{
			Log.LogError((object)msg);
		}

		internal static void LoadVanillaContent()
		{
			LogInfo("Loading vanilla content...");
			KeyNotesData[] array = Resources.LoadAll<KeyNotesData>("KeyNotes");
			AuraCurseData[] array2 = Resources.LoadAll<AuraCurseData>("Auras");
			AuraCurseData[] array3 = Resources.LoadAll<AuraCurseData>("Curses");
			CardData[] array4 = Resources.LoadAll<CardData>("Cards");
			TraitData[] array5 = Resources.LoadAll<TraitData>("Traits");
			HeroData[] array6 = Resources.LoadAll<HeroData>("Heroes");
			PerkData[] array7 = Resources.LoadAll<PerkData>("Perks");
			PackData[] array8 = Resources.LoadAll<PackData>("Packs");
			SubClassData[] array9 = Resources.LoadAll<SubClassData>("SubClass");
			NPCData[] array10 = Resources.LoadAll<NPCData>("NPCs");
			PerkNodeData[] array11 = Resources.LoadAll<PerkNodeData>("PerkNode");
			EventData[] array12 = Resources.LoadAll<EventData>("World/Events");
			EventRequirementData[] array13 = Resources.LoadAll<EventRequirementData>("World/Events/Requirements");
			CombatData[] array14 = Resources.LoadAll<CombatData>("World/Combats");
			NodeData[] array15 = Resources.LoadAll<NodeData>("World/MapNodes");
			TierRewardData[] array16 = Resources.LoadAll<TierRewardData>("Rewards");
			ItemData[] array17 = Resources.LoadAll<ItemData>("Items");
			LootData[] array18 = Resources.LoadAll<LootData>("Loot");
			SkinData[] array19 = Resources.LoadAll<SkinData>("Skins");
			CardbackData[] array20 = Resources.LoadAll<CardbackData>("Cardbacks");
			CorruptionPackData[] array21 = Resources.LoadAll<CorruptionPackData>("CorruptionRewards");
			CardPlayerPackData[] array22 = Resources.LoadAll<CardPlayerPackData>("CardPlayer");
			CinematicData[] array23 = Resources.LoadAll<CinematicData>("Cinematics");
			ZoneData[] array24 = Resources.LoadAll<ZoneData>("World/Zones");
			ChallengeTrait[] array25 = Resources.LoadAll<ChallengeTrait>("Challenge/Traits");
			ChallengeData[] array26 = Resources.LoadAll<ChallengeData>("Challenge/Weeks");
			CardPlayerPairsPackData[] array27 = Resources.LoadAll<CardPlayerPairsPackData>("CardPlayerPairs");
			Traverse.Create((object)Globals.Instance).Field("_CardsListSearch").SetValue((object)new Dictionary<string, List<string>>());
			Globals.Instance.CardItemByType = new Dictionary<CardType, List<string>>();
			Globals.Instance.CardEnergyCost = new Dictionary<string, int>();
			LogInfo("Loading vanilla AudioClips...");
			try
			{
				AudioClip[] array28 = Resources.FindObjectsOfTypeAll<AudioClip>();
				AudioClip[] array29 = array28;
				foreach (AudioClip val in array29)
				{
					if (medsVanillaContentLog.Value)
					{
						LogInfo("Loading vanilla AudioClip: " + ((Object)val).name);
					}
					medsAudioClips[((Object)val).name] = val;
				}
				LogInfo(medsAudioClips.Count + " vanilla AudioClips loaded");
			}
			catch (Exception ex)
			{
				LogError("Error loading AudioClips: " + ex.Message);
			}
			LogInfo("Loading vanilla Sprites...");
			try
			{
				Sprite[] array30 = Resources.FindObjectsOfTypeAll<Sprite>();
				Sprite[] array31 = array30;
				foreach (Sprite val2 in array31)
				{
					if (medsVanillaContentLog.Value)
					{
						LogInfo("Loading vanilla Sprite: " + ((Object)val2).name);
					}
					medsSprites[((Object)val2).name.Trim().ToLower()] = val2;
				}
				LogInfo(medsSprites.Count + " vanilla Sprites loaded");
			}
			catch (Exception ex2)
			{
				LogError("Error loading Sprites: " + ex2.Message);
			}
			LogInfo("Loading vanilla gameObjects...");
			try
			{
				GameObject[] array32 = Resources.FindObjectsOfTypeAll<GameObject>();
				GameObject[] array33 = array32;
				foreach (GameObject val3 in array33)
				{
					if (medsVanillaContentLog.Value)
					{
						LogInfo("Loading vanilla gameObject: " + ((Object)val3).name);
					}
					if (medsGOs.ContainsKey(((Object)val3).name))
					{
						int num = medsGOs[((Object)val3).name].GetComponents(typeof(Component)).Count();
						int num2 = val3.GetComponents(typeof(Component)).Count();
						if (num > num2)
						{
							continue;
						}
					}
					medsGOs[((Object)val3).name] = val3;
				}
				LogInfo(medsGOs.Count + " vanilla GameObjects loaded");
			}
			catch (Exception ex3)
			{
				LogError("Error loading GameObjects: " + ex3.Message);
			}
			LogInfo("Loading vanilla thermometerTierData...");
			try
			{
				ThermometerTierData[] array34 = Resources.FindObjectsOfTypeAll<ThermometerTierData>();
				ThermometerTierData[] array35 = array34;
				foreach (ThermometerTierData val4 in array35)
				{
					if (medsVanillaContentLog.Value)
					{
						LogInfo("Loading vanilla thermometerTierData: " + ((Object)val4).name);
					}
					medsThermometerTierData[((Object)val4).name] = val4;
				}
				LogInfo("Loaded " + medsThermometerTierData.Count + " vanilla thermometerTierData");
			}
			catch (Exception ex4)
			{
				LogError("Error loading vanilla thermometerTierData: " + ex4.Message);
			}
			LogInfo("Loading vanilla keynotes...");
			for (int m = 0; m < array.Length; m++)
			{
				try
				{
					string text = array[m].KeynoteName.Replace(" ", "").ToLower();
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla keynote: " + text);
					}
					array[m].Id = text;
					medsKeyNotesDataSource[text] = Object.Instantiate<KeyNotesData>(array[m]);
					medsKeyNotesDataSource[text].KeynoteName = Texts.Instance.GetText(medsKeyNotesDataSource[text].KeynoteName, "");
					string text2 = Texts.Instance.GetText(text + "_description", "keynotes");
					if (text2 != "")
					{
						medsKeyNotesDataSource[text].Description = text2;
					}
					string text3 = Texts.Instance.GetText(text + "_descriptionExtended", "keynotes");
					if (text3 != "")
					{
						medsKeyNotesDataSource[text].DescriptionExtended = text3;
					}
				}
				catch (Exception ex5)
				{
					LogError("Error loading vanilla keynotes: " + ex5.Message);
				}
			}
			LogInfo(medsKeyNotesDataSource.Count + " vanilla keynotes loaded");
			Globals.Instance.KeyNotes = medsKeyNotesDataSource;
			LogInfo("Loading auras & curses...");
			for (int n = 0; n < array2.Length; n++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla auraCurse: " + array2[n].ACName);
					}
					array2[n].Init();
					medsAurasCursesSource.Add(array2[n].Id, Object.Instantiate<AuraCurseData>(array2[n]));
					medsAurasCursesSource[array2[n].Id].Init();
					medsAurasCursesSource[array2[n].Id].ACName = Texts.Instance.GetText(medsAurasCursesSource[array2[n].Id].Id, "");
					string text4 = Texts.Instance.GetText(array2[n].Id + "_description", "auracurse");
					if (text4 != "")
					{
						medsAurasCursesSource[array2[n].Id].Description = text4;
					}
					medsACIndex.Add(array2[n].Id.ToLower());
				}
				catch (Exception ex6)
				{
					LogError("Error loading vanilla auraCurse: " + ex6.Message);
				}
			}
			for (int num3 = 0; num3 < array3.Length; num3++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla auraCurse: " + array3[num3].ACName);
					}
					array3[num3].Init();
					medsAurasCursesSource[array3[num3].Id] = Object.Instantiate<AuraCurseData>(array3[num3]);
					medsAurasCursesSource[array3[num3].Id].Init();
					medsAurasCursesSource[array3[num3].Id].ACName = Texts.Instance.GetText(medsAurasCursesSource[array3[num3].Id].Id, "");
					string text5 = Texts.Instance.GetText(array3[num3].Id + "_description", "auracurse");
					if (text5 != "")
					{
						medsAurasCursesSource[array3[num3].Id].Description = text5;
					}
					medsACIndex.Add(array3[num3].Id.ToLower());
				}
				catch (Exception ex7)
				{
					LogError("Error loading vanilla auraCurse: " + ex7.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_AurasCursesSource").SetValue((object)medsAurasCursesSource);
			Traverse.Create((object)Globals.Instance).Field("_AurasCursesIndex").SetValue((object)medsACIndex);
			Traverse.Create((object)Globals.Instance).Field("_AurasCurses").SetValue((object)medsAurasCursesSource);
			LogInfo("Loading cards...");
			for (int num4 = 0; num4 < array4.Length; num4++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla card: " + ((Object)array4[num4]).name);
					}
					array4[num4].Id = ((Object)array4[num4]).name.ToLower();
					medsCardsSource[array4[num4].Id] = Object.Instantiate<CardData>(array4[num4]);
				}
				catch (Exception ex8)
				{
					LogError("Error loading vanilla card: " + ex8.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CardsSource").SetValue((object)medsCardsSource);
			LogInfo("Loading tier reward data...");
			for (int num5 = 0; num5 < array16.Length; num5++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla tier reward data: " + ((Object)array16[num5]).name);
					}
					medsTierRewardDataSource[array16[num5].TierNum] = Object.Instantiate<TierRewardData>(array16[num5]);
				}
				catch (Exception ex9)
				{
					LogError("Error loading vanilla tier reward data: " + ex9.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_TierRewardDataSource").SetValue((object)medsTierRewardDataSource);
			LogInfo("Tier reward data loaded!");
			LogInfo("Loading NPCs...");
			medsSecondRunImport = new Dictionary<string, string[]>();
			for (int num6 = 0; num6 < array10.Length; num6++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla NPC: " + array10[num6].Id);
					}
					medsNPCsSource[array10[num6].Id] = Object.Instantiate<NPCData>(array10[num6]);
				}
				catch (Exception ex10)
				{
					LogError("Error loading vanilla NPC: " + ex10.Message);
				}
			}
			LogInfo("Creating vanilla NPC clones...");
			foreach (string key in medsNPCsSource.Keys)
			{
				try
				{
					if (!sortedDictionary.ContainsKey(key))
					{
						sortedDictionary.Add(key, medsNPCsSource[key].NPCName);
					}
					if (medsSecondRunImport.ContainsKey(key))
					{
						medsNPCsSource[key].BaseMonster = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[key][0]) && medsNPCsSource.ContainsKey(medsSecondRunImport[key][0])) ? medsNPCsSource[medsSecondRunImport[key][0]] : null);
						medsNPCsSource[key].HellModeMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[key][1]) && medsNPCsSource.ContainsKey(medsSecondRunImport[key][1])) ? medsNPCsSource[medsSecondRunImport[key][1]] : null);
						medsNPCsSource[key].NgPlusMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[key][2]) && medsNPCsSource.ContainsKey(medsSecondRunImport[key][2])) ? medsNPCsSource[medsSecondRunImport[key][2]] : null);
						medsNPCsSource[key].UpgradedMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[key][3]) && medsNPCsSource.ContainsKey(medsSecondRunImport[key][3])) ? medsNPCsSource[medsSecondRunImport[key][3]] : null);
					}
					medsNPCs.Add(key, Object.Instantiate<NPCData>(medsNPCsSource[key]));
					string text6 = Texts.Instance.GetText(key + "_name", "monsters");
					if (text6 != "")
					{
						medsNPCs[key].NPCName = text6;
					}
					if (medsNPCsSource[key].IsNamed && medsNPCsSource[key].Difficulty > -1)
					{
						medsNPCsNamed.Add(key, Object.Instantiate<NPCData>(medsNPCsSource[key]));
						string text7 = Texts.Instance.GetText(key + "_name", "monsters");
						if (text7 != "")
						{
							medsNPCsNamed[key].NPCName = text7;
						}
					}
				}
				catch (Exception ex11)
				{
					LogError("Error creating NPC clones: " + ex11.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_NPCsSource").SetValue((object)medsNPCsSource);
			Traverse.Create((object)Globals.Instance).Field("_NPCs").SetValue((object)medsNPCs);
			Traverse.Create((object)Globals.Instance).Field("_NPCsNamed").SetValue((object)medsNPCsNamed);
			LogInfo("NPCs loaded!");
			LogInfo("Loading item data...");
			for (int num7 = 0; num7 < array17.Length; num7++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla item data: " + ((Object)array17[num7]).name);
					}
					array17[num7].Id = ((Object)array17[num7]).name.ToLower();
					medsItemDataSource[array17[num7].Id] = Object.Instantiate<ItemData>(array17[num7]);
				}
				catch (Exception ex12)
				{
					LogError("Error loading vanilla item data: " + ex12.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_ItemDataSource").SetValue((object)medsItemDataSource);
			LogInfo("Loading traits...");
			for (int num8 = 0; num8 < array5.Length; num8++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla trait: " + array5[num8].TraitName);
					}
					array5[num8].Init();
					medsTraitsSource[array5[num8].Id] = Object.Instantiate<TraitData>(array5[num8]);
					medsTraitsSource[array5[num8].Id].SetNameAndDescription();
					medsTraitsCopy[array5[num8].Id] = Object.Instantiate<TraitData>(medsTraitsSource[array5[num8].Id]);
				}
				catch (Exception ex13)
				{
					LogError("Error loading vanilla trait: " + ex13.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_TraitsSource").SetValue((object)medsTraitsSource);
			Traverse.Create((object)Globals.Instance).Field("_Traits").SetValue((object)medsTraitsCopy);
			LogDebug("Loading vanilla heroes...");
			Dictionary<string, HeroData> dictionary = new Dictionary<string, HeroData>();
			for (int num9 = 0; num9 < array6.Length; num9++)
			{
				try
				{
					dictionary.Add(array6[num9].Id, Object.Instantiate<HeroData>(array6[num9]));
				}
				catch (Exception ex14)
				{
					LogError("Error loading vanilla heroes: " + ex14.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_Heroes").SetValue((object)dictionary);
			LogInfo("Heroes loaded!");
			for (int num10 = 0; num10 < array7.Length; num10++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla perk: " + array7[num10].Id);
					}
					array7[num10].Init();
					medsPerksSource[array7[num10].Id] = Object.Instantiate<PerkData>(array7[num10]);
				}
				catch (Exception ex15)
				{
					LogError("Error loading vanilla perk: " + ex15.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_PerksSource").SetValue((object)medsPerksSource);
			LogInfo("Loading PackData...");
			for (int num11 = 0; num11 < array8.Length; num11++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla PackData: " + array8[num11].PackId);
					}
					medsPackDataSource[array8[num11].PackId.ToLower()] = Object.Instantiate<PackData>(array8[num11]);
				}
				catch (Exception ex16)
				{
					LogError("Error loading vanilla PackData: " + ex16.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_PackDataSource").SetValue((object)medsPackDataSource);
			LogInfo("Loading subclasses...");
			for (int num12 = 0; num12 < array9.Length; num12++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla subclass: " + array9[num12].SubClassName);
					}
					medsSubClassesSource[array9[num12].SubClassName.Replace(" ", "").ToLower()] = Object.Instantiate<SubClassData>(array9[num12]);
				}
				catch (Exception ex17)
				{
					LogError("Error loading vanilla subclass: " + ex17.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_SubClassSource").SetValue((object)medsSubClassesSource);
			LogInfo("Creating subclass text...");
			foreach (string key2 in medsSubClassesSource.Keys)
			{
				try
				{
					medsSubClassCopy[key2] = Object.Instantiate<SubClassData>(medsSubClassesSource[key2]);
					if (medsSubClassCopy[key2].CharacterName.Length < 2)
					{
						medsSubClassCopy[key2].CharacterName = Texts.Instance.GetText(key2 + "_name", "class");
					}
					if (medsSubClassCopy[key2].CharacterDescription.Length < 2)
					{
						medsSubClassCopy[key2].CharacterDescription = Texts.Instance.GetText(key2 + "_description", "class");
					}
					if (medsSubClassCopy[key2].CharacterDescriptionStrength.Length < 2)
					{
						medsSubClassCopy[key2].CharacterDescriptionStrength = Texts.Instance.GetText(key2 + "_strength", "class");
					}
				}
				catch (Exception ex18)
				{
					LogError("Error creating subclass text: " + ex18.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_SubClass").SetValue((object)medsSubClassCopy);
			LogInfo("Subclass text created!");
			LogInfo("Loading SkinData...");
			for (int num13 = 0; num13 < array19.Length; num13++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla SkinData: " + array19[num13].SkinId);
					}
					medsSkinsSource[array19[num13].SkinId.ToLower()] = Object.Instantiate<SkinData>(array19[num13]);
				}
				catch (Exception ex19)
				{
					LogError("Error loading vanilla SkinData: " + ex19.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_SkinDataSource").SetValue((object)medsSkinsSource);
			LogInfo("Loading CardbackData...");
			for (int num14 = 0; num14 < array20.Length; num14++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla CardbackData: " + array20[num14].CardbackId);
					}
					medsCardbacksSource[array20[num14].CardbackId.ToLower()] = Object.Instantiate<CardbackData>(array20[num14]);
				}
				catch (Exception ex20)
				{
					LogError("Error loading vanilla CardbackData: " + ex20.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CardbackDataSource").SetValue((object)medsCardbacksSource);
			LogInfo("Loading perknodes...");
			for (int num15 = 0; num15 < array11.Length; num15++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla perknode: " + array11[num15].Id);
					}
					medsPerksNodesSource[array11[num15].Id] = Object.Instantiate<PerkNodeData>(array11[num15]);
				}
				catch (Exception ex21)
				{
					LogError("Error loading vanilla perknode: " + ex21.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_PerksNodesSource").SetValue((object)medsPerksNodesSource);
			LogInfo("Loading event requirements...");
			for (int num16 = 0; num16 < array13.Length; num16++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla event requirement: " + array13[num16].RequirementId);
					}
					string text8 = array13[num16].RequirementId.ToLower();
					medsEventRequirementDataSource[text8] = Object.Instantiate<EventRequirementData>(array13[num16]);
					if (medsEventRequirementDataSource[text8].ItemTrack || medsEventRequirementDataSource[text8].RequirementTrack)
					{
						string text9 = Texts.Instance.GetText(text8 + "_name", "requirements");
						if (text9 != "")
						{
							medsEventRequirementDataSource[text8].RequirementName = text9;
						}
						string text10 = Texts.Instance.GetText(text8 + "_description", "requirements");
						if (text10 != "")
						{
							medsEventRequirementDataSource[text8].Description = text10;
						}
					}
				}
				catch (Exception ex22)
				{
					LogError("Error loading vanilla event requirement: " + ex22.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_Requirements").SetValue((object)medsEventRequirementDataSource);
			LogInfo("Loading pairs packs...");
			for (int num17 = 0; num17 < array27.Length; num17++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla pairs pack data: " + array27[num17].PackId);
					}
					medsCardPlayerPairsPackDataSource[array27[num17].PackId.ToLower()] = Object.Instantiate<CardPlayerPairsPackData>(array27[num17]);
				}
				catch (Exception ex23)
				{
					LogError("Error loading vanilla pairs pack data: " + ex23.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CardPlayerPairsPackDataSource").SetValue((object)medsCardPlayerPairsPackDataSource);
			LogInfo("Loading CorruptionPackData...");
			for (int num18 = 0; num18 < array21.Length; num18++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla CorruptionPackData: " + ((Object)array21[num18]).name);
					}
					medsCorruptionPackDataSource[((Object)array21[num18]).name] = Object.Instantiate<CorruptionPackData>(array21[num18]);
				}
				catch (Exception ex24)
				{
					LogError("Error loading vanilla CorruptionPackData: " + ex24.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CorruptionPackDataSource").SetValue((object)medsCorruptionPackDataSource);
			LogInfo("Loading CardPlayerPackData...");
			for (int num19 = 0; num19 < array22.Length; num19++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla CardPlayerPackData: " + array22[num19].PackId);
					}
					medsCardPlayerPackDataSource[array22[num19].PackId.ToLower()] = Object.Instantiate<CardPlayerPackData>(array22[num19]);
				}
				catch (Exception ex25)
				{
					LogError("Error loading vanilla CardPlayerPackData: " + ex25.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CardPlayerPackDataSource").SetValue((object)medsCardPlayerPackDataSource);
			LogInfo("Loading cinematic data...");
			for (int num20 = 0; num20 < array23.Length; num20++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla cinematic data: " + array23[num20].CinematicId);
					}
					medsCinematicDataSource[array23[num20].CinematicId.Replace(" ", "").ToLower()] = Object.Instantiate<CinematicData>(array23[num20]);
				}
				catch (Exception ex26)
				{
					LogError("Error loading vanilla cinematic: " + ex26.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_Cinematics").SetValue((object)medsCinematicDataSource);
			LogInfo("Loading combat data...");
			for (int num21 = 0; num21 < array14.Length; num21++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla combatData: " + array14[num21].CombatId);
					}
					medsCombatDataSource[array14[num21].CombatId.Replace(" ", "").ToLower()] = Object.Instantiate<CombatData>(array14[num21]);
				}
				catch (Exception ex27)
				{
					LogError("Error loading vanilla combatData: " + ex27.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_CombatDataSource").SetValue((object)medsCombatDataSource);
			LogInfo("Loading LootData...");
			for (int num22 = 0; num22 < array18.Length; num22++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla LootData: " + array18[num22].Id);
					}
					medsLootDataSource[array18[num22].Id.ToLower()] = Object.Instantiate<LootData>(array18[num22]);
				}
				catch (Exception ex28)
				{
					LogError("Error loading vanilla LootData: " + ex28.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_LootDataSource").SetValue((object)medsLootDataSource);
			LogInfo("Loading zone data...");
			for (int num23 = 0; num23 < array24.Length; num23++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla zone data: " + array24[num23].ZoneId);
					}
					medsZoneDataSource[array24[num23].ZoneId.ToLower()] = Object.Instantiate<ZoneData>(array24[num23]);
				}
				catch (Exception ex29)
				{
					LogError("Error loading vanilla zone data: " + ex29.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_ZoneDataSource").SetValue((object)medsZoneDataSource);
			LogInfo("Loading node data...");
			for (int num24 = 0; num24 < array15.Length; num24++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla node data: " + array15[num24].NodeId);
					}
					string text11 = array15[num24].NodeId.ToLower();
					if (!medsNodesByZone.ContainsKey(array15[num24].NodeZone.ZoneId.ToLower()))
					{
						medsNodesByZone[array15[num24].NodeZone.ZoneId.ToLower()] = new List<NodeDataText>();
					}
					if (!medsNodesByZone[array15[num24].NodeZone.ZoneId.ToLower()].Contains(DataTextConvert.ToText(array15[num24])))
					{
						medsNodesByZone[array15[num24].NodeZone.ZoneId.ToLower()].Add(DataTextConvert.ToText(array15[num24]));
					}
					medsNodeDataSource[text11] = array15[num24];
					((Object)medsNodeDataSource[text11]).name = text11;
				}
				catch (Exception ex30)
				{
					LogError("Error loading vanilla node data: " + ex30.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_NodeDataSource").SetValue((object)medsNodeDataSource);
			Traverse.Create((object)Globals.Instance).Field("_NodeCombatEventRelation").SetValue((object)medsNodeCombatEventRelation);
			LogInfo("Loading events...");
			for (int num25 = 0; num25 < array12.Length; num25++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla event: " + array12[num25].EventId);
					}
					EventData val5 = Object.Instantiate<EventData>(array12[num25]);
					val5.Init();
					medsEventDataSource[val5.EventId.ToLower()] = val5;
				}
				catch (Exception ex31)
				{
					LogError("Error loading vanilla events: " + ex31.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_Events").SetValue((object)medsEventDataSource);
			LogInfo("Loading challenge traits...");
			for (int num26 = 0; num26 < array25.Length; num26++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla challengeTrait: " + array25[num26].Id);
					}
					medsChallengeTraitsSource[array25[num26].Id.ToLower()] = Object.Instantiate<ChallengeTrait>(array25[num26]);
				}
				catch (Exception ex32)
				{
					LogError("Error loading vanilla challengeTrait: " + ex32.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_ChallengeTraitsSource").SetValue((object)medsChallengeTraitsSource);
			LogInfo("Loading challenge data...");
			for (int num27 = 0; num27 < array26.Length; num27++)
			{
				try
				{
					if (medsVanillaContentLog.Value)
					{
						LogDebug("Loading vanilla challengeData: " + array26[num27].Id);
					}
					medsChallengeDataSource[array26[num27].Id.ToLower()] = Object.Instantiate<ChallengeData>(array26[num27]);
				}
				catch (Exception ex33)
				{
					LogError("Error loading vanilla challengeData: " + ex33.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_WeeklyDataSource").SetValue((object)medsChallengeDataSource);
		}

		internal static bool LoadCustomContent(string sFolderName)
		{
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_4574: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Invalid comparison between Unknown and I4
			//IL_04c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_051b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0534: Unknown result type (might be due to invalid IL or missing references)
			//IL_053e: Unknown result type (might be due to invalid IL or missing references)
			//IL_059e: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0642: Unknown result type (might be due to invalid IL or missing references)
			//IL_0647: Unknown result type (might be due to invalid IL or missing references)
			//IL_0657: Unknown result type (might be due to invalid IL or missing references)
			//IL_065c: Unknown result type (might be due to invalid IL or missing references)
			//IL_066c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0671: Unknown result type (might be due to invalid IL or missing references)
			//IL_0681: Unknown result type (might be due to invalid IL or missing references)
			//IL_0686: Unknown result type (might be due to invalid IL or missing references)
			//IL_068f: Unknown result type (might be due to invalid IL or missing references)
			//IL_069b: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0730: Unknown result type (might be due to invalid IL or missing references)
			//IL_0735: Unknown result type (might be due to invalid IL or missing references)
			//IL_073f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0744: Unknown result type (might be due to invalid IL or missing references)
			//IL_074e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0753: Unknown result type (might be due to invalid IL or missing references)
			//IL_075e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0763: Unknown result type (might be due to invalid IL or missing references)
			//IL_0773: Unknown result type (might be due to invalid IL or missing references)
			//IL_0786: Unknown result type (might be due to invalid IL or missing references)
			//IL_0799: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_07d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_07f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0800: Unknown result type (might be due to invalid IL or missing references)
			//IL_080b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0817: Unknown result type (might be due to invalid IL or missing references)
			//IL_085c: Unknown result type (might be due to invalid IL or missing references)
			if (!Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName)))
			{
				LogError("Cannot find content pack folder: " + sFolderName);
				return false;
			}
			LogInfo("Loading content pack: " + sFolderName);
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "audio")))
			{
				int num = 0;
				LogInfo("Loading AudioClips from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "audio")).GetFiles("*.wav");
				FileInfo[] array = files;
				foreach (FileInfo fileInfo in array)
				{
					LogInfo("Loading " + sFolderName + " AudioClip: " + fileInfo.Name);
					string text = "file:///" + fileInfo.ToString().Replace("\\", "/");
					try
					{
						UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)20);
						try
						{
							audioClip.SendWebRequest();
							while (!audioClip.isDone)
							{
							}
							if ((int)audioClip.result == 2)
							{
								LogError(audioClip.error);
								continue;
							}
							AudioClip content = DownloadHandlerAudioClip.GetContent(audioClip);
							((Object)content).name = Path.GetFileNameWithoutExtension(fileInfo.Name);
							medsAudioClips[Path.GetFileNameWithoutExtension(fileInfo.Name)] = content;
							num++;
						}
						finally
						{
							((IDisposable)audioClip)?.Dispose();
						}
					}
					catch (Exception ex)
					{
						LogError("Error loading custom " + sFolderName + " AudioClip " + fileInfo.Name + ": " + ex.Message);
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " AudioClips from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "sprite")))
			{
				int num = 0;
				LogInfo("Loading Sprites from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "sprite")).GetFiles("*.png");
				FileInfo[] array2 = files;
				foreach (FileInfo fileInfo2 in array2)
				{
					LogInfo("Loading " + sFolderName + " Sprite: " + fileInfo2.Name);
					try
					{
						Texture2D val = new Texture2D(0, 0);
						ImageConversion.LoadImage(val, File.ReadAllBytes(fileInfo2.ToString()));
						Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)0);
						((Object)val2).name = Path.GetFileNameWithoutExtension(fileInfo2.Name).Trim().ToLower();
						medsSprites[Path.GetFileNameWithoutExtension(fileInfo2.Name).Trim().ToLower()] = val2;
						num++;
					}
					catch (Exception ex2)
					{
						LogError("Error loading custom " + sFolderName + " Sprite " + fileInfo2.Name + ": " + ex2.Message);
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " Sprites from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "gameObject")))
			{
				int num = 0;
				LogInfo("Loading gameObjects from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "gameObject")).GetFiles("*.json");
				FileInfo[] array3 = files;
				NativeArray<Vector2> val8 = default(NativeArray<Vector2>);
				NativeArray<Vector3> val9 = default(NativeArray<Vector3>);
				NativeArray<Vector4> val10 = default(NativeArray<Vector4>);
				NativeArray<BoneWeight> val11 = default(NativeArray<BoneWeight>);
				foreach (FileInfo fileInfo3 in array3)
				{
					LogInfo("Loading " + sFolderName + " gameObject retexture: " + fileInfo3.Name);
					try
					{
						GameObjectRetexture val3 = JsonUtility.FromJson<GameObjectRetexture>(File.ReadAllText(fileInfo3.ToString()));
						GameObject gO = DataTextConvert.GetGO(val3.BaseGameObjectID);
						if ((Object)(object)gO != (Object)null)
						{
							((Object)gO).name = val3.NewGameObjectID;
							Sprite val4 = (Utility.IsNullOrWhiteSpace(val3.SpriteToUse) ? null : DataTextConvert.GetSprite(val3.SpriteToUse));
							Vector3 localScale = gO.transform.localScale;
							LogInfo("localScale: " + ((object)(Vector3)(ref localScale)).ToString());
							gO.transform.localScale = new Vector3(gO.transform.localScale.x * val3.ScaleX * (float)((!val3.Flip) ? 1 : (-1)), gO.transform.localScale.y * val3.ScaleY, gO.transform.localScale.z);
							LogInfo("Flip: " + val3.Flip);
							LogInfo("Scale: " + val3.ScaleX + "," + val3.ScaleY);
							localScale = gO.transform.localScale;
							LogInfo("NEW localScale: " + ((object)(Vector3)(ref localScale)).ToString());
							if ((Object)(object)val4 != (Object)null)
							{
								try
								{
									SpriteRenderer[] componentsInChildren = gO.GetComponentsInChildren<SpriteRenderer>(true);
									SpriteRenderer[] array4 = componentsInChildren;
									foreach (SpriteRenderer val5 in array4)
									{
										if ((Object)(object)val5.sprite != (Object)null && (Object)(object)((Component)val5).gameObject.GetComponent<SpriteSkin>() != (Object)null)
										{
											LogDebug("trying to change sprite for spriterenderer: " + ((Object)val5).name);
											Texture2D texture = val4.texture;
											Rect rect = val5.sprite.rect;
											float x = ((Rect)(ref rect)).x;
											rect = val5.sprite.rect;
											float y = ((Rect)(ref rect)).y;
											rect = val5.sprite.rect;
											float width = ((Rect)(ref rect)).width;
											rect = val5.sprite.rect;
											Rect val6 = new Rect(x, y, width, ((Rect)(ref rect)).height);
											float x2 = val5.sprite.pivot.x;
											rect = val5.sprite.rect;
											float num2 = x2 / ((Rect)(ref rect)).width;
											float y2 = val5.sprite.pivot.y;
											rect = val5.sprite.rect;
											Sprite val7 = Sprite.Create(texture, val6, new Vector2(num2, y2 / ((Rect)(ref rect)).height));
											int vertexCount = SpriteDataAccessExtensions.GetVertexCount(val5.sprite);
											val8..ctor(vertexCount, (Allocator)2, (NativeArrayOptions)1);
											val9..ctor(vertexCount, (Allocator)2, (NativeArrayOptions)1);
											val10..ctor(vertexCount, (Allocator)2, (NativeArrayOptions)1);
											val11..ctor(vertexCount, (Allocator)2, (NativeArrayOptions)1);
											NativeSlice<Vector2> vertexAttribute = SpriteDataAccessExtensions.GetVertexAttribute<Vector2>(val5.sprite, (VertexAttribute)4);
											NativeSlice<Vector3> vertexAttribute2 = SpriteDataAccessExtensions.GetVertexAttribute<Vector3>(val5.sprite, (VertexAttribute)0);
											NativeSlice<Vector4> vertexAttribute3 = SpriteDataAccessExtensions.GetVertexAttribute<Vector4>(val5.sprite, (VertexAttribute)2);
											NativeSlice<BoneWeight> vertexAttribute4 = SpriteDataAccessExtensions.GetVertexAttribute<BoneWeight>(val5.sprite, (VertexAttribute)12);
											for (int m = 0; m < vertexCount; m++)
											{
												val8[m] = vertexAttribute[m];
												val9[m] = vertexAttribute2[m];
												val10[m] = vertexAttribute3[m];
												val11[m] = vertexAttribute4[m];
											}
											SpriteDataAccessExtensions.SetIndices(val7, SpriteDataAccessExtensions.GetIndices(val5.sprite));
											SpriteDataAccessExtensions.SetVertexCount(val7, SpriteDataAccessExtensions.GetVertexCount(val5.sprite));
											SpriteDataAccessExtensions.SetVertexAttribute<Vector2>(val7, (VertexAttribute)4, val8);
											SpriteDataAccessExtensions.SetVertexAttribute<Vector3>(val7, (VertexAttribute)0, val9);
											SpriteDataAccessExtensions.SetVertexAttribute<Vector4>(val7, (VertexAttribute)2, val10);
											SpriteDataAccessExtensions.SetVertexAttribute<BoneWeight>(val7, (VertexAttribute)12, val11);
											val8.Dispose();
											val9.Dispose();
											val10.Dispose();
											val11.Dispose();
											SpriteDataAccessExtensions.SetBones(val7, SpriteDataAccessExtensions.GetBones(val5.sprite));
											SpriteDataAccessExtensions.SetBindPoses(val7, SpriteDataAccessExtensions.GetBindPoses(val5.sprite));
											val5.sprite = val7;
										}
									}
								}
								catch
								{
									LogError("Unable to retexture gameObject " + val3.NewGameObjectID + " for unknown reason! Please let Meds know.");
								}
							}
							else if (!Utility.IsNullOrWhiteSpace(val3.SpriteToUse))
							{
								LogError("Could not find gameObject retexture sprite: " + val3.SpriteToUse);
							}
							medsGOs[val3.NewGameObjectID] = gO;
							num++;
						}
						else
						{
							LogError("Could not find base gameObject with ID: " + val3.BaseGameObjectID);
						}
					}
					catch (Exception ex3)
					{
						LogError("Error loading custom " + sFolderName + " GameObject " + fileInfo3.Name + ": " + ex3.Message);
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " gameObject retextures from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "keyNote")))
			{
				int num = 0;
				LogInfo("Loading keynotes from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "keyNote")).GetFiles("*.json");
				FileInfo[] array5 = files;
				foreach (FileInfo fileInfo4 in array5)
				{
					LogInfo("Loading " + sFolderName + " keynote: " + fileInfo4.Name);
					try
					{
						KeyNotesData val12 = DataTextConvert.ToData(JsonUtility.FromJson<KeyNotesDataText>(File.ReadAllText(fileInfo4.ToString())));
						medsKeyNotesDataSource[val12.Id] = Object.Instantiate<KeyNotesData>(val12);
						num++;
					}
					catch (Exception ex4)
					{
						LogError("Error loading custom " + sFolderName + " keynote " + fileInfo4.Name + ": " + ex4.Message);
					}
				}
				Globals.Instance.KeyNotes = medsKeyNotesDataSource;
				if (num > 0)
				{
					LogInfo("Loaded " + num + " keynotes from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "auraCurse")))
			{
				int num = 0;
				LogInfo("Loading auraCurses from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "auraCurse")).GetFiles("*.json");
				FileInfo[] array6 = files;
				foreach (FileInfo fileInfo5 in array6)
				{
					LogInfo("Loading " + sFolderName + " auraCurse: " + fileInfo5.Name);
					try
					{
						AuraCurseData val13 = DataTextConvert.ToData(JsonUtility.FromJson<AuraCurseDataText>(File.ReadAllText(fileInfo5.ToString())));
						val13.Init();
						medsAurasCursesSource[val13.Id] = Object.Instantiate<AuraCurseData>(val13);
						if (!medsACIndex.Contains(val13.Id.ToLower()))
						{
							medsACIndex.Add(val13.Id.ToLower());
						}
						num++;
					}
					catch (Exception ex5)
					{
						LogError("Error loading custom " + sFolderName + " auraCurse " + fileInfo5.Name + ": " + ex5.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_AurasCursesSource").SetValue((object)medsAurasCursesSource);
				Traverse.Create((object)Globals.Instance).Field("_AurasCursesIndex").SetValue((object)medsACIndex);
				Traverse.Create((object)Globals.Instance).Field("_AurasCurses").SetValue((object)medsAurasCursesSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " auraCurses from " + sFolderName);
				}
			}
			medsCardsNeedingItems = new Dictionary<string, string>();
			medsCardsNeedingItemEnchants = new Dictionary<string, string>();
			medsSecondRunImport = new Dictionary<string, string[]>();
			medsSecondRunImport2 = new Dictionary<string, string>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "card")))
			{
				int num = 0;
				LogInfo("Loading cards from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "card")).GetFiles("*.json");
				Dictionary<string, CardData> dictionary = new Dictionary<string, CardData>();
				FileInfo[] array7 = files;
				foreach (FileInfo fileInfo6 in array7)
				{
					LogInfo("Loading " + sFolderName + " card: " + fileInfo6.Name);
					try
					{
						CardData val14 = DataTextConvert.ToData(JsonUtility.FromJson<CardDataText>(File.ReadAllText(fileInfo6.ToString())));
						if (!medsCustomUnlocks.Contains(val14.Id))
						{
							medsCustomUnlocks.Add(val14.Id);
						}
						medsCardsSource[val14.Id] = Object.Instantiate<CardData>(val14);
						num++;
					}
					catch (Exception ex6)
					{
						LogError("Error loading custom " + sFolderName + " card " + fileInfo6.Name + ": " + ex6.Message);
					}
				}
				SortedDictionary<string, CardData> dictionary2 = new SortedDictionary<string, CardData>(medsCardsSource);
				medsCardsSource = new Dictionary<string, CardData>(dictionary2);
				LogInfo("Loading custom card component for " + sFolderName + ": AddCardList...");
				foreach (string key2 in medsSecondRunImport.Keys)
				{
					try
					{
						medsCardsSource[key2].AddCardList = (CardData[])(object)new CardData[medsSecondRunImport[key2].Length];
						for (int num5 = 0; num5 < medsSecondRunImport[key2].Length; num5++)
						{
							if (medsCardsSource.ContainsKey(medsSecondRunImport[key2][num5]))
							{
								medsCardsSource[key2].AddCardList[num5] = medsCardsSource[medsSecondRunImport[key2][num5]];
							}
							else
							{
								medsCardsSource[key2].AddCardList[num5] = null;
							}
						}
					}
					catch (Exception ex7)
					{
						LogError("Error loading AddCardList: " + ex7.Message);
					}
				}
				LogInfo("Loading custom card component for " + sFolderName + ": UpgradesToRare...");
				foreach (string key3 in medsSecondRunImport2.Keys)
				{
					try
					{
						if (medsCardsSource.ContainsKey(medsSecondRunImport2[key3]))
						{
							medsCardsSource[key3].UpgradesToRare = medsCardsSource[medsSecondRunImport2[key3]];
						}
					}
					catch (Exception ex8)
					{
						LogError("Error loading UpgradesToRare: " + ex8.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CardsSource").SetValue((object)medsCardsSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " cards from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "tierReward")))
			{
				int num = 0;
				LogInfo("Loading tierRewards from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "tierReward")).GetFiles("*.json");
				FileInfo[] array8 = files;
				foreach (FileInfo fileInfo7 in array8)
				{
					LogInfo("Loading " + sFolderName + " tierReward: " + fileInfo7.Name);
					try
					{
						TierRewardData val15 = DataTextConvert.ToData(JsonUtility.FromJson<TierRewardDataText>(File.ReadAllText(fileInfo7.ToString())));
						medsTierRewardDataSource[val15.TierNum] = Object.Instantiate<TierRewardData>(val15);
						num++;
					}
					catch (Exception ex9)
					{
						LogError("Error loading custom " + sFolderName + " tierReward " + fileInfo7.Name + ": " + ex9.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_TierRewardDataSource").SetValue((object)medsTierRewardDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " tierRewards from " + sFolderName);
				}
			}
			medsSecondRunImport = new Dictionary<string, string[]>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "NPC")))
			{
				int num = 0;
				LogInfo("Loading NPCs from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "NPC")).GetFiles("*.json");
				FileInfo[] array9 = files;
				foreach (FileInfo fileInfo8 in array9)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " NPC: " + fileInfo8.Name);
						NPCData val16 = DataTextConvert.ToData(JsonUtility.FromJson<NPCDataText>(File.ReadAllText(fileInfo8.ToString())));
						medsNPCsSource[val16.Id] = Object.Instantiate<NPCData>(val16);
						sortedDictionary[val16.Id] = medsNPCsSource[val16.Id].NPCName;
						if (medsSecondRunImport.ContainsKey(val16.Id))
						{
							medsNPCsSource[val16.Id].BaseMonster = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[val16.Id][0]) && medsNPCsSource.ContainsKey(medsSecondRunImport[val16.Id][0])) ? medsNPCsSource[medsSecondRunImport[val16.Id][0]] : null);
							medsNPCsSource[val16.Id].HellModeMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[val16.Id][1]) && medsNPCsSource.ContainsKey(medsSecondRunImport[val16.Id][1])) ? medsNPCsSource[medsSecondRunImport[val16.Id][1]] : null);
							medsNPCsSource[val16.Id].NgPlusMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[val16.Id][2]) && medsNPCsSource.ContainsKey(medsSecondRunImport[val16.Id][2])) ? medsNPCsSource[medsSecondRunImport[val16.Id][2]] : null);
							medsNPCsSource[val16.Id].UpgradedMob = ((!Utility.IsNullOrWhiteSpace(medsSecondRunImport[val16.Id][3]) && medsNPCsSource.ContainsKey(medsSecondRunImport[val16.Id][3])) ? medsNPCsSource[medsSecondRunImport[val16.Id][3]] : null);
						}
						medsNPCs[val16.Id] = Object.Instantiate<NPCData>(medsNPCsSource[val16.Id]);
						string text2 = Texts.Instance.GetText(val16.Id + "_name", "monsters");
						if (text2 != "")
						{
							medsNPCs[val16.Id].NPCName = text2;
						}
						if (medsNPCsSource[val16.Id].IsNamed && medsNPCsSource[val16.Id].Difficulty > -1)
						{
							medsNPCsNamed[val16.Id] = Object.Instantiate<NPCData>(medsNPCsSource[val16.Id]);
							string text3 = Texts.Instance.GetText(val16.Id + "_name", "monsters");
							if (text3 != "")
							{
								medsNPCsNamed[val16.Id].NPCName = text3;
							}
						}
						num++;
					}
					catch (Exception ex10)
					{
						LogError("Error loading custom " + sFolderName + " NPC " + fileInfo8.Name + ": " + ex10.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_NPCsSource").SetValue((object)medsNPCsSource);
				Traverse.Create((object)Globals.Instance).Field("_NPCs").SetValue((object)medsNPCs);
				Traverse.Create((object)Globals.Instance).Field("_NPCsNamed").SetValue((object)medsNPCsNamed);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " NPCs from " + sFolderName);
				}
			}
			LogInfo("Loading custom card component for " + sFolderName + ": Item...");
			foreach (string key4 in medsCardsNeedingItems.Keys)
			{
				try
				{
					ItemData val17 = DataTextConvert.ToData(JsonUtility.FromJson<ItemDataText>(medsCardsNeedingItems[key4]));
					LogDebug("Loading custom item: " + val17.Id);
					medsItemDataSource[val17.Id] = Object.Instantiate<ItemData>(val17);
					medsCardsSource[key4].Item = medsItemDataSource[val17.Id];
				}
				catch (Exception ex11)
				{
					LogError("Error loading custom " + sFolderName + " card item " + key4 + ": " + ex11.Message);
				}
			}
			LogInfo("Loading custom card component for " + sFolderName + ": ItemEnchantment...");
			foreach (string key5 in medsCardsNeedingItemEnchants.Keys)
			{
				try
				{
					ItemData val18 = DataTextConvert.ToData(JsonUtility.FromJson<ItemDataText>(medsCardsNeedingItemEnchants[key5]));
					LogDebug("Loading custom enchantment: " + val18.Id);
					medsItemDataSource[val18.Id] = Object.Instantiate<ItemData>(val18);
					medsCardsSource[key5].ItemEnchantment = medsItemDataSource[val18.Id];
				}
				catch (Exception ex12)
				{
					LogError("Error loading custom " + sFolderName + " card enchantment " + key5 + ": " + ex12.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_ItemDataSource").SetValue((object)medsItemDataSource);
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "trait")))
			{
				int num = 0;
				LogInfo("Loading traits from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "trait")).GetFiles("*.json");
				FileInfo[] array10 = files;
				foreach (FileInfo fileInfo9 in array10)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " trait: " + fileInfo9.Name);
						TraitData val19 = DataTextConvert.ToData(JsonUtility.FromJson<TraitDataText>(File.ReadAllText(fileInfo9.ToString())));
						medsTraitsSource[val19.Id] = Object.Instantiate<TraitData>(val19);
						medsTraitsCopy[val19.Id] = Object.Instantiate<TraitData>(medsTraitsSource[val19.Id]);
						if (!medsCustomTraitsSource.Contains(val19.Id))
						{
							medsCustomTraitsSource.Add(val19.Id);
						}
						num++;
					}
					catch (Exception ex13)
					{
						LogError("Error loading custom " + sFolderName + " trait " + fileInfo9.Name + ": " + ex13.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_TraitsSource").SetValue((object)medsTraitsSource);
				Traverse.Create((object)Globals.Instance).Field("_Traits").SetValue((object)medsTraitsCopy);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " traits from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "perk")))
			{
				int num = 0;
				LogInfo("Loading perks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "perk")).GetFiles("*.json");
				FileInfo[] array11 = files;
				foreach (FileInfo fileInfo10 in array11)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " perk: " + fileInfo10.Name);
						PerkData val20 = DataTextConvert.ToData(JsonUtility.FromJson<PerkDataText>(File.ReadAllText(fileInfo10.ToString())));
						medsPerksSource[val20.Id] = Object.Instantiate<PerkData>(val20);
						num++;
					}
					catch (Exception ex14)
					{
						LogError("Error loading custom " + sFolderName + " perk " + fileInfo10.Name + ": " + ex14.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_PerksSource").SetValue((object)medsPerksSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " perks from " + sFolderName);
				}
			}
			medsSecondRunImport2 = new Dictionary<string, string>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "pack")))
			{
				int num = 0;
				LogInfo("Loading packs from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "pack")).GetFiles("*.json");
				FileInfo[] array12 = files;
				foreach (FileInfo fileInfo11 in array12)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " pack: " + fileInfo11.Name);
						PackData val21 = DataTextConvert.ToData(JsonUtility.FromJson<PackDataText>(File.ReadAllText(fileInfo11.ToString())));
						medsPackDataSource[val21.PackId] = Object.Instantiate<PackData>(val21);
						num++;
					}
					catch (Exception ex15)
					{
						LogError("Error loading custom " + sFolderName + " pack " + fileInfo11.Name + ": " + ex15.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_PackDataSource").SetValue((object)medsPackDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " packs from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "subclass")))
			{
				int num = 0;
				LogInfo("Loading subclasses from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "subclass")).GetFiles("*.json");
				FileInfo[] array13 = files;
				foreach (FileInfo fileInfo12 in array13)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " subclass: " + fileInfo12.Name);
						SubClassData val22 = DataTextConvert.ToData(JsonUtility.FromJson<SubClassDataText>(File.ReadAllText(fileInfo12.ToString())));
						medsSubClassesSource[val22.Id] = Object.Instantiate<SubClassData>(val22);
						medsSubClassCopy[val22.Id] = Object.Instantiate<SubClassData>(medsSubClassesSource[val22.Id]);
						if (medsSubClassCopy[val22.Id].CharacterName.Length < 2)
						{
							medsSubClassCopy[val22.Id].CharacterName = Texts.Instance.GetText(val22.Id + "_name", "class");
						}
						if (medsSubClassCopy[val22.Id].CharacterDescription.Length < 2)
						{
							medsSubClassCopy[val22.Id].CharacterDescription = Texts.Instance.GetText(val22.Id + "_description", "class");
						}
						if (medsSubClassCopy[val22.Id].CharacterDescriptionStrength.Length < 2)
						{
							medsSubClassCopy[val22.Id].CharacterDescriptionStrength = Texts.Instance.GetText(val22.Id + "_strength", "class");
						}
						num++;
						if (medsSubClassCopy[val22.Id].InitialUnlock)
						{
							LogInfo("Actually Unlocking " + val22.Id);
							List<string> list = (List<string>)Traverse.Create((object)PlayerManager.Instance).Field("unlockedHeroes").GetValue();
							list.Add(val22.Id.ToLower());
							Traverse.Create((object)PlayerManager.Instance).Field("unlockedHeroes").SetValue((object)list);
						}
					}
					catch (Exception ex16)
					{
						LogError("Error loading custom " + sFolderName + " subclass " + fileInfo12.Name + ": " + ex16.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_SubClassSource").SetValue((object)medsSubClassesSource);
				Traverse.Create((object)Globals.Instance).Field("_SubClass").SetValue((object)medsSubClassCopy);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " subclasses from " + sFolderName);
				}
				LogDebug("pack-subclass binding commenced...");
				foreach (string key6 in medsSecondRunImport2.Keys)
				{
					string key = medsSecondRunImport2[key6].ToLower().Trim();
					if (medsSubClassesSource.ContainsKey(key) && medsPackDataSource.ContainsKey(key6))
					{
						medsPackDataSource[key6].RequiredClass = medsSubClassesSource[key];
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_PackDataSource").SetValue((object)medsPackDataSource);
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "skin")))
			{
				int num = 0;
				LogInfo("Loading skins from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "skin")).GetFiles("*.json");
				FileInfo[] array14 = files;
				foreach (FileInfo fileInfo13 in array14)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " skin: " + fileInfo13.Name);
						SkinData val23 = DataTextConvert.ToData(JsonUtility.FromJson<SkinDataText>(File.ReadAllText(fileInfo13.ToString())));
						medsSkinsSource[val23.SkinId.ToLower()] = Object.Instantiate<SkinData>(val23);
						num++;
					}
					catch (Exception ex17)
					{
						LogError("Error loading custom " + sFolderName + " skin " + fileInfo13.Name + ": " + ex17.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_SkinDataSource").SetValue((object)medsSkinsSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " skins from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cardback")))
			{
				int num = 0;
				LogInfo("Loading cardbacks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cardback")).GetFiles("*.json");
				FileInfo[] array15 = files;
				foreach (FileInfo fileInfo14 in array15)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " cardback: " + fileInfo14.Name);
						CardbackData val24 = DataTextConvert.ToData(JsonUtility.FromJson<CardbackDataText>(File.ReadAllText(fileInfo14.ToString())));
						medsCardbacksSource[val24.CardbackId.ToLower()] = Object.Instantiate<CardbackData>(val24);
						num++;
					}
					catch (Exception ex18)
					{
						LogError("Error loading custom " + sFolderName + " cardback " + fileInfo14.Name + ": " + ex18.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CardbackDataSource").SetValue((object)medsCardbacksSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " cardbacks from " + sFolderName);
				}
			}
			medsSecondRunImport = new Dictionary<string, string[]>();
			medsSecondRunImport2 = new Dictionary<string, string>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "perkNode")))
			{
				int num = 0;
				LogInfo("Loading perkNodes from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "perkNode")).GetFiles("*.json");
				FileInfo[] array16 = files;
				foreach (FileInfo fileInfo15 in array16)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " perkNode: " + fileInfo15.Name);
						PerkNodeData val25 = DataTextConvert.ToData(JsonUtility.FromJson<PerkNodeDataText>(File.ReadAllText(fileInfo15.ToString())));
						medsPerksNodesSource[val25.Id] = Object.Instantiate<PerkNodeData>(val25);
						num++;
					}
					catch (Exception ex19)
					{
						LogError("Error loading custom " + sFolderName + " perkNode " + fileInfo15.Name + ": " + ex19.Message);
					}
				}
				foreach (string key7 in medsPerksNodesSource.Keys)
				{
					try
					{
						if (medsSecondRunImport.ContainsKey(key7))
						{
							medsPerksNodesSource[key7].PerksConnected = (PerkNodeData[])(object)new PerkNodeData[medsSecondRunImport[key7].Length];
							for (int num15 = 0; num15 < medsSecondRunImport[key7].Length; num15++)
							{
								medsPerksNodesSource[key7].PerksConnected[num15] = (medsPerksNodesSource.ContainsKey(medsSecondRunImport[key7][num15]) ? medsPerksNodesSource[medsSecondRunImport[key7][num15]] : null);
							}
						}
						if (medsSecondRunImport2.ContainsKey(key7))
						{
							medsPerksNodesSource[key7].PerkRequired = (medsPerksNodesSource.ContainsKey(medsSecondRunImport2[key7]) ? medsPerksNodesSource[medsSecondRunImport2[key7]] : null);
						}
					}
					catch (Exception ex20)
					{
						LogError("Error performing late binding of " + sFolderName + " perknodes: " + ex20.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_PerksNodesSource").SetValue((object)medsPerksNodesSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " perkNodes from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "eventRequirement")))
			{
				int num = 0;
				LogInfo("Loading eventRequirements from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "eventRequirement")).GetFiles("*.json");
				FileInfo[] array17 = files;
				foreach (FileInfo fileInfo16 in array17)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " eventRequirement: " + fileInfo16.Name);
						EventRequirementData val26 = DataTextConvert.ToData(JsonUtility.FromJson<EventRequirementDataText>(File.ReadAllText(fileInfo16.ToString())));
						medsEventRequirementDataSource[val26.RequirementId] = Object.Instantiate<EventRequirementData>(val26);
						num++;
					}
					catch (Exception ex21)
					{
						LogError("Error loading custom " + sFolderName + " eventRequirement " + fileInfo16.Name + ": " + ex21.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_Requirements").SetValue((object)medsEventRequirementDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " eventRequirements from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "pairsPack")))
			{
				int num = 0;
				LogInfo("Loading pairsPacks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "pairsPack")).GetFiles("*.json");
				FileInfo[] array18 = files;
				foreach (FileInfo fileInfo17 in array18)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " pairsPack: " + fileInfo17.Name);
						CardPlayerPairsPackData val27 = DataTextConvert.ToData(JsonUtility.FromJson<CardPlayerPairsPackDataText>(File.ReadAllText(fileInfo17.ToString())));
						medsCardPlayerPairsPackDataSource[val27.PackId] = Object.Instantiate<CardPlayerPairsPackData>(val27);
						num++;
					}
					catch (Exception ex22)
					{
						LogError("Error loading custom " + sFolderName + " pairsPack " + fileInfo17.Name + ": " + ex22.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CardPlayerPairsPackDataSource").SetValue((object)medsCardPlayerPairsPackDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " pairsPacks from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "corruptionPack")))
			{
				int num = 0;
				LogInfo("Loading corruptionPacks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "corruptionPack")).GetFiles("*.json");
				FileInfo[] array19 = files;
				foreach (FileInfo fileInfo18 in array19)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " corruptionPack: " + fileInfo18.Name);
						CorruptionPackData val28 = DataTextConvert.ToData(JsonUtility.FromJson<CorruptionPackDataText>(File.ReadAllText(fileInfo18.ToString())));
						medsCorruptionPackDataSource[val28.PackName] = Object.Instantiate<CorruptionPackData>(val28);
						num++;
					}
					catch (Exception ex23)
					{
						LogError("Error loading custom " + sFolderName + " corruptionPack " + fileInfo18.Name + ": " + ex23.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CorruptionPackDataSource").SetValue((object)medsCorruptionPackDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " corruptionPacks from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cardPlayerPack")))
			{
				int num = 0;
				LogInfo("Loading cardPlayerPacks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cardPlayerPack")).GetFiles("*.json");
				FileInfo[] array20 = files;
				foreach (FileInfo fileInfo19 in array20)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " cardPlayerPack: " + fileInfo19.Name);
						CardPlayerPackData val29 = DataTextConvert.ToData(JsonUtility.FromJson<CardPlayerPackDataText>(File.ReadAllText(fileInfo19.ToString())));
						medsCardPlayerPackDataSource[val29.PackId] = Object.Instantiate<CardPlayerPackData>(val29);
						num++;
					}
					catch (Exception ex24)
					{
						LogError("Error loading custom " + sFolderName + " cardPlayerPack " + fileInfo19.Name + ": " + ex24.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CardPlayerPackDataSource").SetValue((object)medsCardPlayerPackDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " cardPlayerPacks from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cinematic")))
			{
				int num = 0;
				LogInfo("Loading cinematic from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "cinematic")).GetFiles("*.json");
				FileInfo[] array21 = files;
				foreach (FileInfo fileInfo20 in array21)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " cinematic: " + fileInfo20.Name);
						CinematicData val30 = DataTextConvert.ToData(JsonUtility.FromJson<CinematicDataText>(File.ReadAllText(fileInfo20.ToString())));
						medsCinematicDataSource[val30.CinematicId.ToLower()] = Object.Instantiate<CinematicData>(val30);
						num++;
					}
					catch (Exception ex25)
					{
						LogError("Error loading custom " + sFolderName + " cinematic " + fileInfo20.Name + ": " + ex25.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_Cinematics").SetValue((object)medsCinematicDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " cinematics from " + sFolderName);
				}
			}
			medsSecondRunCombatEvent = new Dictionary<string, string>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "combatData")))
			{
				int num = 0;
				LogInfo("Loading combatData from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "combatData")).GetFiles("*.json");
				FileInfo[] array22 = files;
				foreach (FileInfo fileInfo21 in array22)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " combat: " + fileInfo21.Name);
						CombatData val31 = DataTextConvert.ToData(JsonUtility.FromJson<CombatDataText>(File.ReadAllText(fileInfo21.ToString())));
						medsCombatDataSource[val31.CombatId] = Object.Instantiate<CombatData>(val31);
						num++;
					}
					catch (Exception ex26)
					{
						LogError("Error loading custom " + sFolderName + " combat " + fileInfo21.Name + ": " + ex26.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_CombatDataSource").SetValue((object)medsCombatDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " combatData from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "loot")))
			{
				int num = 0;
				LogInfo("Loading loot from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "loot")).GetFiles("*.json");
				FileInfo[] array23 = files;
				foreach (FileInfo fileInfo22 in array23)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " loot: " + fileInfo22.Name);
						LootData val32 = DataTextConvert.ToData(JsonUtility.FromJson<LootDataText>(File.ReadAllText(fileInfo22.ToString())));
						medsLootDataSource[val32.Id] = Object.Instantiate<LootData>(val32);
						num++;
					}
					catch (Exception ex27)
					{
						LogError("Error loading custom " + sFolderName + " loot " + fileInfo22.Name + ": " + ex27.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_LootDataSource").SetValue((object)medsLootDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " loot from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "zone")))
			{
				int num = 0;
				LogInfo("Loading zones from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "zone")).GetFiles("*.json");
				FileInfo[] array24 = files;
				foreach (FileInfo fileInfo23 in array24)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " zone: " + fileInfo23.Name);
						ZoneData val33 = DataTextConvert.ToData(JsonUtility.FromJson<ZoneDataText>(File.ReadAllText(fileInfo23.ToString())));
						medsZoneDataSource[val33.ZoneId.ToLower()] = Object.Instantiate<ZoneData>(val33);
						medsCustomZones[val33.ZoneId.ToLower()] = JsonUtility.FromJson<ZoneDataText>(File.ReadAllText(fileInfo23.ToString()));
						num++;
					}
					catch (Exception ex28)
					{
						LogError("Error loading custom " + sFolderName + " zone " + fileInfo23.Name + ": " + ex28.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_ZoneDataSource").SetValue((object)medsZoneDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " zones from " + sFolderName);
				}
			}
			medsSecondRunImport = new Dictionary<string, string[]>();
			medsSecondRunImport2 = new Dictionary<string, string>();
			medsSecondRunNodesConnected = new Dictionary<string, string[]>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "node")))
			{
				int num = 0;
				LogInfo("Loading nodes from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "node")).GetFiles("*.json");
				FileInfo[] array25 = files;
				foreach (FileInfo fileInfo24 in array25)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " node: " + fileInfo24.Name);
						NodeData val34 = DataTextConvert.ToData(JsonUtility.FromJson<NodeDataText>(File.ReadAllText(fileInfo24.ToString())));
						string text4 = val34.NodeId.ToLower();
						medsNodeDataSource[text4] = Object.Instantiate<NodeData>(val34);
						((Object)medsNodeDataSource[text4]).name = text4;
						if (!medsNodesByZone.ContainsKey(val34.NodeZone.ZoneId.ToLower()))
						{
							medsNodesByZone[val34.NodeZone.ZoneId.ToLower()] = new List<NodeDataText>();
						}
						if (!medsNodesByZone[val34.NodeZone.ZoneId.ToLower()].Contains(JsonUtility.FromJson<NodeDataText>(File.ReadAllText(fileInfo24.ToString()))))
						{
							medsNodesByZone[val34.NodeZone.ZoneId.ToLower()].Add(JsonUtility.FromJson<NodeDataText>(File.ReadAllText(fileInfo24.ToString())));
						}
						num++;
					}
					catch (Exception ex29)
					{
						LogError("Error loading custom " + sFolderName + " node " + fileInfo24.Name + ": " + ex29.Message);
					}
				}
				LogDebug("Late binding of NodesConnected");
				foreach (KeyValuePair<string, string[]> item in medsSecondRunNodesConnected)
				{
					try
					{
						medsNodeDataSource[item.Key].NodesConnected = (NodeData[])(object)new NodeData[item.Value.Length];
						for (int num25 = 0; num25 < item.Value.Length; num25++)
						{
							medsNodeDataSource[item.Key].NodesConnected[num25] = DataTextConvert.GetNode(item.Value[num25]);
						}
					}
					catch (Exception ex30)
					{
						LogError("Error performing late binding of " + sFolderName + " NodesConnected: " + ex30.Message);
					}
				}
				LogDebug("Late binding of NodesConnectedRequirement");
				foreach (KeyValuePair<string, string[]> item2 in medsSecondRunImport)
				{
					try
					{
						medsNodeDataSource[item2.Key].NodesConnectedRequirement = (NodesConnectedRequirement[])(object)new NodesConnectedRequirement[item2.Value.Length];
						for (int num26 = 0; num26 < item2.Value.Length; num26++)
						{
							medsNodeDataSource[item2.Key].NodesConnectedRequirement[num26] = DataTextConvert.ToData(JsonUtility.FromJson<NodesConnectedRequirementText>(item2.Value[num26]));
						}
					}
					catch (Exception ex31)
					{
						LogError("Error performing late binding of " + sFolderName + " NodesConnectedRequirement: " + ex31.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_NodeDataSource").SetValue((object)medsNodeDataSource);
				Traverse.Create((object)Globals.Instance).Field("_NodeCombatEventRelation").SetValue((object)medsNodeCombatEventRelation);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " nodes from " + sFolderName);
				}
			}
			medsSecondRunImport = new Dictionary<string, string[]>();
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "event")))
			{
				int num = 0;
				LogInfo("Loading events from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "event")).GetFiles("*.json");
				FileInfo[] array26 = files;
				foreach (FileInfo fileInfo25 in array26)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " event: " + fileInfo25.Name);
						EventData val35 = DataTextConvert.ToData(JsonUtility.FromJson<EventDataText>(File.ReadAllText(fileInfo25.ToString())));
						medsEventDataSource[val35.EventId] = Object.Instantiate<EventData>(val35);
						num++;
					}
					catch (Exception ex32)
					{
						LogError("Error loading custom " + sFolderName + " event " + fileInfo25.Name + ": " + ex32.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_Events").SetValue((object)medsEventDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " events from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "eventReply")))
			{
				int num = 0;
				LogInfo("Loading eventReplies from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "eventReply")).GetFiles("*.json");
				FileInfo[] array27 = files;
				foreach (FileInfo fileInfo26 in array27)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " eventReply: " + fileInfo26.Name);
						string text5 = File.ReadAllText(fileInfo26.ToString());
						EventReplyDataText val36 = JsonUtility.FromJson<EventReplyDataText>(text5);
						if (medsSecondRunImport.ContainsKey(val36.medsEvent.ToLower()))
						{
							string[] array28 = medsSecondRunImport[val36.medsEvent.ToLower()];
							Array.Resize(ref array28, array28.Length + 1);
							array28[^1] = text5;
							medsSecondRunImport[val36.medsEvent.ToLower()] = array28;
						}
						else if (medsEventDataSource.ContainsKey(val36.medsEvent.ToLower()))
						{
							medsSecondRunImport[val36.medsEvent.ToLower()] = new string[medsEventDataSource[val36.medsEvent.ToLower()].Replys.Length + 1];
							for (int num29 = 0; num29 < medsEventDataSource[val36.medsEvent.ToLower()].Replys.Length; num29++)
							{
								medsSecondRunImport[val36.medsEvent.ToLower()][num29] = JsonUtility.ToJson((object)DataTextConvert.ToText(medsEventDataSource[val36.medsEvent.ToLower()].Replys[num29], "", -1));
							}
							medsSecondRunImport[val36.medsEvent.ToLower()][medsEventDataSource[val36.medsEvent.ToLower()].Replys.Length] = text5;
						}
						else
						{
							medsSecondRunImport[val36.medsEvent.ToLower()] = new string[1] { text5 };
						}
						num++;
					}
					catch (Exception ex33)
					{
						LogError("Error loading custom " + sFolderName + " eventReplies " + fileInfo26.Name + ": " + ex33.Message);
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " eventReplies from " + sFolderName);
				}
			}
			LogDebug("late reply-event bindings");
			foreach (string key8 in medsSecondRunImport.Keys)
			{
				try
				{
					medsEventDataSource[key8].Replys = (EventReplyData[])(object)new EventReplyData[medsSecondRunImport[key8].Length];
					for (int num30 = 0; num30 < medsSecondRunImport[key8].Length; num30++)
					{
						medsEventDataSource[key8].Replys[num30] = DataTextConvert.ToData(JsonUtility.FromJson<EventReplyDataText>(medsSecondRunImport[key8][num30]), key8);
					}
					medsEventDataSource[key8].Init();
				}
				catch (Exception ex34)
				{
					LogError("Error performing " + sFolderName + " reply-event bindings: " + ex34.Message);
				}
			}
			foreach (string key9 in medsSecondRunCombatEvent.Keys)
			{
				try
				{
					medsCombatDataSource[key9].EventData = (medsEventDataSource.ContainsKey(medsSecondRunCombatEvent[key9]) ? medsEventDataSource[medsSecondRunCombatEvent[key9]] : null);
				}
				catch (Exception ex35)
				{
					LogError("Error performing " + sFolderName + " combat-event bindings: " + ex35.Message);
				}
			}
			Traverse.Create((object)Globals.Instance).Field("_NodeDataSource").SetValue((object)medsNodeDataSource);
			Traverse.Create((object)Globals.Instance).Field("_NodeCombatEventRelation").SetValue((object)medsNodeCombatEventRelation);
			Traverse.Create((object)Globals.Instance).Field("_CombatDataSource").SetValue((object)medsCombatDataSource);
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "challengeTrait")))
			{
				int num = 0;
				LogInfo("Loading challengeTraits from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "challengeTrait")).GetFiles("*.json");
				FileInfo[] array29 = files;
				foreach (FileInfo fileInfo27 in array29)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " challengeTrait: " + fileInfo27.Name);
						ChallengeTrait val37 = DataTextConvert.ToData(JsonUtility.FromJson<ChallengeTraitText>(File.ReadAllText(fileInfo27.ToString())));
						medsChallengeTraitsSource[val37.Id.ToLower()] = Object.Instantiate<ChallengeTrait>(val37);
						num++;
					}
					catch (Exception ex36)
					{
						LogError("Error loading custom " + sFolderName + " challengeTrait " + fileInfo27.Name + ": " + ex36.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_ChallengeTraitsSource").SetValue((object)medsChallengeTraitsSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " challengeTraits from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "challengeData")))
			{
				int num = 0;
				LogInfo("Loading challengeData from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "challengeData")).GetFiles("*.json");
				FileInfo[] array30 = files;
				foreach (FileInfo fileInfo28 in array30)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " challengeData: " + fileInfo28.Name);
						ChallengeData val38 = DataTextConvert.ToData(JsonUtility.FromJson<ChallengeDataText>(File.ReadAllText(fileInfo28.ToString())));
						medsChallengeDataSource[val38.Id.ToLower()] = Object.Instantiate<ChallengeData>(val38);
						num++;
					}
					catch (Exception ex37)
					{
						LogError("Error loading custom " + sFolderName + " challengeData " + fileInfo28.Name + ": " + ex37.Message);
					}
				}
				Traverse.Create((object)Globals.Instance).Field("_WeeklyDataSource").SetValue((object)medsChallengeDataSource);
				if (num > 0)
				{
					LogInfo("Loaded " + num + " challengeData from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "roadsTXT")))
			{
				int num = 0;
				LogInfo("Loading roads from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "roadsTXT")).GetFiles("*.txt");
				FileInfo[] array31 = files;
				foreach (FileInfo fileInfo29 in array31)
				{
					LogInfo("Loading " + sFolderName + " road: " + fileInfo29.Name);
					string[] array32 = File.ReadAllLines(fileInfo29.ToString());
					string[] array33 = array32;
					foreach (string text6 in array33)
					{
						if (text6.Length > 2 && text6.Substring(0, 2) == "\\\\")
						{
							continue;
						}
						string[] array34 = text6.Replace(" ", "").Split("|");
						if (array34.Length != 2)
						{
							LogError("malformed road data in file " + fileInfo29.Name + ": " + text6);
							continue;
						}
						if (!medsCustomRoads.ContainsKey(array34[0].ToLower()))
						{
							medsCustomRoads[array34[0].ToLower()] = new List<Vector3>();
						}
						string[] array35 = array34[1].Split("),(");
						foreach (string text7 in array35)
						{
							if (text7.Split(",").Length == 2)
							{
								string text8 = text7.Replace("(", "").Replace(")", "");
								try
								{
									medsCustomRoads[array34[0].ToLower()].Add(new Vector3(float.Parse(text8.Split(",")[0]), float.Parse(text8.Split(",")[1])));
									num++;
								}
								catch (Exception ex38)
								{
									LogError("cannot parse floats in " + sFolderName + " road " + fileInfo29.Name + " " + text8 + ": " + ex38.Message);
								}
							}
						}
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " roads from " + sFolderName);
				}
			}
			if (Directory.Exists(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "prestigeDeck")))
			{
				int num = 0;
				LogInfo("Loading prestige decks from " + sFolderName);
				FileInfo[] files = new DirectoryInfo(Path.Combine(Paths.ConfigPath, "Obeliskial_importing", sFolderName, "prestigeDeck")).GetFiles("*.json");
				FileInfo[] array36 = files;
				foreach (FileInfo fileInfo30 in array36)
				{
					try
					{
						LogInfo("Loading " + sFolderName + " prestige deck: " + fileInfo30.Name);
						PrestigeDeck val39 = JsonUtility.FromJson<PrestigeDeck>(File.ReadAllText(fileInfo30.ToString()));
						medsPrestigeDecks[val39.ID.ToLower()] = val39;
						string[] cards = val39.Cards;
						foreach (string text9 in cards)
						{
							Essentials.medsIncludeInBaseSearch(val39.Name, text9, true);
							Essentials.medsIncludeInBaseSearch(val39.ID, text9, true);
							if (!medsCardsSource.ContainsKey(text9))
							{
								continue;
							}
							CardData val40 = medsCardsSource[text9];
							if ((Object)(object)val40 != (Object)null)
							{
								if (!Utility.IsNullOrWhiteSpace(val40.UpgradesTo1))
								{
									Essentials.medsIncludeInBaseSearch(val39.Name, val40.UpgradesTo1, true);
									Essentials.medsIncludeInBaseSearch(val39.ID, val40.UpgradesTo1, true);
								}
								if (!Utility.IsNullOrWhiteSpace(val40.UpgradesTo2))
								{
									Essentials.medsIncludeInBaseSearch(val39.Name, val40.UpgradesTo2, true);
									Essentials.medsIncludeInBaseSearch(val39.ID, val40.UpgradesTo2, true);
								}
								if ((Object)(object)val40.UpgradesToRare != (Object)null)
								{
									Essentials.medsIncludeInBaseSearch(val39.Name, val40.UpgradesToRare.Id, true);
									Essentials.medsIncludeInBaseSearch(val39.ID, val40.UpgradesToRare.Id, true);
								}
							}
						}
						num++;
					}
					catch (Exception ex39)
					{
						LogError("Error loading custom " + sFolderName + " prestige deck " + fileInfo30.Name + ": " + ex39.Message);
					}
				}
				if (num > 0)
				{
					LogInfo("Loaded " + num + " prestige decks from " + sFolderName);
				}
			}
			LogInfo("Finished loading " + sFolderName);
			return true;
		}
	}
	public class DataTextConvert
	{
		public static int ToData<T>(string text)
		{
			if (typeof(T).BaseType == typeof(Enum))
			{
				try
				{
					return (int)Enum.Parse(typeof(T), text, ignoreCase: true);
				}
				catch
				{
					Content.LogError("ToData<T> has captured a value of type " + typeof(T)?.ToString() + " that it cannot parse: " + text);
					return 0;
				}
			}
			Content.LogError("ToData<T> is capturing a type that it isn't set up for!!! " + typeof(T));
			return 0;
		}

		public static AuraCurseData ToData(AuraCurseDataText text)
		{
			//IL_08de: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f8: Expected O, but got Unknown
			//IL_08ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0906: Expected O, but got Unknown
			AuraCurseData val = ScriptableObject.CreateInstance<AuraCurseData>();
			val.ACName = text.ACName;
			((Object)val).name = text.ACName;
			val.AuraConsumed = text.AuraConsumed;
			val.AuraDamageIncreasedPercent = text.AuraDamageIncreasedPercent;
			val.AuraDamageIncreasedPercent2 = text.AuraDamageIncreasedPercent2;
			val.AuraDamageIncreasedPercent3 = text.AuraDamageIncreasedPercent3;
			val.AuraDamageIncreasedPercent4 = text.AuraDamageIncreasedPercent4;
			val.AuraDamageIncreasedPercentPerStack = text.AuraDamageIncreasedPercentPerStack;
			val.AuraDamageIncreasedPercentPerStack2 = text.AuraDamageIncreasedPercentPerStack2;
			val.AuraDamageIncreasedPercentPerStack3 = text.AuraDamageIncreasedPercentPerStack3;
			val.AuraDamageIncreasedPercentPerStack4 = text.AuraDamageIncreasedPercentPerStack4;
			val.AuraDamageIncreasedPercentPerStackPerEnergy = text.AuraDamageIncreasedPercentPerStackPerEnergy;
			val.AuraDamageIncreasedPercentPerStackPerEnergy2 = text.AuraDamageIncreasedPercentPerStackPerEnergy2;
			val.AuraDamageIncreasedPercentPerStackPerEnergy3 = text.AuraDamageIncreasedPercentPerStackPerEnergy3;
			val.AuraDamageIncreasedPercentPerStackPerEnergy4 = text.AuraDamageIncreasedPercentPerStackPerEnergy4;
			val.AuraDamageIncreasedPerStack = text.AuraDamageIncreasedPerStack;
			val.AuraDamageIncreasedPerStack2 = text.AuraDamageIncreasedPerStack2;
			val.AuraDamageIncreasedPerStack3 = text.AuraDamageIncreasedPerStack3;
			val.AuraDamageIncreasedPerStack4 = text.AuraDamageIncreasedPerStack4;
			val.AuraDamageIncreasedTotal = text.AuraDamageIncreasedTotal;
			val.AuraDamageIncreasedTotal2 = text.AuraDamageIncreasedTotal2;
			val.AuraDamageIncreasedTotal3 = text.AuraDamageIncreasedTotal3;
			val.AuraDamageIncreasedTotal4 = text.AuraDamageIncreasedTotal4;
			val.AuraDamageType = (DamageType)ToData<DamageType>(text.AuraDamageType);
			val.AuraDamageType2 = (DamageType)ToData<DamageType>(text.AuraDamageType2);
			val.AuraDamageType3 = (DamageType)ToData<DamageType>(text.AuraDamageType3);
			val.AuraDamageType4 = (DamageType)ToData<DamageType>(text.AuraDamageType4);
			val.AuraDamageChargesBasedOnACCharges = (Content.medsAurasCursesSource.ContainsKey(text.AuraDamageChargesBasedOnACCharges) ? Content.medsAurasCursesSource[text.AuraDamageChargesBasedOnACCharges] : null);
			val.ConsumedDamageChargesBasedOnACCharges = (Content.medsAurasCursesSource.ContainsKey(text.ConsumedDamageChargesBasedOnACCharges) ? Content.medsAurasCursesSource[text.ConsumedDamageChargesBasedOnACCharges] : null);
			val.BlockChargesGainedPerStack = text.BlockChargesGainedPerStack;
			val.CardsDrawPerStack = text.CardsDrawPerStack;
			val.CharacterStatAbsolute = text.CharacterStatAbsolute;
			val.CharacterStatAbsoluteValue = text.CharacterStatAbsoluteValue;
			val.CharacterStatAbsoluteValuePerStack = text.CharacterStatAbsoluteValuePerStack;
			val.CharacterStatChargesMultiplierNeededForOne = text.CharacterStatChargesMultiplierNeededForOne;
			val.CharacterStatModified = (CharacterStat)ToData<CharacterStat>(text.CharacterStatModified);
			val.CharacterStatModifiedValue = text.CharacterStatModifiedValue;
			val.CharacterStatModifiedValuePerStack = text.CharacterStatModifiedValuePerStack;
			val.ChargesAuxNeedForOne1 = text.ChargesAuxNeedForOne1;
			val.ChargesAuxNeedForOne2 = text.ChargesAuxNeedForOne2;
			val.ChargesMultiplierDescription = text.ChargesMultiplierDescription;
			val.CombatlogShow = text.CombatlogShow;
			val.ConsumeAll = text.ConsumeAll;
			val.ConsumedAtCast = text.ConsumedAtCast;
			val.ConsumedAtRound = text.ConsumedAtRound;
			val.ConsumedAtRoundBegin = text.ConsumedAtRoundBegin;
			val.ConsumedAtTurn = text.ConsumedAtTurn;
			val.ConsumedAtTurnBegin = text.ConsumedAtTurnBegin;
			val.CursePreventedPerStack = text.CursePreventedPerStack;
			val.DamagePreventedPerStack = text.DamagePreventedPerStack;
			val.DamageReflectedConsumeCharges = text.DamageReflectedConsumeCharges;
			val.DamageReflectedType = (DamageType)ToData<DamageType>(text.DamageReflectedType);
			val.DamageSidesWhenConsumed = text.DamageSidesWhenConsumed;
			val.DamageSidesWhenConsumedPerCharge = text.DamageSidesWhenConsumedPerCharge;
			val.DamageTypeWhenConsumed = (DamageType)ToData<DamageType>(text.DamageTypeWhenConsumed);
			val.DamageWhenConsumed = text.DamageWhenConsumed;
			val.DamageWhenConsumedPerCharge = text.DamageWhenConsumedPerCharge;
			val.Description = text.Description;
			val.DieWhenConsumedAll = text.DieWhenConsumedAll;
			val.DisabledCardTypes = (CardType[])(object)new CardType[text.DisabledCardTypes.Length];
			for (int i = 0; i < text.DisabledCardTypes.Length; i++)
			{
				val.DisabledCardTypes[i] = (CardType)ToData<CardType>(text.DisabledCardTypes[i]);
			}
			val.DoubleDamageIfCursesLessThan = text.DoubleDamageIfCursesLessThan;
			val.EffectTick = text.EffectTick;
			val.EffectTickSides = text.EffectTickSides;
			val.ExplodeAtStacks = text.ExplodeAtStacks;
			val.GainAuraCurseConsumption = (Content.medsAurasCursesSource.ContainsKey(text.GainAuraCurseConsumption) ? Content.medsAurasCursesSource[text.GainAuraCurseConsumption] : null);
			val.GainAuraCurseConsumption2 = (Content.medsAurasCursesSource.ContainsKey(text.GainAuraCurseConsumption2) ? Content.medsAurasCursesSource[text.GainAuraCurseConsumption2] : null);
			val.GainAuraCurseConsumptionPerCharge = text.GainAuraCurseConsumptionPerCharge;
			val.GainAuraCurseConsumptionPerCharge2 = text.GainAuraCurseConsumptionPerCharge2;
			val.GainCharges = text.GainCharges;
			val.GainChargesFromThisAuraCurse = (Content.medsAurasCursesSource.ContainsKey(text.GainChargesFromThisAuraCurse) ? Content.medsAurasCursesSource[text