Decompiled source of Ammonomicon API v1.0.2

plugins/AmmonomiconAPI.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using Alexandria.CharacterAPI;
using Alexandria.ItemAPI;
using Alexandria.NPCAPI;
using AmmonomiconAPI.Code.Misc;
using BepInEx;
using HarmonyLib;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Mod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Mod")]
[assembly: AssemblyCopyright("Copyright ©  2020")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d6d7a494-722e-4763-959b-c2d6b6a42b01")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace AmmonomiconAPI
{
	public class AmmonomiconAPIHooks
	{
		public static void Init()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			try
			{
				Hook val = new Hook((MethodBase)typeof(AmmonomiconPageRenderer).GetMethod("DelayedBuildPage", BindingFlags.Instance | BindingFlags.NonPublic), typeof(AmmonomiconAPIHooks).GetMethod("DelayedBuildPageHook", BindingFlags.Static | BindingFlags.NonPublic));
				Hook val2 = new Hook((MethodBase)typeof(AmmonomiconInstanceManager).GetMethod("HandleOpenAmmonomiconDeath", BindingFlags.Instance | BindingFlags.Public), typeof(AmmonomiconAPIHooks).GetMethod("HandleOpenAmmonomiconDeathHook", BindingFlags.Static | BindingFlags.Public));
			}
			catch (Exception ex)
			{
				ETGModConsole.Log((object)("oh no thats not good (AmmonomiconHooks broke)\n\n" + ex), false);
			}
		}

		private static IEnumerator DelayedBuildPageHook(Func<AmmonomiconPageRenderer, IEnumerator> orig, AmmonomiconPageRenderer self)
		{
			bool isInvoked = true;
			Delegate[] invokers = CustomActions.OnPreAnyPageBuild?.GetInvocationList();
			if (invokers != null)
			{
				Delegate[] array = invokers;
				foreach (Delegate entry2 in array)
				{
					isInvoked = (bool)entry2.DynamicInvoke(self);
				}
			}
			if (!isInvoked)
			{
				yield break;
			}
			if ((int)self.pageType == 1)
			{
				while (GameManager.Instance.IsSelectingCharacter)
				{
					yield return null;
				}
			}
			PageType pageType = self.pageType;
			PageType val = pageType;
			switch (val - 1)
			{
			case 0:
				self.InitializeEquipmentPageLeft();
				yield break;
			case 1:
				self.InitializeEquipmentPageRight();
				yield break;
			case 2:
				self.InitializeGunsPageLeft();
				yield break;
			case 3:
				self.SetPageDataUnknown(self);
				yield break;
			case 4:
				self.InitializeItemsPageLeft();
				yield break;
			case 5:
				self.SetPageDataUnknown(self);
				yield break;
			case 6:
				self.InitializeEnemiesPageLeft();
				yield break;
			case 7:
				self.SetPageDataUnknown(self);
				yield break;
			case 8:
				self.InitializeBossesPageLeft();
				yield break;
			case 9:
				self.SetPageDataUnknown(self);
				yield break;
			case 10:
				self.InitializeDeathPageLeft();
				yield break;
			case 11:
				self.InitializeDeathPageRight();
				yield break;
			}
			foreach (AmmonomiconPageKey entry in StaticData.customBookmarks)
			{
				if (self.pageType == entry.Left)
				{
					entry.ammonomiconPageTag.InitializeItemsPageLeft(self);
					break;
				}
				if (self.pageType == entry.Right)
				{
					entry.ammonomiconPageTag.InitializeItemsPageRight(self);
					break;
				}
			}
		}

		public static IEnumerator HandleOpenAmmonomiconDeathHook(Func<AmmonomiconInstanceManager, IEnumerator> orig, AmmonomiconInstanceManager self)
		{
			float v = 0.5f / (float)self.bookmarks.Count();
			AmmonomiconBookmarkController[] bookmarks = self.bookmarks;
			foreach (AmmonomiconBookmarkController entry in bookmarks)
			{
				entry.TriggerAppearAnimation();
				if ((int)entry.LeftPageType != 11 && (int)entry.RightPageType != 12)
				{
					entry.Disable();
					yield return ((MonoBehaviour)self).StartCoroutine(self.InvariantWait(v));
				}
			}
			yield return ((MonoBehaviour)self).StartCoroutine(self.InvariantWait(0.025f));
			AmmonomiconBookmarkController elemt = self.bookmarks.Where((AmmonomiconBookmarkController na) => ((Object)na).name == "Death").FirstOrDefault();
			elemt.IsCurrentPage = true;
			object[] bookmarks2 = self.bookmarks;
			self.m_currentlySelectedBookmark = ETGMod.IndexOf(bookmarks2, (object)elemt);
		}
	}
	public class CustomActions
	{
		public static Action<AmmonomiconPageRenderer, bool> OnAnyPageOpened;

		public static Action<AmmonomiconController, bool, bool, EncounterTrackable> OnAmmonomiconStartOpened;

		public static Action<AmmonomiconPageRenderer> OnAnyPageRefreshData;

		public static Action<AmmonomiconController, AmmonomiconInstanceManager> OnAmmonomiconPrecache;

		public static Action<AmmonomiconPageRenderer> OnEquipmentPageRebuilt;

		public static Action<AmmonomiconDeathPageController, bool> OnDeathPageRebuiltLeft;

		public static Action<AmmonomiconDeathPageController, bool> OnDeathPageRebuiltRight;

		public static Func<AmmonomiconPageRenderer, bool> OnPreEquipmentPageBuild;

		public static Func<AmmonomiconPageRenderer, bool> OnPreItemPageBuild;

		public static Func<AmmonomiconPageRenderer, bool> OnPreGunPageBuild;

		public static Func<AmmonomiconPageRenderer, bool> OnPreEnemyPageBuild;

		public static Func<AmmonomiconPageRenderer, bool> OnPreBossPageBuild;

		public static Func<AmmonomiconDeathPageController, bool> OnPreDeathPageBuildLeft;

		public static Func<AmmonomiconDeathPageController, bool> OnPreDeathPageBuildRight;

		public static Action<AmmonomiconPageRenderer, List<tk2dBaseSprite>> OnDeathPageFinalizing;

		public static Func<AmmonomiconPageRenderer, bool> OnPreAnyPageBuild;
	}
	internal class AmmonomiconAPIPatches
	{
		[HarmonyPatch(typeof(EncounterDatabaseEntry), "GetSecondTapeDescriptor")]
		public class Patch_GetSecondTapeDescriptor_Class
		{
			[HarmonyPrefix]
			private static bool GetSecondTapeDescriptor(EncounterDatabaseEntry __instance, ref string __result)
			{
				if (StaticData.Stored2ndTapeTexts.ContainsKey(__instance.shootStyleInt))
				{
					__result = StringTableManager.GetItemsString(StaticData.Stored2ndTapeTexts[__instance.shootStyleInt], -1);
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconController), "PrecacheAllData")]
		public class Patch_PrecacheAllData_Class
		{
			[HarmonyPostfix]
			private static void PrecacheAllData(AmmonomiconController __instance)
			{
				CustomActions.OnAmmonomiconPrecache?.Invoke(__instance, __instance.m_AmmonomiconInstance);
			}
		}

		[HarmonyPatch(typeof(AmmonomiconController), "Awake")]
		public class Patch_Awake_Class
		{
			[HarmonyPrefix]
			private static bool Awake(AmmonomiconController __instance)
			{
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				int length = Enum.GetValues(typeof(PageType)).Length;
				float num = -20 - length;
				int num2 = length + 4;
				for (int i = 0; i < num2; i++)
				{
					__instance.m_offsetInUse.Add(item: false);
					__instance.m_offsets.Add(new Vector3(-200f + num * (float)i, -200f + num * (float)i, 0f));
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeDeathPageRight")]
		public class Patch_InitializeDeathPageRight_Class
		{
			[HarmonyPrefix]
			private static bool PrecacheAllData(AmmonomiconPageRenderer __instance)
			{
				//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0114: Unknown result type (might be due to invalid IL or missing references)
				//IL_0308: Unknown result type (might be due to invalid IL or missing references)
				//IL_0317: Unknown result type (might be due to invalid IL or missing references)
				//IL_0190: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0237: Unknown result type (might be due to invalid IL or missing references)
				//IL_0267: Unknown result type (might be due to invalid IL or missing references)
				AmmonomiconDeathPageController component = ((Component)__instance.guiManager).GetComponent<AmmonomiconDeathPageController>();
				component.DoInitialize();
				dfScrollPanel component2 = ((Component)((Component)component).transform.Find("Scroll Panel").Find("Footer").Find("ScrollItemsPanel")).GetComponent<dfScrollPanel>();
				dfPanel component3 = ((Component)((Component)component2).transform.Find("AllItemsPanel")).GetComponent<dfPanel>();
				for (int i = 0; i < ((Component)component3).transform.childCount; i++)
				{
					Object.Destroy((Object)(object)((Component)((Component)component3).transform.GetChild(i)).gameObject);
				}
				List<tk2dBaseSprite> list = new List<tk2dBaseSprite>();
				for (int j = 0; j < GameManager.Instance.AllPlayers.Length; j++)
				{
					PlayerController val = GameManager.Instance.AllPlayers[j];
					for (int k = 0; k < val.inventory.AllGuns.Count; k++)
					{
						Gun val2 = val.inventory.AllGuns[k];
						tk2dClippedSprite val3 = __instance.AddSpriteToPage<tk2dClippedSprite>(val2.GetSprite().Collection, val2.DefaultSpriteID);
						SpriteOutlineManager.AddScaledOutlineToSprite<tk2dClippedSprite>((tk2dBaseSprite)(object)val3, Color.black, 0.1f, 0.01f);
						((BraveBehaviour)val3).transform.parent = ((Component)component3).transform;
						((BraveBehaviour)val3).transform.position = ((dfControl)component3).GetCenter();
						list.Add((tk2dBaseSprite)(object)val3);
					}
					for (int l = 0; l < val.activeItems.Count; l++)
					{
						tk2dClippedSprite val4 = __instance.AddSpriteToPage<tk2dClippedSprite>(((BraveBehaviour)val.activeItems[l]).sprite.Collection, ((BraveBehaviour)val.activeItems[l]).sprite.spriteId);
						SpriteOutlineManager.AddScaledOutlineToSprite<tk2dClippedSprite>((tk2dBaseSprite)(object)val4, Color.black, 0.1f, 0.01f);
						((BraveBehaviour)val4).transform.parent = ((Component)component3).transform;
						((BraveBehaviour)val4).transform.position = ((dfControl)component3).GetCenter();
						list.Add((tk2dBaseSprite)(object)val4);
					}
					for (int m = 0; m < val.passiveItems.Count; m++)
					{
						tk2dClippedSprite val5 = __instance.AddSpriteToPage<tk2dClippedSprite>(((BraveBehaviour)val.passiveItems[m]).sprite.Collection, ((BraveBehaviour)val.passiveItems[m]).sprite.spriteId);
						SpriteOutlineManager.AddScaledOutlineToSprite<tk2dClippedSprite>((tk2dBaseSprite)(object)val5, Color.black, 0.1f, 0.01f);
						((BraveBehaviour)val5).transform.parent = ((Component)component3).transform;
						((BraveBehaviour)val5).transform.position = ((dfControl)component3).GetCenter();
						list.Add((tk2dBaseSprite)(object)val5);
					}
				}
				CustomActions.OnDeathPageFinalizing?.Invoke(__instance, list);
				list = ttLinq.ttOrderBy<tk2dBaseSprite, float>((IEnumerable<tk2dBaseSprite>)list, (Func<tk2dBaseSprite, float>)delegate(tk2dBaseSprite a)
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					//IL_0006: Unknown result type (might be due to invalid IL or missing references)
					//IL_0009: Unknown result type (might be due to invalid IL or missing references)
					Bounds bounds = a.GetBounds();
					return ((Bounds)(ref bounds)).size.y;
				});
				List<tk2dBaseSprite> list2 = new List<tk2dBaseSprite>();
				__instance.BoxArrangeItems(component3, list, new Vector2(0f, 6f), new Vector2(6f, 3f), ref list2);
				((MonoBehaviour)__instance).StartCoroutine(__instance.HandleDeathItemsClipping(component3, list));
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconController), "LoadPageUIAtPath")]
		public class Patch_LoadPageUIAtPath_Class
		{
			[HarmonyPrefix]
			private static bool Patch_LoadPageUIAtPath(AmmonomiconController __instance, string path, PageType pageType, bool isPreCache, bool isVictory, ref AmmonomiconPageRenderer __result)
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ed: Expected O, but got Unknown
				//IL_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_015e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0161: Invalid comparison between Unknown and I4
				//IL_0163: Unknown result type (might be due to invalid IL or missing references)
				//IL_0166: Invalid comparison between Unknown and I4
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0094: Invalid comparison between Unknown and I4
				//IL_0096: Unknown result type (might be due to invalid IL or missing references)
				//IL_0099: Invalid comparison between Unknown and I4
				//IL_0194: Unknown result type (might be due to invalid IL or missing references)
				//IL_0197: Unknown result type (might be due to invalid IL or missing references)
				//IL_03f1: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
				//IL_021a: Unknown result type (might be due to invalid IL or missing references)
				//IL_021d: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0495: Unknown result type (might be due to invalid IL or missing references)
				//IL_022f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0230: Unknown result type (might be due to invalid IL or missing references)
				//IL_0241: Unknown result type (might be due to invalid IL or missing references)
				//IL_044e: Unknown result type (might be due to invalid IL or missing references)
				InstancePlusManager component = ((Component)__instance.m_AmmonomiconInstance).GetComponent<InstancePlusManager>();
				bool arg = false;
				AmmonomiconPageRenderer val;
				if (__instance.m_extantPageMap.ContainsKey(pageType))
				{
					foreach (KeyValuePair<PageType, AmmonomiconPageRenderer> item in __instance.m_extantPageMap)
					{
						if (StaticData.AllCustomEnums.Contains(item.Key))
						{
							((Renderer)item.Value.targetRenderer).enabled = false;
						}
					}
					val = __instance.m_extantPageMap[pageType];
					if ((int)pageType == 11 || (int)pageType == 12)
					{
						AmmonomiconDeathPageController component2 = ((Component)((Component)val).transform.parent).GetComponent<AmmonomiconDeathPageController>();
						component2.isVictoryPage = isVictory;
					}
					val.EnableRendering();
					val.DoRefreshData();
				}
				else
				{
					GameObject val2 = (GameObject)Object.Instantiate(BraveResources.Load(path, ".prefab"));
					val = val2.GetComponentInChildren<AmmonomiconPageRenderer>();
					dfGUIManager component3 = __instance.m_AmmonomiconBase.GetComponent<dfGUIManager>();
					GameObject val3 = Object.Instantiate<GameObject>(((Component)__instance.m_LowerRenderTargetPrefab).gameObject);
					val3.transform.parent = ((Component)component3).transform.Find("Core");
					val3.transform.localPosition = Vector3.zero;
					val3.layer = LayerMask.NameToLayer("SecondaryGUI");
					if (Object.op_Implicit((Object)(object)component) && (int)pageType != 11 && (int)pageType != 12)
					{
						foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
						{
							if (pageType == customBookmark.Left)
							{
								val.pageType = pageType;
								((Object)val2.gameObject).name = $"Page {pageType}";
								((Object)val3.gameObject).name = "Page " + customBookmark.UniqueKey + " Left";
								val.guiManager = component3;
								((Component)val).transform.parent.parent = __instance.m_AmmonomiconBase.transform.parent;
								break;
							}
							if (pageType != customBookmark.Right)
							{
								continue;
							}
							val.pageType = pageType;
							((Object)val2.gameObject).name = $"Page {pageType}";
							((Object)val3.gameObject).name = "Page " + customBookmark.UniqueKey + " Right";
							val.guiManager = component3;
							((Component)val).transform.parent.parent = __instance.m_AmmonomiconBase.transform.parent;
							if (customBookmark.DFGUI_BackingImage != string.Empty)
							{
								val.HeaderBGSprite.spriteName = customBookmark.DFGUI_BackingImage;
								if ((Object)(object)customBookmark.CustomAtlas != (Object)null)
								{
									val.HeaderBGSprite.atlas = customBookmark.CustomAtlas;
								}
							}
							break;
						}
					}
					MeshRenderer component4 = val3.GetComponent<MeshRenderer>();
					if (isVictory)
					{
						AmmonomiconDeathPageController component5 = ((Component)((Component)val).transform.parent).GetComponent<AmmonomiconDeathPageController>();
						component5.isVictoryPage = true;
					}
					int length = Enum.GetValues(typeof(PageType)).Length;
					int num = length + 4;
					float num2 = -20 - length;
					for (int i = __instance.m_offsets.Count - 2; i < num; i++)
					{
						if (__instance.m_offsets.Count > i)
						{
							__instance.m_offsets[i] = new Vector3(-200f + num2 * (float)i, -200f + num2 * (float)i, 0f);
							continue;
						}
						__instance.m_offsetInUse.Add(item: false);
						__instance.m_offsets.Add(new Vector3(-200f + num2 * (float)i, -200f + num2 * (float)i, 0f));
					}
					for (int j = 0; j < __instance.m_offsets.Count; j++)
					{
						if (!__instance.m_offsetInUse[j])
						{
							__instance.m_offsetInUse[j] = true;
							val2.transform.position = __instance.m_offsets[j];
							val.offsetIndex = j;
							break;
						}
					}
					val.Initialize(component4);
					val.EnableRendering();
					__instance.m_extantPageMap.Add(pageType, val);
					if (isPreCache)
					{
						arg = true;
						val.Disable(isPreCache);
					}
					else
					{
						((Component)val).transform.parent.parent = __instance.m_AmmonomiconBase.transform.parent;
					}
				}
				CustomActions.OnAnyPageOpened?.Invoke(val, arg);
				__result = val;
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "UpdateOnBecameActive")]
		public class Patch_UpdateOnBecameActive_Class
		{
			[HarmonyPrefix]
			private static bool Patch_UpdateOnBecameActive(AmmonomiconPageRenderer __instance)
			{
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Expected I4, but got Unknown
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
				__instance.ForceUpdateLanguageFonts();
				if ((Object)(object)AmmonomiconController.Instance.ImpendingLeftPageRenderer == (Object)null || AmmonomiconController.Instance.ImpendingLeftPageRenderer.LastFocusTarget == null)
				{
					PageType pageType = __instance.pageType;
					PageType val = pageType;
					switch (val - 4)
					{
					case 0:
						__instance.SetFirstVisibleTexts();
						break;
					case 2:
						__instance.SetFirstVisibleTexts();
						break;
					case 4:
						__instance.SetFirstVisibleTexts();
						break;
					case 6:
						__instance.SetFirstVisibleTexts();
						break;
					default:
						foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
						{
							if (__instance.pageType == customBookmark.Left)
							{
								customBookmark.ammonomiconPageTag.InitializeName(__instance);
								customBookmark.ammonomiconPageTag.OnPageOpenedLeft(__instance);
								break;
							}
							if (__instance.pageType == customBookmark.Right)
							{
								customBookmark.ammonomiconPageTag.OnPageOpenedRight(__instance);
								break;
							}
						}
						break;
					}
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconInstanceManager), "OpenDeath")]
		public class Patch_OpenDeathHook_Class
		{
			[HarmonyPrefix]
			private static bool Patch_OpenDeathHook(AmmonomiconInstanceManager __instance)
			{
				AmmonomiconBookmarkController val = __instance.bookmarks.Where((AmmonomiconBookmarkController na) => ((Object)na).name == "Death").FirstOrDefault();
				object[] bookmarks = __instance.bookmarks;
				__instance.m_currentlySelectedBookmark = ETGMod.IndexOf(bookmarks, (object)val);
				val.IsCurrentPage = true;
				((MonoBehaviour)__instance).StartCoroutine(__instance.HandleOpenAmmonomiconDeath());
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "CheckLanguageFonts")]
		public class Patch_CheckLanguageFonts_Class
		{
			[HarmonyPrefix]
			private static bool Patch_CheckLanguageFonts(AmmonomiconPageRenderer __instance, dfLabel mainText)
			{
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0046: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0133: Invalid comparison between Unknown and I4
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_0177: Unknown result type (might be due to invalid IL or missing references)
				//IL_017d: Invalid comparison between Unknown and I4
				//IL_017f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0185: Invalid comparison between Unknown and I4
				//IL_0187: Unknown result type (might be due to invalid IL or missing references)
				//IL_018e: Invalid comparison between Unknown and I4
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0190: Unknown result type (might be due to invalid IL or missing references)
				//IL_0197: Invalid comparison between Unknown and I4
				//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f7: Expected I4, but got Unknown
				if ((Object)(object)__instance.EnglishFont == (Object)null)
				{
					__instance.EnglishFont = mainText.Font;
					__instance.OtherLanguageFont = GameUIRoot.Instance.Manager.DefaultFont;
				}
				__instance.AdjustForChinese();
				if (__instance.m_cachedLanguage != GameManager.Options.CurrentLanguage)
				{
					__instance.m_cachedLanguage = GameManager.Options.CurrentLanguage;
					bool flag = false;
					foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
					{
						if (customBookmark.Right == __instance.pageType)
						{
							__instance.SetPageDataUnknown(__instance);
							flag = true;
						}
					}
					if (flag)
					{
						PageType pageType = __instance.pageType;
						PageType val = pageType;
						switch (val - 4)
						{
						case 0:
							__instance.SetPageDataUnknown(__instance);
							break;
						case 2:
							__instance.SetPageDataUnknown(__instance);
							break;
						case 4:
							__instance.SetPageDataUnknown(__instance);
							break;
						case 6:
							__instance.SetPageDataUnknown(__instance);
							break;
						default:
							__instance.SetPageDataUnknown(__instance);
							break;
						}
					}
				}
				if ((int)StringTableManager.CurrentLanguage == 0)
				{
					if ((Object)(object)mainText.Font != (Object)(object)__instance.EnglishFont)
					{
						mainText.Atlas = __instance.guiManager.DefaultAtlas;
						mainText.Font = __instance.EnglishFont;
					}
				}
				else if ((int)StringTableManager.CurrentLanguage != 7 && (int)StringTableManager.CurrentLanguage != 8 && (int)StringTableManager.CurrentLanguage != 11 && (int)StringTableManager.CurrentLanguage != 9 && (Object)(object)mainText.Font != (Object)(object)__instance.OtherLanguageFont)
				{
					mainText.Atlas = GameUIRoot.Instance.Manager.DefaultAtlas;
					mainText.Font = __instance.OtherLanguageFont;
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconController), "OpenInternal")]
		public class Patch_OpenInternal_Class
		{
			[HarmonyILManipulator]
			private static void Patch_OpenInternalIL(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val = new ILCursor(il);
				if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[5]
				{
					(Instruction instr) => ILPatternMatchingExt.MatchLdfld<AmmonomiconInstanceManager>(instr, "bookmarks"),
					(Instruction instr) => ILPatternMatchingExt.MatchLdlen(instr),
					(Instruction instr) => ILPatternMatchingExt.MatchConvI4(instr),
					(Instruction instr) => ILPatternMatchingExt.MatchLdcI4(instr, 1),
					(Instruction instr) => ILPatternMatchingExt.MatchSub(instr)
				}))
				{
					val.RemoveRange(5);
					val.CallPrivate(typeof(Patch_OpenInternal_Class), "GetActualDeathPageIndex");
				}
			}

			private static int GetActualDeathPageIndex(AmmonomiconInstanceManager aim)
			{
				object[] bookmarks = aim.bookmarks;
				return ETGMod.IndexOf(bookmarks, (object)aim.bookmarks.Where((AmmonomiconBookmarkController na) => ((Object)na).name == "Death").FirstOrDefault());
			}

			[HarmonyPostfix]
			private static void Patch_OpenInternal(AmmonomiconController __instance, bool isDeath, bool isVictory, EncounterTrackable targetTrackable)
			{
				CustomActions.OnAmmonomiconStartOpened?.DynamicInvoke(__instance, isDeath, isVictory, targetTrackable);
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "ToggleHeaderImage")]
		public class Patch_ToggleHeaderImage_Class
		{
			[HarmonyPrefix]
			private static bool ToggleHeaderImage(AmmonomiconPageRenderer __instance)
			{
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a6: Invalid comparison between Unknown and I4
				//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Invalid comparison between Unknown and I4
				//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: Invalid comparison between Unknown and I4
				//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Invalid comparison between Unknown and I4
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Invalid comparison between Unknown and I4
				foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
				{
					if (customBookmark.Left == __instance.pageType)
					{
						if ((int)GameManager.Options.CurrentLanguage != 0 && (Object)(object)__instance.HeaderBGSprite != (Object)null)
						{
							((dfControl)__instance.HeaderBGSprite).IsVisible = false;
						}
						else if ((Object)(object)__instance.HeaderBGSprite != (Object)null)
						{
							((dfControl)__instance.HeaderBGSprite).IsVisible = true;
						}
						return false;
					}
				}
				if ((int)__instance.pageType == 1 || (int)__instance.pageType == 3 || (int)__instance.pageType == 5 || (int)__instance.pageType == 7 || (int)__instance.pageType == 9)
				{
					if ((int)GameManager.Options.CurrentLanguage != 0 && (Object)(object)__instance.HeaderBGSprite != (Object)null)
					{
						((dfControl)__instance.HeaderBGSprite).IsVisible = false;
					}
					else if ((Object)(object)__instance.HeaderBGSprite != (Object)null)
					{
						((dfControl)__instance.HeaderBGSprite).IsVisible = true;
					}
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconBookmarkController), "TriggerAppearAnimation")]
		public class Patch_Enable_Class
		{
			[HarmonyPrefix]
			private static bool TriggerAppearAnimation(AmmonomiconBookmarkController __instance)
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				InstancePlusManager component = ((Component)AmmonomiconController.Instance.m_AmmonomiconInstance).GetComponent<InstancePlusManager>();
				foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
				{
					if (__instance.LeftPageType == customBookmark.Left && __instance.RightPageType == customBookmark.Right)
					{
						if (customBookmark.ammonomiconPageTag.ShouldBeActive())
						{
							return true;
						}
						__instance.Disable();
						dfScrollPanel component2 = ((Component)((Component)__instance).transform.parent).GetComponent<dfScrollPanel>();
						((dfControl)component2).Localize();
						return false;
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "DoRefreshData")]
		public class Patch_DoRefreshData_Class
		{
			[HarmonyPrefix]
			private static bool DoRefreshData(AmmonomiconPageRenderer __instance)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Invalid comparison between Unknown and I4
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Invalid comparison between Unknown and I4
				//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f3: Invalid comparison between Unknown and I4
				if ((int)__instance.pageType == 1)
				{
					for (int i = 0; i < __instance.m_pokedexEntries.Count; i++)
					{
						Object.Destroy((Object)(object)((Component)__instance.m_pokedexEntries[i]).gameObject);
					}
					__instance.LastFocusTarget = null;
					__instance.m_pokedexEntries.Clear();
					__instance.InitializeEquipmentPageLeft();
					CustomActions.OnAnyPageRefreshData?.Invoke(__instance);
					if (__instance.m_pokedexEntries.Count > 0)
					{
						__instance.LastFocusTarget = (IAmmonomiconFocusable)(object)((Component)__instance.m_pokedexEntries[0]).GetComponent<dfButton>();
					}
					__instance.guiManager.UIScaleLegacyMode = true;
					__instance.guiManager.UIScaleLegacyMode = false;
				}
				else if ((int)__instance.pageType == 11)
				{
					__instance.InitializeDeathPageLeft();
					CustomActions.OnAnyPageRefreshData?.Invoke(__instance);
				}
				else if ((int)__instance.pageType == 12)
				{
					__instance.InitializeDeathPageRight();
					CustomActions.OnAnyPageRefreshData?.Invoke(__instance);
				}
				else
				{
					for (int j = 0; j < __instance.m_pokedexEntries.Count; j++)
					{
						__instance.m_pokedexEntries[j].UpdateEncounterState();
					}
					CustomActions.OnAnyPageRefreshData?.Invoke(__instance);
				}
				return false;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "SetPageDataUnknown")]
		public class Patch_SetPageDataUnknown_Class
		{
			[HarmonyPrefix]
			private static bool SetPageDataUnknown(AmmonomiconPageRenderer __instance)
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)__instance == (Object)null)
				{
					return false;
				}
				foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
				{
					if (customBookmark.Right == __instance.pageType)
					{
						customBookmark.ammonomiconPageTag.OnSetDataUnknown(__instance);
						return false;
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeEquipmentPageLeft")]
		public class PostPatch_InitializeEquipmentPageLeft_Class
		{
			[HarmonyPostfix]
			private static void InitializeEquipmentPageLeft(AmmonomiconPageRenderer __instance)
			{
				CustomActions.OnEquipmentPageRebuilt?.Invoke(__instance);
			}
		}

		[HarmonyPatch(typeof(AmmonomiconDeathPageController), "InitializeLeftPage")]
		public class PostPatch_InitializeLeftPage_Class
		{
			[HarmonyPostfix]
			private static void InitializeLeftPage(AmmonomiconDeathPageController __instance)
			{
				CustomActions.OnDeathPageRebuiltLeft?.Invoke(__instance, __instance.isVictoryPage);
			}
		}

		[HarmonyPatch(typeof(AmmonomiconDeathPageController), "InitializeRightPage")]
		public class PostPatch_InitializeRightPage_Class
		{
			[HarmonyPostfix]
			private static void InitializeRightPage(AmmonomiconDeathPageController __instance)
			{
				CustomActions.OnDeathPageRebuiltRight?.Invoke(__instance, __instance.isVictoryPage);
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeEquipmentPageLeft")]
		public class PrePatch_InitializeEquipmentPageLeft_Class
		{
			[HarmonyPrefix]
			private static bool InitializeEquipmentPageLeft(AmmonomiconPageRenderer __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreEquipmentPageBuild?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeItemsPageLeft")]
		public class PrePatch_InitializeItemsPageLeft_Class
		{
			[HarmonyPrefix]
			private static bool InitializeItemsPageLeft(AmmonomiconPageRenderer __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreItemPageBuild?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeGunsPageLeft")]
		public class PrePatch_InitializeGunsPageLeft_Class
		{
			[HarmonyPrefix]
			private static bool InitializeGunsPageLeft(AmmonomiconPageRenderer __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreGunPageBuild?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeEnemiesPageLeft")]
		public class PrePatch_InitializeEnemiesPageLeft_Class
		{
			[HarmonyPrefix]
			private static bool InitializeEnemiesPageLeft(AmmonomiconPageRenderer __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreEnemyPageBuild?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconPageRenderer), "InitializeBossesPageLeft")]
		public class PrePatch_InitializeBossesPageLeft_Class
		{
			[HarmonyPrefix]
			private static bool InitializeBossesPageLeft(AmmonomiconPageRenderer __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreBossPageBuild?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconDeathPageController), "InitializeLeftPage")]
		public class PrePatch_InitializeLeftPage_Class
		{
			[HarmonyPrefix]
			private static bool InitializeLeftPage(AmmonomiconDeathPageController __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreDeathPageBuildLeft?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}

		[HarmonyPatch(typeof(AmmonomiconDeathPageController), "InitializeRightPage")]
		public class PrePatch_InitializeRightPage_Class
		{
			[HarmonyPrefix]
			private static bool InitializeRightPage(AmmonomiconDeathPageController __instance)
			{
				bool result = true;
				Delegate[] array = CustomActions.OnPreDeathPageBuildRight?.GetInvocationList();
				if (array != null)
				{
					Delegate[] array2 = array;
					foreach (Delegate @delegate in array2)
					{
						result = (bool)@delegate.DynamicInvoke(__instance);
					}
				}
				return result;
			}
		}
	}
	public class CustomCallbacks
	{
		internal static Dictionary<string, CustomAmmonomiconPageController> AllCustomControllers = new Dictionary<string, CustomAmmonomiconPageController>();

		internal static Dictionary<string, List<EncounterDatabaseEntry>> CachedDatabases = new Dictionary<string, List<EncounterDatabaseEntry>>();

		public static void AddStoredPage(string Key, CustomAmmonomiconPageController customAmmonomiconPageController)
		{
			if (!AllCustomControllers.ContainsKey(Key))
			{
				AllCustomControllers.Add(Key, customAmmonomiconPageController);
			}
		}

		public static CustomAmmonomiconPageController GetStoredCustomPage(string Key)
		{
			if (AllCustomControllers.ContainsKey(Key))
			{
				return AllCustomControllers[Key];
			}
			return null;
		}

		public static void TryAddEntryToStoredPage(string Key, EncounterDatabaseEntry EntryToAdd)
		{
			if (AllCustomControllers.ContainsKey(Key))
			{
				AllCustomControllers[Key].AddAdditionalEntry(EntryToAdd);
			}
		}

		public static void AddEntryToStoredDatabase(string Key, EncounterDatabaseEntry EntryToAdd)
		{
			if (CachedDatabases.ContainsKey(Key))
			{
				CachedDatabases[Key].Add(EntryToAdd);
				return;
			}
			CachedDatabases.Add(Key, new List<EncounterDatabaseEntry> { EntryToAdd });
		}

		public static void AddEntriesToStoredDatabase(string Key, List<EncounterDatabaseEntry> EntriesToAdd)
		{
			if (CachedDatabases.ContainsKey(Key))
			{
				CachedDatabases[Key].AddRange(EntriesToAdd);
				return;
			}
			List<EncounterDatabaseEntry> list = new List<EncounterDatabaseEntry>();
			list.AddRange(EntriesToAdd);
			CachedDatabases.Add(Key, list);
		}
	}
	public class UIBuilder
	{
		public static string GetItemNamesFromIdList(string baseString, string prefix, List<int> list)
		{
			if (list != null && list.Count > 0)
			{
				prefix += ((list.Count > 1) ? "s: " : ": ");
				baseString += prefix;
				for (int i = 0; i < list.Count; i++)
				{
					baseString = baseString + PickupObjectDatabase.GetById(list[i]).EncounterNameOrDisplayName + ((i == list.Count - 1) ? "." : ", ");
				}
				baseString += "\n";
			}
			return baseString;
		}

		public static void BuildBookmark(string ModPrefix, string EnumName, CustomAmmonomiconPageController CustomTagData, SpriteContainer spriteContainer, Assembly assemblyToUse = null)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0359: Expected O, but got Unknown
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Expected O, but got Unknown
			assemblyToUse = assemblyToUse ?? Assembly.GetExecutingAssembly();
			PageType val = ETGModCompatibility.ExtendEnum<PageType>("bobot_and_bunny.etg.ammonomiconapi", ModPrefix + "_" + EnumName + "_(PageLeft)");
			PageType val2 = ETGModCompatibility.ExtendEnum<PageType>("bobot_and_bunny.etg.ammonomiconapi", ModPrefix + "_" + EnumName + "_(PageRight)");
			StaticData.AllCustomEnums.Add(val);
			StaticData.AllCustomEnums.Add(val2);
			AmmonomiconBookmarkController val3 = StaticData.InstanceManagerCached.bookmarks[2];
			GameObject val4 = FakePrefab.Clone(((Component)val3).gameObject);
			val4.SetActive(false);
			if (Object.op_Implicit((Object)(object)val4.transform.parent))
			{
				Object.Destroy((Object)(object)((Component)val4.transform.parent).gameObject);
			}
			val4.transform.parent = null;
			AmmonomiconBookmarkController component = val4.GetComponent<AmmonomiconBookmarkController>();
			component.LeftPageType = val;
			component.RightPageType = val2;
			AmmonomiconPageKey ammonomiconPageKey = val4.AddComponent<AmmonomiconPageKey>();
			ammonomiconPageKey.UniqueKey = EnumName;
			ammonomiconPageKey.bookmarkController = component;
			ammonomiconPageKey.Left = val;
			ammonomiconPageKey.Right = val2;
			ammonomiconPageKey.ammonomiconPageTag = CustomTagData ?? new CustomAmmonomiconPageController("[ERR]: NULL AmmonomiconPageTag", 1);
			dfButton val5 = (component.m_sprite = (ammonomiconPageKey.dfButton = val4.GetComponent<dfButton>()));
			dfSpriteAnimation component2 = val4.GetComponent<dfSpriteAnimation>();
			component.m_animator = component2;
			((Object)((Component)component).gameObject).name = ModPrefix + "_" + EnumName;
			if (spriteContainer != null)
			{
				if ((Object)(object)spriteContainer.customDFAtlas == (Object)null)
				{
					dfAtlas ammonomiconAtlas = StaticData.AmmonomiconAtlas;
					List<string> list = new List<string>();
					ItemInfo val6 = ToolsCharApi.AddNewItemToAtlas(ammonomiconAtlas, ResourceExtractor.GetTextureFromResource(spriteContainer.HoverFrame, assemblyToUse), spriteContainer.HoverFrame);
					ItemInfo val7 = ToolsCharApi.AddNewItemToAtlas(ammonomiconAtlas, ResourceExtractor.GetTextureFromResource(spriteContainer.SelectHoverFrame, assemblyToUse), spriteContainer.SelectHoverFrame);
					component.SelectSpriteName = val6.name;
					component.DeselectSelectedSpriteName = val7.name;
					GameObject val8 = new GameObject("AmmonomiconBookmarkAnimationController");
					val8.transform.parent = val4.transform;
					dfAnimationClip val9 = val8.AddComponent<dfAnimationClip>();
					val9.Atlas = val3.AppearClip.Atlas;
					string[] appearFrames = spriteContainer.AppearFrames;
					foreach (string text in appearFrames)
					{
						list.Add(ToolsCharApi.AddNewItemToAtlas(ammonomiconAtlas, ResourceExtractor.GetTextureFromResource(text, assemblyToUse), text).name);
					}
					((dfInteractiveBase)val5).backgroundSprite = list.Last();
					val9.sprites = list;
					List<string> list2 = new List<string>();
					dfAnimationClip val10 = val8.AddComponent<dfAnimationClip>();
					val10.Atlas = val3.AppearClip.Atlas;
					string[] selectFrames = spriteContainer.SelectFrames;
					foreach (string text2 in selectFrames)
					{
						list2.Add(ToolsCharApi.AddNewItemToAtlas(ammonomiconAtlas, ResourceExtractor.GetTextureFromResource(text2, assemblyToUse), text2).name);
					}
					val10.sprites = list2;
					component.AppearClip = val9;
					component.SelectClip = val10;
					if (spriteContainer.BackingIcon != string.Empty)
					{
						ammonomiconPageKey.DFGUI_BackingImage = ToolsCharApi.AddNewItemToAtlas(ammonomiconAtlas, ResourceExtractor.GetTextureFromResource(spriteContainer.BackingIcon, assemblyToUse), spriteContainer.BackingIcon).name;
					}
				}
				else
				{
					((dfInteractiveBase)val5).Atlas = spriteContainer.customDFAtlas;
					GameObject val11 = new GameObject("AmmonomiconBookmarkAnimationController");
					val11.transform.parent = val4.transform;
					dfAnimationClip val12 = val11.AddComponent<dfAnimationClip>();
					val12.Atlas = spriteContainer.customDFAtlas;
					val12.sprites = spriteContainer.AppearFrames.ToList();
					component.AppearClip = val12;
					dfAnimationClip val13 = val11.AddComponent<dfAnimationClip>();
					val13.Atlas = spriteContainer.customDFAtlas;
					val13.sprites = spriteContainer.SelectFrames.ToList();
					component.SelectClip = val13;
					((dfInteractiveBase)val5).backgroundSprite = spriteContainer.AppearFrames.Last();
					component.DeselectSelectedSpriteName = spriteContainer.SelectHoverFrame;
					component.SelectSpriteName = spriteContainer.HoverFrame;
					if (spriteContainer.BackingIcon != string.Empty)
					{
						ammonomiconPageKey.DFGUI_BackingImage = spriteContainer.BackingIcon;
						ammonomiconPageKey.CustomAtlas = spriteContainer.customDFAtlas;
					}
				}
			}
			StaticData.customBookmarks.Add(ammonomiconPageKey);
		}
	}
	public class CustomAmmonomiconPageController
	{
		private List<EncounterDatabaseEntry> AdditionalEntries = new List<EncounterDatabaseEntry>();

		public string Name = "Balls";

		public string StringLocalization = "Balls";

		public bool isLocalized = false;

		public int ZOrder;

		public void AddAdditionalEntry(EncounterDatabaseEntry encounterDatabaseEntry)
		{
			AdditionalEntries.Add(encounterDatabaseEntry);
		}

		public CustomAmmonomiconPageController(string PageName, int Order, bool Localized = false, string LocalizationKey = "")
		{
			Name = PageName;
			ZOrder = Order;
			StringLocalization = LocalizationKey;
			isLocalized = Localized;
		}

		public virtual void OnFirstAdd(AmmonomiconBookmarkController self)
		{
		}

		public virtual List<EncounterDatabaseEntry> GetEntriesForPage(AmmonomiconPageRenderer renderer)
		{
			return new List<EncounterDatabaseEntry>();
		}

		public virtual void InitializeName(AmmonomiconPageRenderer self)
		{
			dfScrollPanel component = ((Component)((Component)self).transform.parent.Find("Scroll Panel")).GetComponent<dfScrollPanel>();
			Transform val = ((Component)component).transform.Find("Header");
			dfLabel[] componentsInChildren = ((Component)val).GetComponentsInChildren<dfLabel>();
			dfLabel[] array = componentsInChildren;
			foreach (dfLabel val2 in array)
			{
				((dfControl)val2).IsLocalized = isLocalized;
				((dfControl)val2).localizationKey = StringLocalization;
				val2.text = Name;
			}
		}

		public virtual void InitializeItemsPageLeft(AmmonomiconPageRenderer self)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			List<EncounterDatabaseEntry> entriesForPage = GetEntriesForPage(self);
			Transform val = ((Component)self.guiManager).transform.Find("Scroll Panel").Find("Scroll Panel");
			dfPanel component = ((Component)val.Find("Guns Panel")).GetComponent<dfPanel>();
			dfPanel component2 = ((Component)((Component)component).transform.GetChild(0)).GetComponent<dfPanel>();
			((MonoBehaviour)self).StartCoroutine(self.ConstructRectanglePageLayout(component2, entriesForPage, new Vector2(12f, 20f), new Vector2(20f, 20f), false, (List<AdvancedSynergyEntry>)null));
			((dfControl)component2).Anchor = (dfAnchorStyle)67;
			((dfControl)component).Height = ((dfControl)component2).Height;
			((dfControl)component2).Height = ((dfControl)component).Height;
		}

		public virtual void InitializeItemsPageRight(AmmonomiconPageRenderer rightPage)
		{
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)rightPage == (Object)null)
			{
				return;
			}
			dfScrollPanel component = ((Component)((Component)rightPage.guiManager).transform.Find("Scroll Panel")).GetComponent<dfScrollPanel>();
			Transform val = ((Component)component).transform.Find("Header");
			if (Object.op_Implicit((Object)(object)val))
			{
				dfLabel component2 = ((Component)val.Find("Label")).GetComponent<dfLabel>();
				component2.Text = ((dfControl)component2).ForceGetLocalizedValue("#AMMONOMICON_UNKNOWN");
				((dfControl)component2).PerformLayout();
				dfSprite component3 = ((Component)val.Find("Sprite")).GetComponent<dfSprite>();
				if (Object.op_Implicit((Object)(object)component3))
				{
					component3.FillDirection = (dfFillDirection)1;
					component3.FillAmount = (((int)GameManager.Options.CurrentLanguage != 0) ? 0.8f : 1f);
					component3.InvertFill = true;
				}
			}
			dfLabel component4 = ((Component)((Component)component).transform.Find("Tape Line One").Find("Label")).GetComponent<dfLabel>();
			component4.Text = ((dfControl)component4).ForceGetLocalizedValue("#AMMONOMICON_QUESTIONS");
			((dfControl)component4).PerformLayout();
			dfSlicedSprite componentInChildren = ((Component)((Component)component).transform.Find("Tape Line One")).GetComponentInChildren<dfSlicedSprite>();
			((dfControl)componentInChildren).Width = component4.GetAutosizeWidth() / 4f + 12f;
			dfLabel component5 = ((Component)((Component)component).transform.Find("Tape Line Two").Find("Label")).GetComponent<dfLabel>();
			component5.Text = ((dfControl)component4).ForceGetLocalizedValue("#AMMONOMICON_QUESTIONS");
			((dfControl)component5).PerformLayout();
			dfSlicedSprite componentInChildren2 = ((Component)((Component)component).transform.Find("Tape Line Two")).GetComponentInChildren<dfSlicedSprite>();
			((dfControl)componentInChildren2).Width = component5.GetAutosizeWidth() / 4f + 12f;
			dfPanel component6 = ((Component)((Component)component).transform.Find("ThePhoto").Find("Photo").Find("tk2dSpriteHolder")).GetComponent<dfPanel>();
			dfSprite component7 = ((Component)((Component)component).transform.Find("ThePhoto").Find("Photo").Find("ItemShadow")).GetComponent<dfSprite>();
			((dfControl)component7).IsVisible = false;
			tk2dSprite componentInChildren3 = ((Component)component6).GetComponentInChildren<tk2dSprite>();
			dfTextureSprite componentInChildren4 = ((Component)((Component)component).transform.Find("ThePhoto")).GetComponentInChildren<dfTextureSprite>();
			if ((Object)(object)componentInChildren4 != (Object)null)
			{
				((dfControl)componentInChildren4).IsVisible = false;
			}
			if (!((Object)(object)componentInChildren3 == (Object)null))
			{
				if (SpriteOutlineManager.HasOutline((tk2dBaseSprite)(object)componentInChildren3))
				{
					SpriteOutlineManager.RemoveOutlineFromSprite((tk2dBaseSprite)(object)componentInChildren3, true);
				}
				((BraveBehaviour)componentInChildren3).renderer.enabled = false;
			}
			dfLabel component8 = ((Component)((Component)component).transform.Find("Scroll Panel").Find("Panel").Find("Label")).GetComponent<dfLabel>();
			rightPage.CheckLanguageFonts(component8);
			component8.Text = ((dfControl)component8).ForceGetLocalizedValue("#AMMONOMICON_MYSTERIOUS");
			((dfControl)((Component)((Component)component8).transform.parent).GetComponent<dfPanel>()).Height = ((dfControl)component8).Height;
			((Component)((Component)component).transform.Find("Scroll Panel")).GetComponent<dfScrollPanel>().ScrollPosition = Vector2.zero;
		}

		public virtual void OnPageOpenedLeft(AmmonomiconPageRenderer rightPage)
		{
		}

		public virtual void OnPageOpenedRight(AmmonomiconPageRenderer rightPage)
		{
			SetPreExistingEncounteredObjectifPossible(rightPage);
		}

		public void SetPreExistingEncounteredObjectifPossible(AmmonomiconPageRenderer rightPage)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Invalid comparison between Unknown and I4
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Invalid comparison between Unknown and I4
			if (!((Object)(object)AmmonomiconController.Instance.ImpendingLeftPageRenderer != (Object)null))
			{
				return;
			}
			for (int i = 0; i < AmmonomiconController.Instance.ImpendingLeftPageRenderer.m_pokedexEntries.Count; i++)
			{
				AmmonomiconPokedexEntry val = AmmonomiconController.Instance.ImpendingLeftPageRenderer.m_pokedexEntries[i];
				if ((int)val.encounterState == 0)
				{
					rightPage.SetRightDataPageTexts((tk2dBaseSprite)(object)val.ChildSprite, val.linkedEncounterTrackable);
					if (AmmonomiconController.Instance.ImpendingLeftPageRenderer.LastFocusTarget == null)
					{
						AmmonomiconController.Instance.ImpendingLeftPageRenderer.LastFocusTarget = (IAmmonomiconFocusable)(object)((Component)val).GetComponent<dfControl>();
					}
					break;
				}
				if ((int)val.encounterState == 1)
				{
					rightPage.SetPageDataUnknown(rightPage);
					rightPage.SetRightDataPageName((tk2dBaseSprite)(object)val.ChildSprite, val.linkedEncounterTrackable);
					if (AmmonomiconController.Instance.ImpendingLeftPageRenderer.LastFocusTarget == null)
					{
						AmmonomiconController.Instance.ImpendingLeftPageRenderer.LastFocusTarget = (IAmmonomiconFocusable)(object)((Component)val).GetComponent<dfControl>();
					}
					break;
				}
			}
		}

		public virtual bool ShouldBeActive()
		{
			return true;
		}

		public virtual void OnActivate()
		{
		}

		public virtual void OnDeactivate()
		{
		}

		public void OnSetDataUnknown(AmmonomiconPageRenderer rightPage)
		{
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			dfScrollPanel component = ((Component)((Component)rightPage.guiManager).transform.Find("Scroll Panel")).GetComponent<dfScrollPanel>();
			Transform val = ((Component)component).transform.Find("Header");
			if (Object.op_Implicit((Object)(object)val))
			{
				dfLabel component2 = ((Component)val.Find("Label")).GetComponent<dfLabel>();
				component2.Text = ((dfControl)component2).ForceGetLocalizedValue("#AMMONOMICON_UNKNOWN");
				((dfControl)component2).PerformLayout();
				dfSprite component3 = ((Component)val.Find("Sprite")).GetComponent<dfSprite>();
				if (Object.op_Implicit((Object)(object)component3))
				{
					component3.FillDirection = (dfFillDirection)1;
					component3.FillAmount = (((int)GameManager.Options.CurrentLanguage != 0) ? 0.8f : 1f);
					component3.InvertFill = true;
				}
			}
			dfLabel component4 = ((Component)((Component)component).transform.Find("Tape Line One").Find("Label")).GetComponent<dfLabel>();
			component4.Text = ((dfControl)component4).ForceGetLocalizedValue("#AMMONOMICON_QUESTIONS");
			((dfControl)component4).PerformLayout();
			dfSlicedSprite componentInChildren = ((Component)((Component)component).transform.Find("Tape Line One")).GetComponentInChildren<dfSlicedSprite>();
			((dfControl)componentInChildren).Width = component4.GetAutosizeWidth() / 4f + 12f;
			dfLabel component5 = ((Component)((Component)component).transform.Find("Tape Line Two").Find("Label")).GetComponent<dfLabel>();
			component5.Text = ((dfControl)component4).ForceGetLocalizedValue("#AMMONOMICON_QUESTIONS");
			((dfControl)component5).PerformLayout();
			dfSlicedSprite componentInChildren2 = ((Component)((Component)component).transform.Find("Tape Line Two")).GetComponentInChildren<dfSlicedSprite>();
			((dfControl)componentInChildren2).Width = component5.GetAutosizeWidth() / 4f + 12f;
			dfPanel component6 = ((Component)((Component)component).transform.Find("ThePhoto").Find("Photo").Find("tk2dSpriteHolder")).GetComponent<dfPanel>();
			dfSprite component7 = ((Component)((Component)component).transform.Find("ThePhoto").Find("Photo").Find("ItemShadow")).GetComponent<dfSprite>();
			((dfControl)component7).IsVisible = false;
			tk2dSprite componentInChildren3 = ((Component)component6).GetComponentInChildren<tk2dSprite>();
			dfTextureSprite componentInChildren4 = ((Component)((Component)component).transform.Find("ThePhoto")).GetComponentInChildren<dfTextureSprite>();
			if ((Object)(object)componentInChildren4 != (Object)null)
			{
				((dfControl)componentInChildren4).IsVisible = false;
			}
			if (!((Object)(object)componentInChildren3 == (Object)null))
			{
				if (SpriteOutlineManager.HasOutline((tk2dBaseSprite)(object)componentInChildren3))
				{
					SpriteOutlineManager.RemoveOutlineFromSprite((tk2dBaseSprite)(object)componentInChildren3, true);
				}
				((BraveBehaviour)componentInChildren3).renderer.enabled = false;
			}
			dfLabel component8 = ((Component)((Component)component).transform.Find("Scroll Panel").Find("Panel").Find("Label")).GetComponent<dfLabel>();
			rightPage.CheckLanguageFonts(component8);
			component8.Text = ((dfControl)component8).ForceGetLocalizedValue("#AMMONOMICON_MYSTERIOUS");
			((dfControl)((Component)((Component)component8).transform.parent).GetComponent<dfPanel>()).Height = ((dfControl)component8).Height;
			((Component)((Component)component).transform.Find("Scroll Panel")).GetComponent<dfScrollPanel>().ScrollPosition = Vector2.zero;
		}
	}
	[HarmonyPatch(typeof(AmmonomiconInstanceManager), "Open")]
	public class NopeOutVisibility
	{
		private static bool Prefix(AmmonomiconInstanceManager __instance)
		{
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Expected O, but got Unknown
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Expected O, but got Unknown
			InstancePlusManager component = ((Component)__instance).GetComponent<InstancePlusManager>();
			if ((Object)(object)component == (Object)null)
			{
				Debug.Log((object)"[AmmonomiconAPI] Adding new InstancePlusManager!");
				component = ((Component)__instance).gameObject.AddComponent<InstancePlusManager>();
				component.InitInstance(__instance);
			}
			List<AmmonomiconBookmarkController> list = __instance.bookmarks.ToList();
			dfScrollPanel component2 = ((Component)((Component)__instance.bookmarks[0]).transform.parent).GetComponent<dfScrollPanel>();
			InstancePlusManager component3 = ((Component)__instance).GetComponent<InstancePlusManager>();
			if ((Object)(object)component3 != (Object)null)
			{
				foreach (AmmonomiconPageKey customBookmark in StaticData.customBookmarks)
				{
					if (component3.AttemptAddBookmark(customBookmark.bookmarkController, ((Component)customBookmark.bookmarkController).GetComponent<AmmonomiconPageKey>()))
					{
						AmmonomiconPageKey ammonomiconPageKey = Object.Instantiate<AmmonomiconPageKey>(customBookmark);
						((Component)ammonomiconPageKey).gameObject.SetActive(true);
						AmmonomiconBookmarkController component4 = ((Component)ammonomiconPageKey).GetComponent<AmmonomiconBookmarkController>();
						customBookmark.ammonomiconPageTag.OnFirstAdd(component4);
						((Component)ammonomiconPageKey).transform.parent = ((Component)__instance.bookmarks[0]).gameObject.transform.parent;
						((Component)ammonomiconPageKey).transform.position = ((Component)__instance.bookmarks[0]).gameObject.transform.position;
						((Component)ammonomiconPageKey).transform.localPosition = new Vector3(0f, -1.2f, 0f);
						dfButton val = (component4.m_sprite = ((Component)ammonomiconPageKey).GetComponent<dfButton>());
						component3.AllBookmarks.Add(component4);
						component3.AllKeys.Add(customBookmark.UniqueKey, component4);
						((dfControl)val).cachedManager = ((dfControl)__instance.bookmarks[0].m_sprite).cachedManager;
						((dfControl)val).size = new Vector2(86f, 64f);
						val.startSize = new Vector2(86f, 64f);
						((dfControl)val).cachedPixelSize = ((dfControl)__instance.bookmarks[0].m_sprite).cachedPixelSize;
						((dfControl)val).ZOrder = customBookmark.ammonomiconPageTag.ZOrder;
						((dfControl)val).OnSizeChanged();
						AmmonomiconPageKey component5 = ((Component)ammonomiconPageKey).GetComponent<AmmonomiconPageKey>();
						component5.instancePlusManager = component3;
						list.Insert(list.Count - 2, component4);
						((dfControl)val).MouseEnter += new MouseEventHandler(component3.OnMouseEnter);
						((dfControl)val).MouseLeave += new MouseEventHandler(component3.OnMouseLeave);
					}
				}
				component3.UpdateSizes();
				__instance.bookmarks = list.ToArray();
				__instance.m_currentlySelectedBookmark = 0;
				((MonoBehaviour)__instance).StartCoroutine(HandleOpenAmmonomiconHook(__instance));
			}
			else
			{
				Debug.Log((object)"[AmmonomiconAPI] InstancePlusManager not FOUND! This should not happen!");
			}
			return false;
		}

		public static IEnumerator HandleOpenAmmonomiconHook(AmmonomiconInstanceManager self)
		{
			float waitPer = 0.3f / (float)self.bookmarks.Length;
			dfGUIManager.SetFocus((dfControl)null, true);
			self.bookmarks[self.m_currentlySelectedBookmark].IsCurrentPage = true;
			InstancePlusManager inst = ((Component)self).GetComponent<InstancePlusManager>();
			inst?.UpdateSizes();
			for (int currentBookmark = 0; currentBookmark < self.bookmarks.Length; currentBookmark++)
			{
				if (!AmmonomiconController.Instance.IsOpen)
				{
					yield break;
				}
				bool isCustom = false;
				if ((int)self.bookmarks[currentBookmark].LeftPageType == 11 || (int)self.bookmarks[currentBookmark].LeftPageType == 12)
				{
					continue;
				}
				inst?.UpdateSizes();
				AmmonomiconBookmarkController currentBookmarkInst = self.bookmarks[currentBookmark];
				foreach (AmmonomiconPageKey entry in StaticData.customBookmarks)
				{
					if (currentBookmarkInst.LeftPageType == entry.Left && currentBookmarkInst.RightPageType == entry.Right)
					{
						isCustom = true;
						if (!entry.ammonomiconPageTag.ShouldBeActive())
						{
							currentBookmarkInst.Disable();
							dfScrollPanel scroller = ((Component)((Component)currentBookmarkInst).transform.parent).GetComponent<dfScrollPanel>();
							((dfControl)scroller).Localize();
							entry.ammonomiconPageTag.OnDeactivate();
						}
						else
						{
							entry.ammonomiconPageTag.OnActivate();
							currentBookmarkInst.TriggerAppearAnimation();
						}
					}
				}
				if (!isCustom)
				{
					self.bookmarks[currentBookmark].TriggerAppearAnimation();
				}
				yield return ((MonoBehaviour)self).StartCoroutine(self.InvariantWait(waitPer));
			}
			self.bookmarks[self.m_currentlySelectedBookmark].IsCurrentPage = true;
			yield return null;
		}
	}
	public class InstancePlusManager : MonoBehaviour
	{
		public List<AmmonomiconBookmarkController> AllBookmarks;

		public Dictionary<string, AmmonomiconBookmarkController> AllKeys;

		public AmmonomiconInstanceManager ammonomiconInstanceManager;

		public float PixelSize = 0.0017f;

		public Vector2 Size;

		public Dictionary<dfControl, Coroutine> keyValuePairs = new Dictionary<dfControl, Coroutine>();

		public Vector2 SizeConst = new Vector2(86f, 64f);

		public float SizeCalc
		{
			get
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Invalid comparison between Unknown and I4
				float num = 0f;
				foreach (AmmonomiconBookmarkController allBookmark in AllBookmarks)
				{
					if ((int)allBookmark.LeftPageType != 11)
					{
						num += 1f;
						continue;
					}
					AmmonomiconPageKey component = ((Component)allBookmark).GetComponent<AmmonomiconPageKey>();
					if (Object.op_Implicit((Object)(object)component) && component.ammonomiconPageTag.ShouldBeActive())
					{
						num += 1f;
					}
				}
				return Mathf.Min(6f / num * 0.96f, 1f);
			}
		}

		public float SizeCalc_Size
		{
			get
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Invalid comparison between Unknown and I4
				float num = 0f;
				foreach (AmmonomiconBookmarkController allBookmark in AllBookmarks)
				{
					if ((int)allBookmark.LeftPageType != 11)
					{
						num += 1f;
						continue;
					}
					AmmonomiconPageKey component = ((Component)allBookmark).GetComponent<AmmonomiconPageKey>();
					if (Object.op_Implicit((Object)(object)component) && component.ammonomiconPageTag.ShouldBeActive())
					{
						num += 1f;
					}
				}
				return Mathf.Min(12f / num * 0.96f, 1f);
			}
		}

		public void InitInstance(AmmonomiconInstanceManager inst)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Expected O, but got Unknown
			ammonomiconInstanceManager = inst;
			AllBookmarks = new List<AmmonomiconBookmarkController>();
			AllBookmarks.AddRange(inst.bookmarks.ToList());
			AllKeys = new Dictionary<string, AmmonomiconBookmarkController>();
			foreach (AmmonomiconBookmarkController allBookmark in AllBookmarks)
			{
				AllKeys.Add(((Object)allBookmark).name, allBookmark);
				((dfControl)allBookmark.m_sprite).MouseEnter += new MouseEventHandler(OnMouseEnter);
				((dfControl)allBookmark.m_sprite).MouseLeave += new MouseEventHandler(OnMouseLeave);
			}
		}

		public bool AttemptAddBookmark(AmmonomiconBookmarkController ammonomiconBookmarkController, AmmonomiconPageKey key)
		{
			if ((Object)(object)key != (Object)null)
			{
				if (!AllKeys.ContainsKey(key.UniqueKey))
				{
					return true;
				}
			}
			else if (!AllKeys.ContainsKey(((Object)ammonomiconBookmarkController).name))
			{
				AllBookmarks.Add(ammonomiconBookmarkController);
				AllKeys.Add(((Object)ammonomiconBookmarkController).name, ammonomiconBookmarkController);
				return true;
			}
			return false;
		}

		public void UpdateSizes()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			float sizeCalc = SizeCalc;
			dfScrollPanel component = ((Component)((Component)AllBookmarks[0]).transform.parent).GetComponent<dfScrollPanel>();
			component.ScrollPadding.left = (int)(86f * (1f - sizeCalc));
			float num = 60f * (1f - sizeCalc);
			for (int num2 = AllBookmarks.Count() - 1; num2 > -1; num2--)
			{
				AmmonomiconBookmarkController val = AllBookmarks[num2];
				((dfControl)val.m_sprite).maxSize = new Vector2(-1f, -1f);
				((dfControl)val.m_sprite).size = new Vector2(86f, 64f) * sizeCalc;
				((dfControl)val.m_sprite).OnSizeChanged();
			}
		}

		public void OnMouseEnter(dfControl control, dfMouseEventArgs mouseEvent)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			float sizeCalc_Size = SizeCalc_Size;
			if (!(sizeCalc_Size >= 1f))
			{
				control.Size = SizeConst * (1f / sizeCalc_Size * 0.8f);
				control.OnSizeChanged();
			}
		}

		public void OnMouseLeave(dfControl control, dfMouseEventArgs mouseEvent)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			float sizeCalc_Size = SizeCalc_Size;
			if (!(sizeCalc_Size >= 1f))
			{
				control.Size = SizeConst * sizeCalc_Size;
				control.OnSizeChanged();
			}
		}
	}
	public class SpriteContainer
	{
		public dfAtlas customDFAtlas = null;

		public string SelectHoverFrame;

		public string HoverFrame;

		public string[] SelectFrames;

		public string[] AppearFrames;

		public string BackingIcon = string.Empty;

		public SpriteContainer()
		{
		}

		public SpriteContainer(dfAtlas dfAtlasToUse)
		{
			customDFAtlas = dfAtlasToUse;
		}
	}
	public static class StaticData
	{
		internal static AmmonomiconInstanceManager InstanceManagerCached;

		public static dfPanel HeaderObject;

		public static dfPanel GunsItemsHeader;

		public static dfPanel ActiveItemsHeader;

		public static dfPanel ItemsHeader;

		public static dfPanel ItemsPanel;

		public static dfPanel LeftPageFooter;

		public static dfPanel HeaderObjectRightPage;

		public static dfPanel ThePhotoGraph;

		public static dfPanel RightPageDivider;

		public static dfPanel RightPageFooter;

		public static dfPanel RightPageScrollPanel;

		public static dfPanel TapeLine;

		public static dfAtlas AmmonomiconAtlas;

		public static List<AmmonomiconPageKey> customBookmarks = new List<AmmonomiconPageKey>();

		public static List<PageType> AllCustomEnums = new List<PageType>();

		private static string[] BundlePrereqs = new string[30]
		{
			"brave_resources_001", "dungeon_scene_001", "encounters_base_001", "enemies_base_001", "flows_base_001", "foyer_001", "foyer_002", "foyer_003", "shared_auto_001", "shared_auto_002",
			"shared_base_001", "dungeons/base_bullethell", "dungeons/base_castle", "dungeons/base_catacombs", "dungeons/base_cathedral", "dungeons/base_forge", "dungeons/base_foyer", "dungeons/base_gungeon", "dungeons/base_mines", "dungeons/base_nakatomi",
			"dungeons/base_resourcefulrat", "dungeons/base_sewer", "dungeons/base_tutorial", "dungeons/finalscenario_bullet", "dungeons/finalscenario_convict", "dungeons/finalscenario_coop", "dungeons/finalscenario_guide", "dungeons/finalscenario_pilot", "dungeons/finalscenario_robot", "dungeons/finalscenario_soldier"
		};

		internal static Dictionary<int, string> Stored2ndTapeTexts = new Dictionary<int, string>();

		public static void InitStaticData()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Expected O, but got Unknown
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Expected O, but got Unknown
			dfAtlas component = StaticData.LoadAssetFromAnywhere<GameObject>("Ammonomicon Atlas").GetComponent<dfAtlas>();
			AmmonomiconAtlas = component;
			AmmonomiconController component2 = ((GameObject)BraveResources.Load("Ammonomicon Controller", ".prefab")).GetComponent<AmmonomiconController>();
			InstanceManagerCached = component2.AmmonomiconBasePrefab.GetComponent<AmmonomiconInstanceManager>();
			GameObject val = (GameObject)Object.Instantiate(BraveResources.Load(InstanceManagerCached.bookmarks[0].TargetNewPageLeft, ".prefab"));
			AmmonomiconPageRenderer componentInChildren = val.GetComponentInChildren<AmmonomiconPageRenderer>();
			Transform val2 = ((Component)((Component)((Component)componentInChildren).transform.parent).GetComponent<dfGUIManager>()).transform.Find("Scroll Panel");
			HeaderObject = FakePrefab.Clone(((Component)val2.Find("Header")).gameObject).GetComponent<dfPanel>();
			LeftPageFooter = FakePrefab.Clone(((Component)val2.Find("Footer")).gameObject).GetComponent<dfPanel>();
			Transform val3 = val2.Find("Scroll Panel");
			ActiveItemsHeader = FakePrefab.Clone(((Component)val3.Find("Active Items Header")).gameObject).GetComponent<dfPanel>();
			GunsItemsHeader = FakePrefab.Clone(((Component)val3.Find("Guns Header")).gameObject).GetComponent<dfPanel>();
			ItemsHeader = FakePrefab.Clone(((Component)val3.Find("Passive Items Header")).gameObject).GetComponent<dfPanel>();
			ItemsPanel = FakePrefab.Clone(((Component)val3.Find("Passive Items Panel")).gameObject).GetComponent<dfPanel>();
			GameObject val4 = (GameObject)Object.Instantiate(BraveResources.Load(InstanceManagerCached.bookmarks[0].TargetNewPageRight, ".prefab"));
			AmmonomiconPageRenderer componentInChildren2 = val4.GetComponentInChildren<AmmonomiconPageRenderer>();
			Transform val5 = ((Component)((Component)((Component)componentInChildren2).transform.parent).GetComponent<dfGUIManager>()).transform.Find("Scroll Panel");
			HeaderObjectRightPage = FakePrefab.Clone(((Component)val5.Find("Header")).gameObject).GetComponent<dfPanel>();
			ThePhotoGraph = FakePrefab.Clone(((Component)val5.Find("ThePhoto")).gameObject).GetComponent<dfPanel>();
			RightPageDivider = FakePrefab.Clone(((Component)val5.Find("Divider")).gameObject).GetComponent<dfPanel>();
			RightPageFooter = FakePrefab.Clone(((Component)val5.Find("Footer")).gameObject).GetComponent<dfPanel>();
			RightPageScrollPanel = FakePrefab.Clone(((Component)val5.Find("Scroll Panel")).gameObject).GetComponent<dfPanel>();
			TapeLine = FakePrefab.Clone(((Component)val5.Find("Tape Line One")).gameObject).GetComponent<dfPanel>();
			Object.Destroy((Object)(object)val.gameObject);
			Object.Destroy((Object)(object)val4.gameObject);
		}

		public static T LoadAssetFromAnywhere<T>(string path) where T : Object
		{
			T val = default(T);
			string[] bundlePrereqs = BundlePrereqs;
			foreach (string text in bundlePrereqs)
			{
				try
				{
					val = ResourceManager.LoadAssetBundle(text).LoadAsset<T>(path);
				}
				catch
				{
				}
				if ((Object)(object)val != (Object)null)
				{
					break;
				}
			}
			return val;
		}
	}
	public static class HelperTools
	{
		private static int _AutoStringCounter = 0;

		private static int _AutoStringCounter2ndTape = -1;

		public static PlayerController LastPlayerOpenedUI()
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			PlayerController result = null;
			if (GameManager.Instance.IsSelectingCharacter)
			{
				if (Object.op_Implicit((Object)(object)Foyer.Instance.CurrentSelectedCharacterFlag))
				{
					result = ((GameObject)BraveResources.Load(Foyer.Instance.CurrentSelectedCharacterFlag.CharacterPrefabPath, ".prefab")).GetComponent<PlayerController>();
				}
			}
			else
			{
				result = GameManager.Instance.PrimaryPlayer;
				for (int i = 0; i < GameManager.Instance.AllPlayers.Length; i++)
				{
					if (GameManager.Instance.AllPlayers[i].PlayerIDX == GameManager.Instance.LastPausingPlayerID)
					{
						result = GameManager.Instance.AllPlayers[i];
					}
				}
			}
			return result;
		}

		public static dfScrollPanel PageRendererScrollParentObject(this AmmonomiconPageRenderer ammonomiconPageRenderer)
		{
			int childCount = ((Component)ammonomiconPageRenderer).transform.parent.childCount;
			for (int i = 0; i < childCount; i++)
			{
				dfScrollPanel component = ((Component)((Component)ammonomiconPageRenderer).transform.parent.GetChild(i)).gameObject.GetComponent<dfScrollPanel>();
				if ((Object)(object)component == (Object)null)
				{
					return component;
				}
			}
			return null;
		}

		public static EncounterDatabaseEntry CreateDummyEncounterDatabaseEntry(JournalEntry journalEntry, string EncounterGUID = null, bool autoEncounter = true)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			EncounterGUID = EncounterGUID ?? Guid.NewGuid().ToString();
			EncounterDatabaseEntry val = new EncounterDatabaseEntry();
			val.journalData = journalEntry;
			((AssetBundleDatabaseEntry)val).path = string.Empty;
			((AssetBundleDatabaseEntry)val).myGuid = EncounterGUID;
			if (autoEncounter)
			{
				GameStatsManager.Instance.HandleEncounteredObjectRaw(EncounterGUID);
			}
			return val;
		}

		public static EncounterDatabaseEntry CreateDummyEncounterDatabaseEntry(string OverrideShootStyleString, JournalEntry journalEntry, string EncounterGUID = null, bool autoEncounter = true)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			EncounterGUID = EncounterGUID ?? Guid.NewGuid().ToString();
			EncounterDatabaseEntry val = new EncounterDatabaseEntry();
			val.journalData = journalEntry;
			((AssetBundleDatabaseEntry)val).path = string.Empty;
			((AssetBundleDatabaseEntry)val).myGuid = EncounterGUID;
			if (OverrideShootStyleString != null)
			{
				val.shootStyleInt = OverrideShootStyleString.To2ndTapeDatabase();
			}
			if (autoEncounter)
			{
				GameStatsManager.Instance.HandleEncounteredObjectRaw(EncounterGUID);
			}
			return val;
		}

		public static EncounterDatabaseEntry CreateDummyEncounterDatabaseEntry(int? OverrideShootStyleValue, JournalEntry journalEntry, string EncounterGUID = null, bool autoEncounter = true)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			EncounterGUID = EncounterGUID ?? Guid.NewGuid().ToString();
			EncounterDatabaseEntry val = new EncounterDatabaseEntry();
			val.journalData = journalEntry;
			((AssetBundleDatabaseEntry)val).path = string.Empty;
			((AssetBundleDatabaseEntry)val).myGuid = EncounterGUID;
			if (OverrideShootStyleValue.HasValue)
			{
				val.shootStyleInt = OverrideShootStyleValue.Value;
			}
			if (autoEncounter)
			{
				GameStatsManager.Instance.HandleEncounteredObjectRaw(EncounterGUID);
			}
			return val;
		}

		public static JournalEntry CreateJournalEntryData(string DisplayNameKey, string AmmonomiconSprite, string Tagline, string FullEntry, bool isEnemy = false, Texture2D PortraitTexture = null)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			JournalEntry val = new JournalEntry();
			val.PrimaryDisplayName = DisplayNameKey.ToDatabase();
			val.NotificationPanelDescription = Tagline.ToDatabase();
			val.AmmonomiconFullEntry = FullEntry.ToDatabase();
			val.AmmonomiconSprite = AmmonomiconSprite;
			val.enemyPortraitSprite = PortraitTexture;
			val.IsEnemy = isEnemy;
			return val;
		}

		private static string ToDatabase(this string s)
		{
			if (s.Length == 0 || s[0] == '#')
			{
				return s;
			}
			string text = $"#AMMONOMICON_AUTO_DB_STRING_{++_AutoStringCounter}";
			NpcTools.AddComplex(Databases.Strings.Items, text, s);
			return text;
		}

		public static int To2ndTapeDatabase(this string s)
		{
			string text = "";
			if (s.Length == 0)
			{
				return -1;
			}
			_AutoStringCounter2ndTape--;
			if (s[0] == '#')
			{
				text = s;
			}
			else
			{
				text = "#AMMONOMICON_AUTO_DB_STRING_TAPE_" + s;
				NpcTools.AddComplex(Databases.Strings.Items, text, s);
			}
			StaticData.Stored2ndTapeTexts.Add(_AutoStringCounter2ndTape, text);
			return _AutoStringCounter2ndTape;
		}

		internal static void CallPrivate(this ILCursor cursor, Type t, string name)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			cursor.Emit(OpCodes.Call, (MethodBase)t.GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic));
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("bobot_and_bunny.etg.ammonomiconapi", "[[ AmmonomiconAPI ]]", "1.0.2")]
	public class AmmonomiconAPIModule : BaseUnityPlugin
	{
		public const string GUID = "bobot_and_bunny.etg.ammonomiconapi";

		public const string NAME = "[[ AmmonomiconAPI ]]";

		public const string VERSION = "1.0.2";

		public const string TEXT_COLOR = "#FF0000";

		public void Start()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			new Harmony("bobot_and_bunny.etg.ammonomiconapi").PatchAll();
			ETGModMainBehaviour.WaitForGameManagerStart((Action<GameManager>)GMStart);
		}

		public void GMStart(GameManager g)
		{
			StaticData.InitStaticData();
			AmmonomiconAPIHooks.Init();
			Log("[[ AmmonomiconAPI ]] v1.0.2 started successfully.", "#FF0000");
		}

		public static void Log(string text, string color = "#FFFFFF")
		{
			ETGModConsole.Log((object)("<color=" + color + ">" + text + "</color>"), false);
		}
	}
}
namespace AmmonomiconAPI.Code
{
	internal class ExampleSetup
	{
		public class ExampleCustomAmmonomiconPageController : CustomAmmonomiconPageController
		{
			public ExampleCustomAmmonomiconPageController()
				: base("ExampleName", 3)
			{
			}

			public override List<EncounterDatabaseEntry> GetEntriesForPage(AmmonomiconPageRenderer renderer)
			{
				List<EncounterDatabaseEntry> list = new List<EncounterDatabaseEntry>();
				list.Add(HelperTools.CreateDummyEncounterDatabaseEntry(HelperTools.CreateJournalEntryData("ExampleEntryName", "YourAmmonomiconSprite", "Tagline", "OOOOOOOOOO thats a lot")));
				list.Add(HelperTools.CreateDummyEncounterDatabaseEntry("Your Second Tape Line", HelperTools.CreateJournalEntryData("ExampleEntryName", "YourAmmonomiconSprite", "Tagline", "text text text")));
				string s = "hey this is a 2nd key";
				int value = s.To2ndTapeDatabase();
				list.Add(HelperTools.CreateDummyEncounterDatabaseEntry(value, HelperTools.CreateJournalEntryData("ExampleEntryName", "YourAmmonomiconSprite", "Tagline", "text text text")));
				return list;
			}

			public override bool ShouldBeActive()
			{
				return true;
			}
		}

		private static void ExampleSetupMyPage()
		{
			SpriteContainer spriteContainer = new SpriteContainer();
			spriteContainer.AppearFrames = new string[4] { "ExampleFramePath_1_Appear", "ExampleFramePath_2_Appear", "ExampleFramePath_3_Appear", "ExampleFramePath_4_Appear" };
			spriteContainer.SelectFrames = new string[3] { "ExampleFramePath_1_Select", "ExampleFramePath_2_Select", "ExampleFramePath_3_Select" };
			spriteContainer.HoverFrame = "ExampleFramePath_1_Hover";
			spriteContainer.SelectHoverFrame = "ExampleFramePath_1_SelectHover";
			UIBuilder.BuildBookmark("ExamplePrefix", "ExampleEnumNames", new ExampleCustomAmmonomiconPageController(), spriteContainer, Assembly.GetExecutingAssembly());
		}

		private static void ExampleAction()
		{
			CustomActions.OnPreEquipmentPageBuild = (Func<AmmonomiconPageRenderer, bool>)Delegate.Combine(CustomActions.OnPreEquipmentPageBuild, new Func<AmmonomiconPageRenderer, bool>(BuildEquipmentPage));
		}

		private static bool BuildEquipmentPage(AmmonomiconPageRenderer ammonomiconPageRenderer)
		{
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			Transform val = ((Component)ammonomiconPageRenderer.guiManager).transform.Find("Scroll Panel").Find("Scroll Panel");
			if ((Object)(object)val.Find("MyNewTab") == (Object)null)
			{
				dfPanel headerObject = StaticData.HeaderObject;
				dfPanel val2 = Object.Instantiate<dfPanel>(StaticData.ActiveItemsHeader, val);
				((Object)val2).name = "MyNewTab";
				dfLabel componentInChildren = ((Component)val2).GetComponentInChildren<dfLabel>();
				((dfControl)componentInChildren).isLocalized = false;
				((dfControl)componentInChildren).localizationKey = "";
				componentInChildren.Text = "My Tab";
				ConditionalTranslator component = ((Component)componentInChildren).gameObject.GetComponent<ConditionalTranslator>();
				((Behaviour)component).enabled = false;
				dfPanel component2 = ((Component)val2).GetComponent<dfPanel>();
				((dfControl)component2).ZOrder = 9;
				dfPanel val3 = Object.Instantiate<dfPanel>(StaticData.ItemsPanel, val);
				((Object)val3).name = "MyNewPanel";
				((dfControl)val3).ZOrder = 10;
			}
			List<EncounterDatabaseEntry> list = new List<EncounterDatabaseEntry>();
			if (list.Count > 0)
			{
				dfPanel component3 = ((Component)val.Find("MyNewPanel")).GetComponent<dfPanel>();
				dfPanel component4 = ((Component)((Component)component3).transform.GetChild(0)).GetComponent<dfPanel>();
				((MonoBehaviour)ammonomiconPageRenderer).StartCoroutine(ammonomiconPageRenderer.ConstructRectanglePageLayout(component4, list, new Vector2(12f, 16f), new Vector2(8f, 8f), true, (List<AdvancedSynergyEntry>)null));
				((dfControl)component3).Anchor = (dfAnchorStyle)67;
				((dfControl)component3).Height = ((dfControl)component4).Height;
				((dfControl)component4).Height = ((dfControl)component3).Height;
			}
			return true;
		}
	}
}
namespace AmmonomiconAPI.Code.Misc
{
	public class AmmonomiconPageKey : MonoBehaviour
	{
		public string UniqueKey = "Test";

		public AmmonomiconBookmarkController bookmarkController;

		public CustomAmmonomiconPageController ammonomiconPageTag;

		public PageType Left;

		public PageType Right;

		public dfButton dfButton;

		public InstancePlusManager instancePlusManager;

		public string DFGUI_BackingImage = string.Empty;

		public dfAtlas CustomAtlas = null;
	}
	internal class OldCode
	{
	}
}