Decompiled source of MagiRu v2.2.2

BepInEx/plugins/MagiRu/MagiRu.Bepin.dll

Decompiled 2 days 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.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyProduct("MagiRu.Bepin")]
[assembly: AssemblyTitle("MagiRu.Bepin")]
[assembly: AssemblyTrademark("")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: ComVisible(false)]
[assembly: Guid("79350c2e-e03c-4118-9285-41af64b28394")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace MagiRu;

public class CoroutineRunner : MonoBehaviour
{
}
[BepInPlugin("Astetrio.CrazyMan.MagiRu", "MagiRu", "2.2.2")]
public class MagiRu : BaseUnityPlugin
{
	public class Result<T> where T : class
	{
		public T value;
	}

	[CompilerGenerated]
	private sealed class <>c__DisplayClass31_0
	{
		public MagiRu <>4__this;

		public Scene newScene;
	}

	[CompilerGenerated]
	private sealed class <>c__DisplayClass32_0
	{
		public MagiRu <>4__this;

		public RectTransform uiPcReroll;
	}

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

		private object <>2__current;

		public MagiRu <>4__this;

		private Result<Transform> <result1>5__2;

		private Result<Text> <result2>5__3;

		private Result<RectTransform> <result3>5__4;

		private Transform <uiInfoWandHover>5__5;

		private Text <textCooldownHover>5__6;

		private Text <textIntervalHover>5__7;

		private Transform <uiInfoWandInteractive>5__8;

		private Text <textCooldownInteractive>5__9;

		private Text <textIntervalInteractive>5__10;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<result1>5__2 = null;
			<result2>5__3 = null;
			<result3>5__4 = null;
			<uiInfoWandHover>5__5 = null;
			<textCooldownHover>5__6 = null;
			<textIntervalHover>5__7 = null;
			<uiInfoWandInteractive>5__8 = null;
			<textCooldownInteractive>5__9 = null;
			<textIntervalInteractive>5__10 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_041f: Unknown result type (might be due to invalid IL or missing references)
			//IL_042e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0433: Unknown result type (might be due to invalid IL or missing references)
			//IL_0449: Unknown result type (might be due to invalid IL or missing references)
			//IL_0458: Unknown result type (might be due to invalid IL or missing references)
			//IL_045d: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Unknown result type (might be due to invalid IL or missing references)
			//IL_047c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0481: Unknown result type (might be due to invalid IL or missing references)
			//IL_0508: Unknown result type (might be due to invalid IL or missing references)
			//IL_0517: Unknown result type (might be due to invalid IL or missing references)
			//IL_051c: 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_05b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0600: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0614: Unknown result type (might be due to invalid IL or missing references)
			//IL_062c: Unknown result type (might be due to invalid IL or missing references)
			//IL_063b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0640: 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_066f: Unknown result type (might be due to invalid IL or missing references)
			//IL_067e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0683: Unknown result type (might be due to invalid IL or missing references)
			int num = <>1__state;
			MagiRu magiRu = <>4__this;
			switch (num)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Чиним размеры некоторых менюшек");
				<result1>5__2 = new Result<Transform>();
				<result2>5__3 = new Result<Text>();
				<result3>5__4 = new Result<RectTransform>();
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, (Transform)null, "Version", searchSame: true, -1f);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				magiRu._uiVersion = <result2>5__3.value;
				((Graphic)magiRu._uiVersion).raycastTarget = false;
				((Graphic)magiRu._uiVersion).rectTransform.pivot = new Vector2(0f, 0.5f);
				((Graphic)magiRu._uiVersion).rectTransform.anchoredPosition = new Vector2(10f, 10f);
				((Graphic)magiRu._uiVersion).rectTransform.sizeDelta = new Vector2(1200f, 20f);
				magiRu._currentGameVersion = magiRu._uiVersion.text;
				if (!NeedFixesAfter1046)
				{
					<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, (Transform)null, "UIInfoWand_Hover", searchSame: false, -1f);
					<>1__state = 2;
					return true;
				}
				goto IL_06d9;
			case 2:
				<>1__state = -1;
				<uiInfoWandHover>5__5 = <result1>5__2.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandHover>5__5, "Text_CoolDown", searchSame: true, -1f);
				<>1__state = 3;
				return true;
			case 3:
				<>1__state = -1;
				<textCooldownHover>5__6 = <result2>5__3.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandHover>5__5, "Text_ShootInterval", searchSame: true, -1f);
				<>1__state = 4;
				return true;
			case 4:
				<>1__state = -1;
				<textIntervalHover>5__7 = <result2>5__3.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandHover>5__5, "Text_MPRecover", searchSame: true, -1f);
				<>1__state = 5;
				return true;
			case 5:
			{
				<>1__state = -1;
				Text value7 = <result2>5__3.value;
				RectTransform rectTransform6 = ((Graphic)<textCooldownHover>5__6).rectTransform;
				rectTransform6.sizeDelta += new Vector2(60f, 0f);
				RectTransform rectTransform7 = ((Graphic)<textIntervalHover>5__7).rectTransform;
				rectTransform7.sizeDelta += new Vector2(60f, 0f);
				RectTransform rectTransform8 = ((Graphic)value7).rectTransform;
				rectTransform8.sizeDelta += new Vector2(60f, 0f);
				<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, (Transform)null, "Panel_Interact", searchSame: true, -1f);
				<>1__state = 6;
				return true;
			}
			case 6:
			{
				<>1__state = -1;
				Transform value6 = <result1>5__2.value;
				<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, value6, "UIInfoWand", searchSame: false, -1f);
				<>1__state = 7;
				return true;
			}
			case 7:
				<>1__state = -1;
				<uiInfoWandInteractive>5__8 = <result1>5__2.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandInteractive>5__8, "Text_CoolDown", searchSame: true, -1f);
				<>1__state = 8;
				return true;
			case 8:
				<>1__state = -1;
				<textCooldownInteractive>5__9 = <result2>5__3.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandInteractive>5__8, "Text_ShootInterval", searchSame: true, -1f);
				<>1__state = 9;
				return true;
			case 9:
				<>1__state = -1;
				<textIntervalInteractive>5__10 = <result2>5__3.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, <uiInfoWandInteractive>5__8, "Text_MPRecover", searchSame: true, -1f);
				<>1__state = 10;
				return true;
			case 10:
			{
				<>1__state = -1;
				Text value5 = <result2>5__3.value;
				RectTransform rectTransform3 = ((Graphic)<textCooldownInteractive>5__9).rectTransform;
				rectTransform3.sizeDelta += new Vector2(60f, 0f);
				RectTransform rectTransform4 = ((Graphic)<textIntervalInteractive>5__10).rectTransform;
				rectTransform4.sizeDelta += new Vector2(60f, 0f);
				RectTransform rectTransform5 = ((Graphic)value5).rectTransform;
				rectTransform5.sizeDelta += new Vector2(60f, 0f);
				<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, (Transform)null, "UIPlaceNameMgr", searchSame: true, -1f);
				<>1__state = 11;
				return true;
			}
			case 11:
			{
				<>1__state = -1;
				Transform value4 = <result1>5__2.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, value4, "Text (Legacy)", searchSame: true, -1f);
				<>1__state = 12;
				return true;
			}
			case 12:
			{
				<>1__state = -1;
				RectTransform rectTransform2 = ((Graphic)<result2>5__3.value).rectTransform;
				rectTransform2.sizeDelta += new Vector2(1000f, 0f);
				<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, (Transform)null, "Image_Location4", searchSame: true, -1f);
				<>1__state = 13;
				return true;
			}
			case 13:
			{
				<>1__state = -1;
				Transform value3 = <result1>5__2.value;
				<>2__current = magiRu.SearchFor<Text>(<result2>5__3, value3, "Text (Legacy)", searchSame: true, -1f);
				<>1__state = 14;
				return true;
			}
			case 14:
			{
				<>1__state = -1;
				RectTransform rectTransform = ((Graphic)<result2>5__3.value).rectTransform;
				rectTransform.sizeDelta -= new Vector2(20f, 0f);
				<>2__current = magiRu.SearchFor<RectTransform>(<result3>5__4, (Transform)null, "Panel_InteractBtn", searchSame: true, -1f);
				<>1__state = 15;
				return true;
			}
			case 15:
			{
				<>1__state = -1;
				RectTransform value2 = <result3>5__4.value;
				try
				{
					value2.sizeDelta += new Vector2(60f, 0f);
					Transform child = ((Transform)value2).GetChild(0);
					Transform obj = ((child is RectTransform) ? child : null);
					((RectTransform)obj).anchoredPosition = ((RectTransform)obj).anchoredPosition - new Vector2(30f, 0f);
					Transform child2 = ((Transform)value2).GetChild(1);
					((RectTransform)((child2 is RectTransform) ? child2 : null)).sizeDelta = Vector2.zero;
					Transform child3 = ((Transform)value2).GetChild(2);
					Transform obj2 = ((child3 is RectTransform) ? child3 : null);
					((RectTransform)obj2).anchoredPosition = ((RectTransform)obj2).anchoredPosition - new Vector2(30f, 0f);
				}
				catch (Exception ex2)
				{
					((BaseUnityPlugin)magiRu).Logger.LogError((object)("Не удалось починить кнопку взаимодействия\n" + ex2.ToString()));
				}
				<uiInfoWandHover>5__5 = null;
				<textCooldownHover>5__6 = null;
				<textIntervalHover>5__7 = null;
				<uiInfoWandInteractive>5__8 = null;
				<textCooldownInteractive>5__9 = null;
				<textIntervalInteractive>5__10 = null;
				goto IL_06d9;
			}
			case 16:
				{
					<>1__state = -1;
					Transform value = <result1>5__2.value;
					try
					{
						((Component)value.GetChild(8)).gameObject.SetActive(false);
					}
					catch (Exception ex)
					{
						((BaseUnityPlugin)magiRu).Logger.LogError((object)("Не удалось убрать показ сломанного текста у котла\n" + ex.ToString()));
					}
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"MagiRu Инициализирован");
					return false;
				}
				IL_06d9:
				<>2__current = magiRu.SearchFor<Transform>(<result1>5__2, (Transform)null, "UIGeneralCompoundMaterialData", searchSame: true, -1f);
				<>1__state = 16;
				return true;
			}
		}

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

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

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

		private object <>2__current;

		public string targetURL;

		public MagiRu <>4__this;

		public string checksum;

		public Action<byte[]> downloaded;

		public int maxAttempts;

		public Action error;

		private int <attempts>5__2;

		private bool <success>5__3;

		private UnityWebRequest <request>5__4;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || num == 1)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<request>5__4 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Invalid comparison between Unknown and I4
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Expected O, but got Unknown
			try
			{
				int num = <>1__state;
				MagiRu magiRu = <>4__this;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (string.IsNullOrEmpty(targetURL))
					{
						((BaseUnityPlugin)magiRu).Logger.LogError((object)"targetURL в DownloadFile пуст");
						return false;
					}
					<attempts>5__2 = 0;
					<success>5__3 = false;
					break;
				case 1:
					<>1__state = -3;
					if ((int)<request>5__4.result == 1)
					{
						byte[] data = <request>5__4.downloadHandler.data;
						if (string.IsNullOrEmpty(checksum) || magiRu.VerifyChecksum(data, checksum))
						{
							<success>5__3 = true;
							((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Файл успешно скачан");
							downloaded?.Invoke(data);
						}
						else
						{
							((BaseUnityPlugin)magiRu).Logger.LogWarning((object)"Контрольная сумма отличается. Пробуем ещё раз...");
						}
					}
					else
					{
						((BaseUnityPlugin)magiRu).Logger.LogError((object)("Не удалось скачать файл! (Ошибка: " + <request>5__4.error + ")"));
					}
					<>m__Finally1();
					<request>5__4 = null;
					if (!<success>5__3 && <attempts>5__2 < maxAttempts)
					{
						<>2__current = (object)new WaitForSeconds(1f);
						<>1__state = 2;
						return true;
					}
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				if (!<success>5__3 && <attempts>5__2 < maxAttempts)
				{
					<attempts>5__2++;
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)$"Начинаем скачивание файла (попытка {<attempts>5__2})");
					<request>5__4 = UnityWebRequest.Get(targetURL);
					<>1__state = -3;
					<>2__current = <request>5__4.SendWebRequest();
					<>1__state = 1;
					return true;
				}
				if (!<success>5__3)
				{
					((BaseUnityPlugin)magiRu).Logger.LogError((object)$"Не удалось скачать файл после {maxAttempts} попыток");
					error?.Invoke();
				}
				return false;
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
		}

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

		private void <>m__Finally1()
		{
			<>1__state = -1;
			if (<request>5__4 != null)
			{
				((IDisposable)<request>5__4).Dispose();
			}
		}

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

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

		private object <>2__current;

		public string targetURL;

		public MagiRu <>4__this;

		public string checksum;

		public Action<byte[]> downloaded;

		public Action error;

		private UnityWebRequest <request>5__2;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || (uint)(num - 1) <= 1u)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<request>5__2 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			bool result;
			try
			{
				int num = <>1__state;
				MagiRu magiRu = <>4__this;
				switch (num)
				{
				default:
					result = false;
					break;
				case 0:
				{
					<>1__state = -1;
					string text2 = "https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=" + targetURL;
					<request>5__2 = UnityWebRequest.Get(text2);
					<>1__state = -3;
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Посылаем запрос на получение ссылки для скачивания");
					<>2__current = <request>5__2.SendWebRequest();
					<>1__state = 1;
					result = true;
					break;
				}
				case 1:
					<>1__state = -3;
					if ((int)<request>5__2.result == 1)
					{
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Пытаемся распарсить результат");
						string text = "";
						try
						{
							text = ((JToken)JObject.Parse(<request>5__2.downloadHandler.text)).Value<string>((object)"href");
						}
						catch (Exception ex)
						{
							((BaseUnityPlugin)magiRu).Logger.LogError((object)ex);
							result = false;
							goto IL_015b;
						}
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Начинаем скачивание файла");
						<>2__current = magiRu.DownloadFile(text, checksum, 5, downloaded, error);
						<>1__state = 2;
						result = true;
						break;
					}
					((BaseUnityPlugin)magiRu).Logger.LogError((object)("Не удалось получить ссылку для скачивания файла! (Ошибка: " + <request>5__2.error + ")"));
					goto IL_0153;
				case 2:
					{
						<>1__state = -3;
						goto IL_0153;
					}
					IL_0153:
					<>m__Finally1();
					<request>5__2 = null;
					result = false;
					break;
					IL_015b:
					<>m__Finally1();
					break;
				}
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
			return result;
		}

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

		private void <>m__Finally1()
		{
			<>1__state = -1;
			if (<request>5__2 != null)
			{
				((IDisposable)<request>5__2).Dispose();
			}
		}

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

	[CompilerGenerated]
	private sealed class <SearchFor>d__34<T> : IEnumerator<object>, IDisposable, IEnumerator where T : Object
	{
		private int <>1__state;

		private object <>2__current;

		public Result<T> result;

		public MagiRu <>4__this;

		public Transform parent;

		public string name;

		public bool searchSame;

		public float time;

		private WaitForSecondsRealtime <delay>5__2;

		private float <startTime>5__3;

		private Func<string, string, bool> <comparator>5__4;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<delay>5__2 = null;
			<comparator>5__4 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			int num = <>1__state;
			MagiRu magiRu = <>4__this;
			T[] componentsInChildren;
			T[] array;
			switch (num)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<delay>5__2 = new WaitForSecondsRealtime(1f);
				<startTime>5__3 = Time.time;
				result.value = default(T);
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)string.Format("SearchFor({0}, {1}, {2}, {3})", ((Object)(object)parent != (Object)null) ? ((Object)parent).name : "null", name, searchSame, time));
				<comparator>5__4 = (string x, string y) => x == y;
				if (!searchSame)
				{
					<comparator>5__4 = (string x, string y) => x.Contains(y);
				}
				if ((Object)(object)parent == (Object)null)
				{
					goto IL_0212;
				}
				goto IL_033f;
			case 1:
				<>1__state = -1;
				goto IL_01dc;
			case 2:
				{
					<>1__state = -1;
					goto IL_030c;
				}
				IL_033f:
				if (!((Object)(object)result.value == (Object)null))
				{
					break;
				}
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Ищем " + name + " внутри " + ((Object)parent).name));
				componentsInChildren = ((Component)parent).GetComponentsInChildren<T>(true);
				foreach (T val in componentsInChildren)
				{
					if (<comparator>5__4(((Object)val).name, name))
					{
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Объект найден " + ((Object)val).name));
						result.value = val;
						break;
					}
				}
				if ((Object)(object)result.value == (Object)null)
				{
					<>2__current = <delay>5__2;
					<>1__state = 2;
					return true;
				}
				goto IL_030c;
				IL_030c:
				if (time >= 0f && Time.time - <startTime>5__3 > time)
				{
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Объект не найден");
					break;
				}
				goto IL_033f;
				IL_0212:
				if (!((Object)(object)result.value == (Object)null))
				{
					break;
				}
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Ищем " + name));
				array = Object.FindObjectsOfType<T>(true);
				foreach (T val2 in array)
				{
					if (<comparator>5__4(((Object)val2).name, name))
					{
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Объект найден " + ((Object)val2).name));
						result.value = val2;
						break;
					}
				}
				if ((Object)(object)result.value == (Object)null)
				{
					<>2__current = <delay>5__2;
					<>1__state = 1;
					return true;
				}
				goto IL_01dc;
				IL_01dc:
				if (time >= 0f && Time.time - <startTime>5__3 > time)
				{
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Объект не найден");
					break;
				}
				goto IL_0212;
			}
			((BaseUnityPlugin)magiRu).Logger.LogInfo((object)$"SearchFor({name}) завершён за {Time.time - <startTime>5__3}s");
			return false;
		}

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

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

	[CompilerGenerated]
	private sealed class <SearchForAll>d__35<T> : IEnumerator<object>, IDisposable, IEnumerator where T : Object
	{
		private int <>1__state;

		private object <>2__current;

		public MagiRu <>4__this;

		public Transform parent;

		public string name;

		public float time;

		public List<T> results;

		private WaitForSecondsRealtime <delay>5__2;

		private float <startTime>5__3;

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

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

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

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<delay>5__2 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			int num = <>1__state;
			MagiRu magiRu = <>4__this;
			T[] componentsInChildren;
			T[] array;
			switch (num)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<delay>5__2 = new WaitForSecondsRealtime(1f);
				<startTime>5__3 = Time.time;
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)string.Format("SearchForAll({0}, {1}, {2})", ((Object)(object)parent != (Object)null) ? ((Object)parent).name : "null", name, time));
				if ((Object)(object)parent == (Object)null)
				{
					goto IL_0180;
				}
				goto IL_0291;
			case 1:
				<>1__state = -1;
				goto IL_014a;
			case 2:
				{
					<>1__state = -1;
					goto IL_025e;
				}
				IL_0291:
				if (results.Count >= 1)
				{
					break;
				}
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Ищем " + name + " внутри " + ((Object)parent).name));
				componentsInChildren = ((Component)parent).GetComponentsInChildren<T>(true);
				foreach (T val in componentsInChildren)
				{
					if (((Object)val).name.Contains(name))
					{
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Объект найден " + ((Object)val).name));
						results.Add(val);
					}
				}
				if (results.Count < 1)
				{
					<>2__current = <delay>5__2;
					<>1__state = 2;
					return true;
				}
				goto IL_025e;
				IL_025e:
				if (time >= 0f && Time.time - <startTime>5__3 > time)
				{
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Объект не найден");
					break;
				}
				goto IL_0291;
				IL_0180:
				if (results.Count >= 1)
				{
					break;
				}
				((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Ищем " + name));
				array = Object.FindObjectsOfType<T>(true);
				foreach (T val2 in array)
				{
					if (((Object)val2).name.Contains(name))
					{
						((BaseUnityPlugin)magiRu).Logger.LogInfo((object)("Объект найден " + ((Object)val2).name));
						results.Add(val2);
					}
				}
				if (results.Count < 1)
				{
					<>2__current = <delay>5__2;
					<>1__state = 1;
					return true;
				}
				goto IL_014a;
				IL_014a:
				if (time >= 0f && Time.time - <startTime>5__3 > time)
				{
					((BaseUnityPlugin)magiRu).Logger.LogInfo((object)"Объект не найден");
					break;
				}
				goto IL_0180;
			}
			((BaseUnityPlugin)magiRu).Logger.LogInfo((object)$"SearchForAll({name}) завершён за {Time.time - <startTime>5__3}s");
			return false;
		}

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

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

	public const string GUID = "Astetrio.CrazyMan.MagiRu";

	public const string Name = "MagiRu";

	public const string Version = "2.2.2";

	private CoroutineRunner _coroutineRunner;

	private Coroutine _fixSceneSpecificProblemsCoroutine;

	private Coroutine _downloadingNewVersionCoroutine;

	private Text _uiVersion;

	private string _currentGameVersion = "";

	private bool _isRewardSpellUIFixed;

	public static MagiRu Instance { get; private set; }

	public static bool NeedFixesBefore1043 { get; private set; }

	public static bool NeedFixesAfter1046 { get; private set; }

	public static bool NeedFixesBefore111 { get; private set; }

	private void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Expected O, but got Unknown
		//IL_0331: Unknown result type (might be due to invalid IL or missing references)
		//IL_0337: Expected O, but got Unknown
		//IL_0339: Unknown result type (might be due to invalid IL or missing references)
		//IL_0340: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_014a: Expected O, but got Unknown
		//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0307: Expected O, but got Unknown
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0189: Expected O, but got Unknown
		//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c8: Expected O, but got Unknown
		//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Expected O, but got Unknown
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_026e: Expected O, but got Unknown
		GameObject gameObject = ((Component)this).gameObject;
		((Object)gameObject).hideFlags = (HideFlags)(((Object)gameObject).hideFlags | 0x3D);
		Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Инициализация MagiRu 2.2.2");
		Instance = this;
		try
		{
			Type type = AccessTools.TypeByName("VersionSO");
			int num = (int)AccessTools.Method(type, "AsInt", (Type[])null, (Type[])null).Invoke(AccessTools.Property(type, "Inst").GetValue(null), null);
			NeedFixesBefore1043 = num.CompareTo(ParseVersionToInt("1.0.43")) < 0;
			NeedFixesAfter1046 = num.CompareTo(ParseVersionToInt("1.0.46")) >= 0;
			NeedFixesBefore111 = num.CompareTo(ParseVersionToInt("1.1.1")) < 0;
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"Текущая версия игры: {num} = {FormatVersionToString(num)}");
		}
		catch
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)"Не удалось проверить версию игры");
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Патчим некоторые методы");
		Harmony val = new Harmony("Astetrio.CrazyMan.MagiRu");
		if (TryGetMethod("TextConfig+Initializer", "ApplyResult", out var method))
		{
			MethodInfo methodInfo = AccessTools.Method(typeof(Patches), "ApplyResult_TextConfigInitializer", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIRewardSpell", "Initialize", out method))
		{
			MethodInfo methodInfo2 = AccessTools.Method(typeof(Patches), "Initialize_UIRewardSpell", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIReroll", "LanguageChange", out method))
		{
			MethodInfo methodInfo3 = AccessTools.Method(typeof(Patches), "LanguageChange_UIReroll", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIModWarning", "Awake", out method))
		{
			MethodInfo methodInfo4 = AccessTools.Method(typeof(Patches), "Awake_UIModWarning", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		try
		{
			method = AccessTools.Method(AccessTools.TypeByName("GeneralTool"), "FormatWithUnit", new Type[2]
			{
				typeof(decimal),
				typeof(string).MakeByRefType()
			}, (Type[])null);
			MethodInfo methodInfo5 = AccessTools.Method(typeof(Patches), "FormatWithUnit_GeneralTool", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo5), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)ex);
		}
		try
		{
			method = AccessTools.Method(typeof(InputBinding), "ToDisplayString", new Type[4]
			{
				typeof(string).MakeByRefType(),
				typeof(string).MakeByRefType(),
				typeof(DisplayStringOptions),
				typeof(InputControl)
			}, (Type[])null);
			MethodInfo methodInfo6 = AccessTools.Method(typeof(Patches), "ToDisplayString_InputBinding", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo6), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		catch (Exception ex2)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)ex2);
		}
		SceneManager.activeSceneChanged += OnSceneChanged;
		GameObject val2 = new GameObject("MagiRu Coroutine Runner");
		((Object)val2).hideFlags = (HideFlags)(((Object)val2).hideFlags | 0x3D);
		Object.DontDestroyOnLoad((Object)(object)val2);
		_coroutineRunner = val2.AddComponent<CoroutineRunner>();
		((MonoBehaviour)_coroutineRunner).StartCoroutine(AsyncAwake());
	}

	public static List<int> LoadKeysFromCSV(string filePath)
	{
		List<int> list = new List<int>();
		try
		{
			using (StreamReader streamReader = new StreamReader(filePath))
			{
				bool flag = true;
				string text;
				while ((text = streamReader.ReadLine()) != null)
				{
					if (flag)
					{
						flag = false;
						continue;
					}
					string[] array = text.Split(new char[1] { ',' });
					if (array.Length > 1 && int.TryParse(array[1], out var result))
					{
						list.Add(result);
					}
				}
			}
			Debug.Log((object)$"Keys loaded from {filePath}: {list.Count}");
		}
		catch (IOException ex)
		{
			Debug.LogError((object)("Failed to load keys from CSV file: " + ex.Message));
		}
		return list;
	}

	public static void ExportFilteredDictionaryToCSV(IReadOnlyDictionary<int, string> data, List<int> keys, string outputPath)
	{
		if (data == null || keys == null || keys.Count == 0)
		{
			Debug.LogError((object)"Data or keys are null/empty. Nothing to export.");
			return;
		}
		try
		{
			using (StreamWriter streamWriter = new StreamWriter(outputPath))
			{
				streamWriter.WriteLine("Key,Value");
				foreach (int key in keys)
				{
					if (data.TryGetValue(key, out var value))
					{
						streamWriter.WriteLine($"{key}^{EscapeCSVValue(value)}");
					}
				}
			}
			Debug.Log((object)("Filtered CSV file created at: " + outputPath));
		}
		catch (IOException ex)
		{
			Debug.LogError((object)("Failed to write CSV file: " + ex.Message));
		}
	}

	private static string EscapeCSVValue(string value)
	{
		if (string.IsNullOrEmpty(value))
		{
			return value;
		}
		if (value.Contains("\"") || value.Contains(",") || value.Contains("\n") || value.Contains("\r"))
		{
			value = value.Replace("\"", "\"\"");
			value = "\"" + value + "\"";
		}
		return value;
	}

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

	private void TryRunFixSceneSpecificProblems(Scene newScene)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		<>c__DisplayClass31_0 CS$<>8__locals0 = new <>c__DisplayClass31_0();
		CS$<>8__locals0.<>4__this = this;
		CS$<>8__locals0.newScene = newScene;
		if (_fixSceneSpecificProblemsCoroutine != null)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Починка специфичных проблем для сцены (" + ((Scene)(ref CS$<>8__locals0.newScene)).name + ") была остановлена"));
			((MonoBehaviour)_coroutineRunner).StopCoroutine(_fixSceneSpecificProblemsCoroutine);
			_fixSceneSpecificProblemsCoroutine = null;
		}
		_fixSceneSpecificProblemsCoroutine = ((MonoBehaviour)_coroutineRunner).StartCoroutine(FixSceneSpecificProblems());
		[IteratorStateMachine(typeof(<>c__DisplayClass31_0.<<TryRunFixSceneSpecificProblems>g__FixSceneSpecificProblems|0>d))]
		IEnumerator FixSceneSpecificProblems()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <>c__DisplayClass31_0.<<TryRunFixSceneSpecificProblems>g__FixSceneSpecificProblems|0>d(0)
			{
				<>4__this = CS$<>8__locals0
			};
		}
	}

	public Coroutine FixRerollButton(RectTransform uiPcReroll)
	{
		<>c__DisplayClass32_0 CS$<>8__locals0 = new <>c__DisplayClass32_0();
		CS$<>8__locals0.<>4__this = this;
		CS$<>8__locals0.uiPcReroll = uiPcReroll;
		return ((MonoBehaviour)_coroutineRunner).StartCoroutine(Routine());
		[IteratorStateMachine(typeof(<>c__DisplayClass32_0.<<FixRerollButton>g__Routine|0>d))]
		IEnumerator Routine()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <>c__DisplayClass32_0.<<FixRerollButton>g__Routine|0>d(0)
			{
				<>4__this = CS$<>8__locals0
			};
		}
	}

	public void Log(string str, LogLevel logLevel = 16)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		((BaseUnityPlugin)this).Logger.Log(logLevel, (object)str);
	}

	[IteratorStateMachine(typeof(<SearchFor>d__34<>))]
	public IEnumerator SearchFor<T>(Result<T> result, Transform parent, string name, bool searchSame = true, float time = -1f) where T : Object
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <SearchFor>d__34<T>(0)
		{
			<>4__this = this,
			result = result,
			parent = parent,
			name = name,
			searchSame = searchSame,
			time = time
		};
	}

	[IteratorStateMachine(typeof(<SearchForAll>d__35<>))]
	public IEnumerator SearchForAll<T>(List<T> results, Transform parent, string name, float time = -1f) where T : Object
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <SearchForAll>d__35<T>(0)
		{
			<>4__this = this,
			results = results,
			parent = parent,
			name = name,
			time = time
		};
	}

	private bool TryGetMethod(string className, string methodName, out MethodBase method)
	{
		method = null;
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем класс " + className));
		Type type = AccessTools.TypeByName(className);
		if (type == null)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)("Класс " + className + " не найден"));
			return false;
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем метод " + methodName));
		method = AccessTools.Method(type, methodName, (Type[])null, (Type[])null);
		if (method == null)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)("Метод " + methodName + " не найден"));
			return false;
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Метод " + methodName + " найден"));
		return true;
	}

	[IteratorStateMachine(typeof(<DownloadYandexDiskFile>d__37))]
	private IEnumerator DownloadYandexDiskFile(string targetURL, string checksum = null, Action<byte[]> downloaded = null, Action error = null)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DownloadYandexDiskFile>d__37(0)
		{
			<>4__this = this,
			targetURL = targetURL,
			checksum = checksum,
			downloaded = downloaded,
			error = error
		};
	}

	[IteratorStateMachine(typeof(<DownloadFile>d__38))]
	private IEnumerator DownloadFile(string targetURL, string checksum = null, int maxAttempts = 5, Action<byte[]> downloaded = null, Action error = null)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DownloadFile>d__38(0)
		{
			<>4__this = this,
			targetURL = targetURL,
			checksum = checksum,
			maxAttempts = maxAttempts,
			downloaded = downloaded,
			error = error
		};
	}

	private bool VerifyChecksum(byte[] data, string expectedMD5)
	{
		using MD5 mD = MD5.Create();
		string text = BitConverter.ToString(mD.ComputeHash(data)).Replace("-", "").ToLowerInvariant();
		((BaseUnityPlugin)this).Logger.LogInfo((object)(text + " && " + expectedMD5));
		return text == expectedMD5.ToLowerInvariant();
	}

	public string GetVersionText()
	{
		return _currentGameVersion + " (Перевод на русский — MagiRu от CrazyMan v2.2.2t)";
	}

	private void UpdateVersionText()
	{
		if ((Object)(object)_uiVersion != (Object)null)
		{
			_uiVersion.text = GetVersionText();
		}
	}

	private static (GameObject, RectTransform) CreateUIElement(string name, Transform parent = null)
	{
		//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_0012: 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)
		//IL_002d: Expected O, but got Unknown
		GameObject val = new GameObject(name);
		val.transform.SetParent(parent);
		val.layer = LayerMask.NameToLayer("UI");
		return (val, val.AddComponent<RectTransform>());
	}

	private static void ShowPopup(string text, string actionName, float width, Action clickedCallback = null)
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Expected O, but got Unknown
		//IL_0186: 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_01cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f5: 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_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0257: Unknown result type (might be due to invalid IL or missing references)
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_0284: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ad: Expected O, but got Unknown
		GameObject go = CreateUIElement("MagiRu popup canvas").Item1;
		Canvas val = go.AddComponent<Canvas>();
		val.renderMode = (RenderMode)0;
		val.sortingOrder = 32767;
		go.AddComponent<GraphicRaycaster>();
		var (val2, val3) = CreateUIElement("Shadow", ((Component)val).transform);
		val3.anchorMin = Vector2.zero;
		val3.anchorMax = Vector2.one;
		val3.anchoredPosition = Vector2.zero;
		val3.sizeDelta = Vector2.zero;
		((Graphic)val2.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.5f);
		var (val4, val5) = CreateUIElement("Popup", ((Component)val).transform);
		val5.sizeDelta = new Vector2(width, 512f);
		val5.anchoredPosition = Vector2.zero;
		((Graphic)val4.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.5f);
		VerticalLayoutGroup obj = val4.AddComponent<VerticalLayoutGroup>();
		((LayoutGroup)obj).childAlignment = (TextAnchor)4;
		((HorizontalOrVerticalLayoutGroup)obj).spacing = 32f;
		((LayoutGroup)obj).padding = new RectOffset(32, 32, 32, 32);
		ContentSizeFitter obj2 = val4.AddComponent<ContentSizeFitter>();
		obj2.horizontalFit = (FitMode)0;
		obj2.verticalFit = (FitMode)2;
		GameObject item = CreateUIElement("Text", val4.transform).Item1;
		TextMeshProUGUI obj3 = item.AddComponent<TextMeshProUGUI>();
		((TMP_Text)obj3).text = text;
		((TMP_Text)obj3).alignment = (TextAlignmentOptions)258;
		((Graphic)obj3).color = Color.white;
		var (val6, val7) = CreateUIElement("Button", val4.transform);
		val7.sizeDelta = new Vector2(100f, 30f);
		val7.anchoredPosition = new Vector2(0f, -50f);
		Image val8 = val6.AddComponent<Image>();
		((Graphic)val8).color = new Color(0.8f, 0.8f, 0.8f, 1f);
		Button obj4 = val6.AddComponent<Button>();
		LayoutElement obj5 = val6.AddComponent<LayoutElement>();
		obj5.preferredHeight = 64f;
		obj5.flexibleWidth = 1f;
		var (val9, val10) = CreateUIElement("ButtonText", val6.transform);
		val10.anchorMax = Vector2.one;
		val10.anchorMin = Vector2.zero;
		val10.sizeDelta = Vector2.zero;
		val10.anchoredPosition = Vector2.zero;
		TextMeshProUGUI obj6 = val9.AddComponent<TextMeshProUGUI>();
		((TMP_Text)obj6).text = actionName;
		((TMP_Text)obj6).alignment = (TextAlignmentOptions)514;
		((Graphic)obj6).color = Color.black;
		((Selectable)obj4).targetGraphic = (Graphic)(object)val8;
		((UnityEvent)obj4.onClick).AddListener((UnityAction)delegate
		{
			EventSystem.current.sendNavigationEvents = true;
			clickedCallback?.Invoke();
			Object.Destroy((Object)(object)go);
		});
		((Selectable)obj4).Select();
		EventSystem.current.sendNavigationEvents = false;
	}

	private static string FormatVersionToString(int version)
	{
		List<string> list = new List<string>();
		if (version % 100 != 0)
		{
			list.Add($"f{version % 10}");
		}
		version /= 100;
		list.Insert(0, (version % 100).ToString());
		list.Insert(0, ".");
		version /= 100;
		list.Insert(0, (version % 1000).ToString());
		list.Insert(0, ".");
		version /= 1000;
		list.Insert(0, version.ToString());
		return string.Join("", list);
	}

	private static int ParseVersionToInt(string version)
	{
		string[] array = version.Trim().ToLower().Split(new char[1] { '.' }, StringSplitOptions.None);
		int num = int.Parse(array[0]);
		int num2 = int.Parse(array[1]);
		array = array[2].Split(new char[1] { 'f' }, StringSplitOptions.None);
		int num3 = int.Parse(array[0]);
		return ((array.Length > 1) ? int.Parse(array[1]) : 0) + num3 * 100 + num2 * 10000 + num * 10000000;
	}

	private void OnSceneChanged(Scene from, Scene to)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		TryRunFixSceneSpecificProblems(to);
	}

	private static void OnDonateClicked()
	{
		Application.OpenURL("https://www.donationalerts.com/r/crazyman_ik");
	}
}
public static class Translation
{
	private const string _HPColor = "#33CC33";

	private const string _ManaColor = "";

	private const string _CritColor = "#FE5D00";

	private const string _ShieldColor = "#C500FE";

	private const string _ImportantColor = "#C5A94D";

	private const string _MultishotColor = "";

	private const string _PostEnergyColor = "#E086EC";

	private const string _TempShieldColor = "#9D9D9B";

	private const string _FinalDamageColor = "#DC143C";

	private const string _EffectRadiusColor = "#FFD700";

	public static readonly IReadOnlyDictionary<int, string> RelicGroup = new Dictionary<int, string>
	{
		{ 15000001, "Душекостный комплект" },
		{ 15000002, "Комплект лесного духа" },
		{ 15000003, "Комплект Мерлина" },
		{ 15000004, "Комплект рыцаря" },
		{ 15000005, "Комплект старателя" },
		{
			15100001,
			"При входе в комнату преобразует int1% " + Colorize("временных щитов", "#9D9D9B") + " в " + Colorize("постоянные щиты", "#C500FE")
		},
		{
			15100002,
			"Увеличивает " + Colorize("макс. ОЗ", "#33CC33") + " на +int1"
		},
		{
			15100003,
			"Увеличивает " + Colorize("макс. Маны", "") + " на +int1"
		},
		{ 15100004, "При входе в комнату даёт неуязвимость на int1 сек." },
		{ 15100005, "Все существа, коснувшиеся игрока, превращаются в int1 монетку (кроме боссов)" }
	};

	public static readonly IReadOnlyDictionary<int, string> Set = new Dictionary<int, string>
	{
		{ 10000001, "Оригинал" },
		{ 10000002, "Костюм фокусника" },
		{ 10000003, "Костюм призывателя" },
		{ 10000004, "Костюм уклониста" },
		{ 10000005, "Костюм духа" },
		{ 10000006, "Костюм мага-воина" },
		{ 10000007, "Костюм Би Ань/(Кроссовер с «Warm Snow»)" },
		{ 10000008, "Костюм Жнеца/(Кроссовер с «Backpack Battles»)" },
		{ 10000009, "Костюм Бина/(Кроссовер с «Bing in Wonderland»)" },
		{ 10000010, "Костюм чумного доктора" },
		{ 10000011, "Костюм Дэйва/(Кроссовер с «Dave the Diver»)" },
		{ 10100001, "" },
		{ 10100002, "" },
		{ 10100003, " Заверши главу 2" },
		{ 10100004, " Заверши главу 3 на нормальной сложности" },
		{ 10100005, " Экипируй одновременно 3 жезла с Духом жезла" },
		{ 10100006, " Убей int1 врагов Мечом-Светозаром" },
		{ 10100007, " Убей любого босса Клинком правосудия" },
		{ 10100008, " Достигни int1 стаков отравления на враге" },
		{ 10100009, " Открой int1 костюмов" },
		{ 10100010, " Используй int1 зелий" },
		{ 10100011, " Установи DLC Dave The Diver" }
	};

	public static readonly IReadOnlyDictionary<int, string> ActivateGirl = new Dictionary<int, string>
	{
		{ 11000001, "Набор элементальных заклинаний" },
		{ 11000002, "Мешочек со всячиной" },
		{ 11000003, "Набор заклинаний-триггеров" },
		{ 11000004, "Набор накопительных заклинаний" },
		{ 11000005, "Набор мастера призывов" },
		{ 11000006, "Набор вдохновения" },
		{ 11000007, "Набор полезных заклинаний" },
		{ 11000008, "Набор для продвинутых призывов" },
		{ 11000009, "Набор калибрующих камней" },
		{ 11000010, "Набор звёздной пыли" },
		{ 11000011, "Набор максимизации" },
		{ 11000012, "Набор паранормальных заклинаний" },
		{ 11000013, "Набор заклинаний 13" },
		{ 11000014, "Набор заклинаний 14" },
		{ 11000101, "Магическая предрасположенность" },
		{ 11000102, "Сумка с реликвиями" },
		{ 11000103, "Закрепление заклинаний" },
		{ 11000104, "Магическая предрасположенность+" },
		{ 11000201, "Чутьё девушки-монстра" },
		{ 11000202, "Чутьё девушки-монстра+" },
		{ 11000203, "Чутьё девушки-монстра++" },
		{ 11100001, "" },
		{ 11100002, "" },
		{ 11100003, "" },
		{ 11100004, "" },
		{ 11100005, "" },
		{ 11100006, "" },
		{ 11100007, "" },
		{ 11100008, "" },
		{ 11100009, "" },
		{ 11100010, "" },
		{ 11100011, "" },
		{ 11100012, "" },
		{ 11100013, "" },
		{ 11100014, "" },
		{ 11100101, "При подборе заклинания, будет даваться выбор из 3 заклинаний" },
		{ 11100102, "" },
		{ 11100103, "Ты сможешь закреплять заклинания до следующего выбора" },
		{ 11100104, "При подборе заклинания, будет даваться выбор из 4 заклинаний" },
		{ 11100201, "Лимит отключений заклинаний +int1, бесплатные отключения +int2" },
		{ 11100202, "Лимит отключений заклинаний +int1, бесплатные отключения +int2" },
		{ 11100203, "Лимит отключений заклинаний +int1, бесплатные отключения +int2" }
	};

	public static readonly IReadOnlyDictionary<int, string> Resource = new Dictionary<int, string>
	{
		{ 6000011, "Монета" },
		{ 6000012, "Алмаз" },
		{ 6000013, "Изумруд" },
		{ 6000021, "Ключ" },
		{ 6000022, "2 Ключа" },
		{ 6000031, "Малая лечилка" },
		{ 6000032, "Лечилка" },
		{ 6000033, "Большая лечилка" },
		{ 6000041, "Малый щит" },
		{ 6000042, "Щит" },
		{ 6000043, "Большой щит" },
		{ 6000101, "Магический кристалл" },
		{ 6000102, "Магический кристалл" },
		{ 6000103, "Магический кристалл" },
		{ 6000111, "Кровь древних" },
		{ 6000112, "Кровь древних" },
		{ 6000113, "Кровь древних" },
		{ 6000121, "Ядро хаоса" },
		{ 6100011, "Монета ×1" },
		{ 6100012, "Монета ×5" },
		{ 6100013, "Монета ×50" },
		{ 6100021, "Используется для открытия запертых объектов" },
		{ 6100022, "Используется для открытия запертых объектов" },
		{
			6100031,
			"Востанавливает int1 " + Colorize("ОЗ", "#33CC33")
		},
		{
			6100032,
			"Востанавливает int1 " + Colorize("ОЗ", "#33CC33")
		},
		{
			6100033,
			"Востанавливает int1 " + Colorize("ОЗ", "#33CC33")
		},
		{
			6100041,
			"Даёт int1 ед. " + Colorize("щита", "#C500FE")
		},
		{
			6100042,
			"Даёт int1 ед. " + Colorize("щита", "#C500FE")
		},
		{
			6100043,
			"Даёт int1 ед. " + Colorize("щита", "#C500FE")
		},
		{ 6100101, "Магический кристалл" },
		{ 6100102, "Магический кристалл" },
		{ 6100103, "Магический кристалл" },
		{ 6100111, "Кровь древних" },
		{ 6100112, "Кровь древних" },
		{ 6100113, "Кровь древних" },
		{ 6100121, "Ядро хаоса" }
	};

	public static readonly IReadOnlyDictionary<int, string> Research = new Dictionary<int, string>
	{
		{ 9000011, "Секретный путь" },
		{ 9000012, "Секретный путь 2" },
		{ 9000021, "Энциклопедия" },
		{ 9000031, "Ремешок для зелий" },
		{ 9000032, "Ремешок для зелий+" },
		{ 9000033, "Ремешок для зелий++" },
		{ 9000041, "Пополнение магазина" },
		{ 9000042, "Пополнение магазина+" },
		{ 9000043, "Пополнение магазина++" },
		{ 9000044, "Пополнение магазина+++" },
		{ 9000051, "Поддерживающий модуль" },
		{ 9000052, "Поддерживающий модуль+" },
		{ 9000061, "Брелок" },
		{ 9000062, "Брелок 2" },
		{ 9000063, "Брелок 3" },
		{ 9000064, "Анализатор урона" },
		{ 9000065, "Контроллер существ" },
		{ 9000111, "Ягодный куст" },
		{ 9000121, "Хранилище сокровищ" },
		{ 9000131, "Падальщики" },
		{ 9000141, "Утилизатор" },
		{ 9000211, "Прокаченные манекены" },
		{ 9000221, "Короткий путь (Лес реликвий)" },
		{ 9000311, "Преобразователь ресурсов" },
		{ 9000321, "<size=20>Короткий путь (Вечная крепость)</size>" },
		{ 9000411, "<size=20>Короткий путь (Тропа паломников)</size>" },
		{
			9100011,
			"Даёт шанс найти комнату с фонтаном. Он позволяет восстановить int1% " + Colorize("ОЗ", "#33CC33")
		},
		{
			9100012,
			"Даёт шанс найти комнату с фонтаном. Он позволяет восстановить int1% " + Colorize("ОЗ", "#33CC33")
		},
		{ 9100021, "Записывает различные встречи и открытия во время твоих приключений" },
		{ 9100031, "Вместимость зелий +int1" },
		{ 9100032, "Вместимость зелий +int1" },
		{ 9100033, "Вместимость зелий +int1" },
		{ 9100041, "Даёт ×int1 переброса в магазине" },
		{ 9100042, "Даёт ×int1 переброса в магазине" },
		{ 9100043, "Даёт ×int1 перебросов в магазине" },
		{ 9100044, "Даёт ×int1 перебросов в магазине" },
		{ 9100051, "Повышает максимальное количество перековок в Перековальне" },
		{ 9100052, "Значительно повышает максимальное количество перековок в Перековальне" },
		{ 9100061, "Даёт int1 доп. ключ перед стартом приключения" },
		{ 9100062, "Даёт int1 доп. ключа перед стартом приключения" },
		{ 9100063, "Даёт int1 доп. ключа перед стартом приключения" },
		{ 9100064, "Особый прибор, отслеживающий урон от заклинаний и позволяющий просматривать статистику боя в любой момент" },
		{ 9100065, "Инструмент, позволяющий в любой момент убить всех призванных существ" },
		{ 9100111, "Повышает шанс нахождения ягодных кустов в Лесу Реликвий. Они помогут восстановить твои силы" },
		{ 9100121, "Повышает шанс нахождения ящиков с сокровищами в Вечной Крепости. Они хранят в себе ценные предметы" },
		{ 9100131, "Даёт шанс встретить Падальщиков на Тропе Паломников. Они любят собирать заклинания, которые падают рядом с бездной" },
		{ 9100141, "Утилизатор, который можно найти у входа в Бездну Минувших Дней. Он позволяет перерабатывать заклинания, реликвии и зелья в монеты" },
		{ 9100211, "Тренировочные манекены, которые могут показывать более детальную информацию. А также, их можно будет включать/выключать" },
		{ 9100221, "Даёт шанс найти короткий путь в Лесу Реликвий (эквивалентно прохождению 4 комнат за раз и получению 4 наград)" },
		{ 9100311, "Позволяет преобразовывать Магические Кристаллы, Древнюю Кровь и Ядра Хаоса между собой" },
		{ 9100321, "Даёт шанс найти короткий путь в Вечной Крепости (эквивалентно прохождению 4 комнат за раз и получению 4 наград)" },
		{ 9100411, "Даёт шанс найти короткий путь на Тропе Паломников (эквивалентно прохождению 4 комнат за раз и получению 4 наград)" }
	};

	public static readonly IReadOnlyDictionary<int, string> Handbook = new Dictionary<int, string>
	{
		{ 14000001, "Удобное управление" },
		{ 14000002, "Про жезлы" },
		{ 14000003, "Про заклинания" },
		{ 14000101, "Быстрое надевание/снятие заклинаний" },
		{ 14000102, "Групповое надевание/снятие заклинаний" },
		{ 14000103, "Быстрая смена жезла" },
		{ 14000201, "Порядок заклинаний" },
		{ 14000202, "Мана" },
		{ 14000203, "Реген. маны" },
		{ 14000204, "Интервал" },
		{ 14000205, "Задержка" },
		{ 14000206, "Разброс" },
		{ 14000207, "Вместимость блока заклинаний" },
		{ 14000208, "Вторичные слоты" },
		{ 14000301, "Урон" },
		{ 14000302, "УВС" },
		{
			14000303,
			Colorize("Радиус эффекта", "#FFD700") ?? ""
		},
		{ 14000304, "Лимит призыва" },
		{
			14000305,
			Colorize("Стоимость маны", "") ?? ""
		},
		{ 14000306, "Продолжительный каст" },
		{
			14000307,
			Colorize("Крит. шанс", "#FE5D00") ?? ""
		},
		{
			14000308,
			Colorize("Множитель урона", "#DC143C") ?? ""
		},
		{ 14000309, "Пронзательность заклинаний" },
		{ 14000310, "Используемые слоты" },
		{ 14000311, "Слоты заклинаний" },
		{ 14000312, "Снарядов за каст" },
		{ 14000313, "Заряжаемый каст" },
		{
			14000314,
			Colorize("ОЗ", "#33CC33") ?? ""
		},
		{ 14100101, "Нажатие правой кнопкой мыши по заклинаниям позволяет быстро надевать или снимать их." },
		{ 14100102, "Удерживание кнопки Shift и наведение на заклинания мышкой, позволяет быстро надевать или снимать их." },
		{ 14100103, "Использование колёсика мыши позволяет быстро переключать жезлы." },
		{ 14100201, "<color=#DDA300>Усиливающие</color> заклинания обычно дают эффект только <color=#6CD0FF>атакующим</color> или <color=#6CD0FF>призывающим</color> заклинаниям в слотах справа от себя." },
		{ 14100202, "Как много магии имеется в жезле." },
		{
			14100203,
			"Количество " + Colorize("Маны", "") + ", восстанавливаемой за 1 секунду."
		},
		{ 14100204, "Жезлы кастуют заклинания слева направо. Временной интервал между кастом этих заклинаний называется Интервалом каста." },
		{ 14100205, "После того как жезл заканчивает кастить все свои заклинания, у него начинается задержка. Как только задержка заканчивается, жезл может снова начать кастовать заклинания." },
		{ 14100206, "Разброс задаёт угол области атаки. Чем больше значение, тем шире конус поражения: от прямой линии при 0° до полного круга при 360°" },
		{
			14100207,
			"Определяет количество заклинаний, которые можно поместить в один блок заклинаний. Эти заклинания будут кастоваться " + Colorize("одновременно", "") + ", а не по очереди."
		},
		{
			14100208,
			"При соблюдении указанного условия, Вторичные слоты восстанавливают " + Colorize("энергию", "#E086EC") + ". Как только " + Colorize("энергия", "#E086EC") + " во Вторичных слотах достигнет общей " + Colorize("Стоимости маны", "") + " всех заклинаний в них, они будут скастованы."
		},
		{ 14100301, "Все бонусы к урону (от заклинаний, реликвий и проклятий) складываются в общий процент усиления перед применением к Базовому урону." },
		{ 14100302, "Некоторые заклинания наносят урон несколько раз за 1 секунду. Для простоты, их урон отображается как урон в секунду." },
		{
			14100303,
			"Только некоторые заклинания имеют данный атрибут. На заклинания имеющие данный атрибут, влияет увеличение " + Colorize("радиуса эффекта", "#FFD700") + "."
		},
		{ 14100304, "Некоторые призывающие заклинания имеют лимит призыва. Когда число призванных существ превышает данное значение, первое призванное существо будет мгновенно убито. Если же лимит призыва не указан, значит что для данного заклинания нет ограничений на количество призывов." },
		{ 14100305, "Как правило, данное значение влияет на конечную стоимость заклинания." },
		{ 14100306, "При касте заклинаний, помеченных продолжительным кастом, ты не можешь использовать другие заклинания." },
		{
			14100307,
			"Базовое значение " + Colorize("крит. урона", "#FE5D00") + " равняется 200%."
		},
		{
			14100308,
			"Некоторые модификаторы урона имеют приписку " + Colorize("множитель", "#DC143C") + " — это обозначает, что этот модификатор добавляется отдельным множителем, а не суммируется в бонусный (как это делают остальные модификаторы урона)."
		},
		{ 14100309, "Пронзательность позволяет заклинанию проходить сквозь врагов, не останавливаясь. Значение Пронзательности показывает, через скольких врагов пройдёт заклинание перед тем, как остановится." },
		{ 14100310, "Заклинания могут занимать несколько слотов." },
		{
			14200001,
			"Попади по врагу для " + Colorize("зарядки", "#E086EC")
		},
		{
			14200002,
			"Стой для " + Colorize("зарядки", "#E086EC")
		},
		{ 14200003, "Нормальный урон" },
		{ 14200004, "Критический урон" }
	};

	public static readonly IReadOnlyDictionary<int, string> Potion = new Dictionary<int, string>
	{
		{ 3000001, "Змеиная кровь" },
		{ 3000002, "Зелье щита" },
		{ 3000003, "Святая вода" },
		{ 3000004, "Зелье перековки" },
		{ 3000005, "Зелье иллюзий" },
		{ 3000006, "Зелье пробуждения" },
		{ 3000007, "Зелье обновления" },
		{ 3000008, "Зелье-отмычка" },
		{ 3000009, "Зелье мидаса" },
		{ 3000010, "Зелье скидки" },
		{ 3000011, "Зелье левитации" },
		{ 3000012, "Зелье невидимости" },
		{ 3000013, "Зелье неуязвимости" },
		{ 3000014, "Зелье окаменения" },
		{ 3000015, "Зелье ловкости" },
		{ 3000016, "Зелье размера" },
		{ 3000017, "Кристальное зелье" },
		{ 3000018, "Нестабильное красное зелье" },
		{ 3000019, "Нестабильное синее зелье" },
		{ 3000020, "Зелье очищения" },
		{ 3000021, "Зелье обогащения" },
		{ 3000022, "Слёзы богини" },
		{ 3000023, "Зелье реликвии" },
		{ 3000024, "Зелье переброса" },
		{ 3000025, "Жертвенное зелье" },
		{ 3000026, "Зелье слесаря" },
		{ 3000027, "Чистое касторовое масло" },
		{ 3000028, "Зелье дублирования" },
		{ 3000029, "Зелье магической силы" },
		{ 3000030, "Зелье сокровищ" },
		{ 3000034, "Экстренное зелье" },
		{ 3000035, "Зелье конверсии" },
		{ 3000036, "Зелье крита" },
		{ 3000037, "Зелье хаоса" },
		{ 3000038, "Ультимативное зелье" },
		{ 3000039, "Зелье зелий" },
		{ 3000040, "Зелье искупления" },
		{
			3100001,
			"Востанавливает случайное количество " + Colorize("ОЗ", "#33CC33") + " от int1 до int2"
		},
		{
			3100002,
			"Генерирует столько ед. " + Colorize("щита", "#C500FE") + ", сколько сейчас потеряно " + Colorize("ОЗ", "#33CC33") + " (Но не больше int1)"
		},
		{ 3100003, "Снимает случайное проклятие" },
		{ 3100004, "Перековывает все заклинания в инвентаре" },
		{ 3100005, "Замедляет время на float1 сек." },
		{
			3100006,
			"Временно увеличивает " + Colorize("Реген. маны", "") + " твоих жезлов на int1% в течение float1 сек."
		},
		{ 3100007, "Обновляет покупаемые предметы и доступные двери во всех комнатах" },
		{ 3100008, "Открывает абсолютно все запертые объекты в текущей комнате (сундуки, проклятые сундуки, сундуки с шипами и боковые двери)" },
		{ 3100009, "Превращает всех врагов в комнате, не являющихся боссами, в монеты" },
		{ 3100010, "Применяет скидку ко всем покупаемым предметам в текущей комнате" },
		{ 3100011, "Ты левитируешь! Длится до входа в следующую комнату" },
		{ 3100012, "Даёт невидимость на float1 сек.\\Атаки не раскрывают тебя" },
		{ 3100013, "Даёт неуязвимость на float1 сек." },
		{ 3100014, "Окаменяет тебя и даёт иммунитет к любому урону на float1 сек.\\Движение заканчивает окаменение преждевременно" },
		{ 3100015, "Навсегда увеличивает Скорость передвижения на +int1%" },
		{ 3100016, "Навсегда увеличивает или уменьшает тебя" },
		{
			3100017,
			"Навсегда увеличивает " + Colorize("Реген. маны", "") + " на +int1"
		},
		{
			3100018,
			"Навсегда изменяет " + Colorize("макс. ОЗ", "#33CC33") + " на int1 или +int2"
		},
		{
			3100019,
			"Навсегда изменяет " + Colorize("Макс. маны", "") + " на int1 или +int2"
		},
		{
			3100020,
			"Снимает все проклятия\\Обнуляет все единицы " + Colorize("щита", "#C500FE") + " и " + Colorize("временного щита", "#9D9D9B") + ", а также уменьшает текущие " + Colorize("ОЗ", "#33CC33") + " до 1"
		},
		{ 3100021, "Даёт монеты, равные float1% от имеющихся" },
		{ 3100022, "Снимает все проклятия, если на тебе ровно int1 уникальных проклятий" },
		{ 3100023, "Улучшает одну из твоих реликвий\\Если ни одна реликвия не может быть улучшена, то выдаётся одна обычная реликвия" },
		{ 3100024, "Позволяет перековать одну выбранную реликвию" },
		{
			3100025,
			"Конвертирует int1% твоих текущих " + Colorize("ОЗ", "#33CC33") + " в монеты"
		},
		{ 3100026, "Удваивает текущее количество ключей, либо добавляет int1 если нет ни одного" },
		{ 3100027, "Даёт иммунитет к яду и слизи в текущей комнате\\Накладывает яд и замедляет врагов позади тебя в течение float1 сек." },
		{ 3100028, "Дублирует все лечилки, щиты, монеты, монетные кучки и ключи в текущей комнате" },
		{ 3100029, "Навсегда увеличивает весь наносимый игроком и его существами урон на int1%" },
		{ 3100030, "Даёт случайный сундук сокровищ" },
		{
			3100034,
			"Генерирует столько ед. " + Colorize("временного щита", "#9D9D9B") + ", сколько сейчас потеряно " + Colorize("ОЗ", "#33CC33")
		},
		{
			3100035,
			"Конвертирует int1% твоих текущих " + Colorize("ОЗ", "#33CC33") + " в ед. " + Colorize("щита", "#C500FE")
		},
		{
			3100036,
			"Навсегда увеличивает " + Colorize("крит. шанс", "#FE5D00") + " на int1%"
		},
		{ 3100037, "Даёт 1-int1 случайных проклятия и 1-int2 случайные реликвии" },
		{
			3100038,
			"Уменьшает текущие " + Colorize("ОЗ", "#33CC33") + " до 1, конвертируя int1% потерянных " + Colorize("ОЗ", "#33CC33") + " в " + Colorize("макс. ОЗ", "#33CC33")
		},
		{ 3100039, "Создаёт int1 случайных зелья" },
		{
			3100040,
			"Уменьшает " + Colorize("макс. ОЗ", "#33CC33") + " на -int1%\\Восстаналивает текущие " + Colorize("ОЗ", "#33CC33") + " до 100%"
		}
	};

	public static readonly IReadOnlyDictionary<int, string> Curse = new Dictionary<int, string>
	{
		{ 2000001, "Просроченная награда" },
		{ 2000002, "Туманные врата" },
		{ 2000003, "Улучшенные ловушки" },
		{ 2000004, "Кровожадные приспешники" },
		{ 2000005, "Мстительные духи" },
		{ 2000006, "Суета" },
		{ 2000007, "Нестабильный телепортит" },
		{ 2000008, "Необратимый ущерб" },
		{ 2000009, "Оглушение" },
		{ 2000010, "Фальшивые алмазы" },
		{ 2000011, "Мышечная атрофия" },
		{ 2000012, "Робкость" },
		{ 2000013, "Изжога" },
		{ 2000014, "Слабость" },
		{ 2000015, "Медлительность" },
		{ 2000016, "Терновые врата" },
		{ 2000017, "Сложные замки" },
		{ 2000018, "Дырявый кошелёк" },
		{ 2000019, "Дикое размножение" },
		{ 2000020, "Проржавевшие монеты" },
		{ 2000021, "Нарушенный центр тяжести" },
		{ 2000022, "Куриная слепота" },
		{ 2000023, "Спешка" },
		{ 2000024, "Подавление магии" },
		{ 2000025, "Неэффективные заклятия" },
		{ 2000026, "Шаткое равновесие" },
		{ 2000027, "Кощунство" },
		{ 2000028, "Неистовая кровь" },
		{ 2000029, "Растерянность" },
		{ 2000030, "Неудача" },
		{ 2000031, "Роковая судьба" },
		{ 2000032, "Афазия" },
		{ 2000033, "Дезориентация" },
		{ 2000034, "Кандалы" },
		{ 2000035, "Уменьшенный рюкзак" },
		{ 2000036, "Аллергия на зелья" },
		{ 2000037, "Бомбическая погоня" },
		{ 2000038, "Утрата" },
		{ 2000039, "Истощение" },
		{ 2000040, "Сделка с дьяволом" },
		{ 2000041, "Старинные часы" },
		{ 2000042, "Утечка маны" },
		{ 2000043, "Косоглазие" },
		{ 2000044, "Ленивый магазин" },
		{ 2000045, "Близорукость" },
		{ 2000046, "Неряшливость" },
		{ 2000047, "Безжалостная улитка" },
		{ 2000048, "Старая рана" },
		{ 2000049, "Обратная тяга" },
		{ 2000050, "Уязвимость" },
		{ 2000051, "Сжатие" },
		{ 2000052, "Ненависть к богачам" },
		{ 2000053, "Обратные заклинания" },
		{ 2000054, "Трудности" },
		{ 2000055, "Нейродегенерация" },
		{ 2000056, "Нулевое трение" },
		{ 2000057, "Скользящее отклонение" },
		{ 2000058, "Забирака" },
		{ 2000059, "Сундук-мимик" },
		{ 2000060, "Блеф" },
		{ 2000061, "Забыл ключ дома" },
		{ 2000062, "Мор" },
		{ 2000063, "Подавление" },
		{ 2000999, "Конец всего" },
		{ 2100001, "Ресурсы исчезают если не подобрать их в течение float1 сек." },
		{ 2100002, "Невозможно рассмотреть куда ведут двери" },
		{ 2100003, "Ловушки наносят на +int1% больше урона по тебе и твоим призванным существам" },
		{ 2100004, "Скорость передвижения врагов увеличена на int1%" },
		{ 2100005, "Когда враги погибают, они имеют int1% шанс превратиться в духов, которые будут гоняться за тобой в течение float1 сек." },
		{
			2100006,
			"При получении урона по " + Colorize("ОЗ", "#33CC33") + ", ты теряешь несколько int1 монету"
		},
		{
			2100007,
			"При получении урона по " + Colorize("ОЗ", "#33CC33") + ", ты телепортируешься в случайную позицию"
		},
		{
			2100008,
			"При получении урона по " + Colorize("ОЗ", "#33CC33") + ", есть int1% шанс одновременно потерять столько же " + Colorize("макс. ОЗ", "#33CC33")
		},
		{
			2100009,
			"Невозможно кастовать заклинания в течение float1 сек. после получения урона по " + Colorize("ОЗ", "#33CC33")
		},
		{ 2100010, "Все алмазы становятся монетами" },
		{ 2100011, "Уменьшает Скорость передвижения на -int1%" },
		{ 2100012, "Невозможно кастовать заклинания в течение float1 сек. при входе в комнату" },
		{ 2100013, "Уменьшает скорость полёта снарядов заклинаний на int1%" },
		{ 2100014, "Уменьшает весь наносимый игроком и его существами урон на int1%" },
		{ 2100015, "Увеличивает интервал и задержку каста жезлов на int1%" },
		{ 2100016, "Ты получаешь int1 ед. урона при входе в комнату" },
		{ 2100017, "Все запертые объекты теперь требуют 2 ключа для открытия" },
		{ 2100018, "Ты теряешь несколько монет (int1) при входе в комнату" },
		{ 2100019, "Есть int1% шанс появления двойного количества врагов, кроме боссов" },
		{ 2100020, "Есть int1% шанс получения int2 урона при подборе монет или алмазов" },
		{ 2100021, "Заклинания теперь притягивают врагов, а не отталкивают" },
		{ 2100022, "Ты хуже видишь" },
		{
			2100023,
			Colorize("Регенерация маны", "") + " уменьшена на -int1%"
		},
		{
			2100024,
			Colorize("Макс. маны", "") + " уменьшен на -int1%"
		},
		{
			2100025,
			Colorize("Стоимость маны", "") + " ×int1%"
		},
		{ 2100026, "Отдача +int1%" },
		{ 2100027, "Количество реликвий на выбор -int1" },
		{
			2100028,
			"Реген. " + Colorize("ОЗ", "#33CC33") + " врагов +int1"
		},
		{
			2100029,
			"Отключает возможность видеть " + Colorize("ОЗ", "#33CC33") + ", " + Colorize("ману", "") + " и ресурсы"
		},
		{ 2100030, "Проклятие, которое меняется с каждой комнатой" },
		{ 2100031, "Проклятие, которое меняется с каждой комнатой" },
		{ 2100032, "Текст становится неразборчивым" },
		{ 2100033, "Передвижение инверсировано" },
		{ 2100034, "К тебе прикован шар на цепи" },
		{ 2100035, "Количество слотов в инвентаре -int1" },
		{ 2100036, "Наносит int1 ед. урона каждый раз, когда ты используешь зелье" },
		{ 2100037, "Возле тебя периодически появляется бомба" },
		{ 2100038, "Удаляет случайную реликвию\\После срабатывания — данное проклятие очищается" },
		{
			2100039,
			Colorize("Макс. ОЗ", "#33CC33") + " -int1"
		},
		{
			2100040,
			"При завершении комнат с получением урона по " + Colorize("ОЗ", "#33CC33") + " — уменьшает " + Colorize("макс. ОЗ", "#33CC33") + " на -int1\\При завершении комнат без получения урона по " + Colorize("ОЗ", "#33CC33") + " — увеличивает " + Colorize("макс. ОЗ", "#33CC33") + " на +int2"
		},
		{ 2100041, "Периодически отматывает тебя туда, где ты был float1 сек. назад" },
		{
			2100042,
			"При входе в комнату все жезлы имеют 0 " + Colorize("маны", "")
		},
		{
			2100043,
			"Весь " + Colorize("крит. шанс", "#FE5D00") + " int1%"
		},
		{ 2100044, "Количество предметов в магазине -int1" },
		{ 2100045, "Разброс +int1" },
		{ 2100046, "Лимит призываемых существ в int1 раза меньше (дробная часть округляется вверх)" },
		{ 2100047, "Медленная и бессмертная улитка постоянно преследует тебя" },
		{ 2100048, "У этого проклятия нет эффекта, но его очищение наносит int1 урона" },
		{ 2100049, "Отдача заклинаний инверсирована" },
		{ 2100050, "Увеличивает весь получаемый игроком и его существами урон на +int1%" },
		{
			2100051,
			"Уменьшает " + Colorize("радиус эффекта", "#FFD700") + " заклинаний и реликвий на int1%"
		},
		{ 2100052, "За каждые несколько имеющихся int1 монет, увеличивает весь получаемый игроком и его существами урон на +int2% (вплоть до float1%)" },
		{ 2100053, "Заклинания выпускаются в обратном направлении" },
		{ 2100054, "Уменьшает получаемый врагами урон на int1%" },
		{ 2100055, "Каст замедляет тебя гораздо сильнее" },
		{ 2100056, "Теперь ты постоянно движешься с небольшой скоростью без возможности полностью остановиться" },
		{ 2100057, "Теперь можно стрелять только по четырём диагональным направлениям" },
		{ 2100058, "Когда на земле появляются ресурсы, может появиться хитрый Забирака, который попытается забрать их" },
		{ 2100059, "Сундуки имеют шанс показать свою пасть!" },
		{
			2100060,
			"При полных " + Colorize("ОЗ", "#33CC33") + " увеличивает весь наносимый игроком и его существами урон на +int1%\\При неполных " + Colorize("ОЗ", "#33CC33") + " уменьшает весь наносимый игроком и его существами урон на int2%"
		},
		{ 2100061, "Ты потеряешь все ключи\\После срабатывания — данное проклятие очищается" },
		{
			2100062,
			"Призванные существа появляются с int1 " + Colorize("ОЗ", "#33CC33")
		},
		{ 2100063, "Количество заклинаний на выбор -int1" },
		{
			2100999,
			"Если ты видишь данное проклятие, значит, ты активировал все проклятия\\" + Colorize("Макс. ОЗ", "#33CC33") + " всех врагов +int1%"
		}
	};

	public static readonly IReadOnlyDictionary<int, string> Relic = new Dictionary<int, string>
	{
		{ 4000001, "Наплечники титана" },
		{ 4000002, "Ботинки рейнджера" },
		{ 4000003, "Кулон лесного духа" },
		{ 4000004, "Талисман концентрации" },
		{ 4000005, "Копирка" },
		{ 4000006, "Кровожадный взгляд" },
		{ 4000007, "Душекостная шкатулка" },
		{ 4000008, "Душекостный доспех" },
		{ 4000009, "Электро-корона" },
		{ 4000010, "Хвост костяного демона" },
		{ 4000011, "Ботинки рыцаря" },
		{ 4000012, "Дух-хранитель" },
		{ 4000013, "Крылья эльфа" },
		{ 4000014, "Перчатка старателя" },
		{ 4000015, "Жилетка старателя" },
		{ 4000016, "Душекостные наплечники" },
		{ 4000017, "Наплечники энта" },
		{ 4000018, "Золотая чаша, золотая" },
		{ 4000019, "Роба энта" },
		{ 4000020, "Маска жнеца" },
		{ 4000021, "Багровый браслет" },
		{ 4000022, "Шляпа Мерлина" },
		{ 4000023, "Роба Мерлина" },
		{ 4000024, "Везучие серьги" },
		{ 4000025, "Борода Мерлина" },
		{ 4000026, "Целебный пояс" },
		{ 4000027, "Бесконечный эликсир" },
		{ 4000028, "Безделушка продавца" },
		{ 4000029, "Ботинки Мерлина" },
		{ 4000030, "Венок энта" },
		{ 4000034, "Нагрудник рыцаря" },
		{ 4000035, "Застывшая капля" },
		{ 4000036, "Душекостная корона" },
		{ 4000037, "Маска ведьмака" },
		{ 4000038, "D6" },
		{ 4000039, "Уши эльфа" },
		{ 4000040, "Пыльное сокровище" },
		{ 4000041, "Роба фокусника" },
		{ 4000042, "Четырёхлистный клевер" },
		{ 4000043, "Кирка старателя" },
		{ 4000044, "Бур" },
		{ 4000045, "Накидка разбойника" },
		{ 4000046, "Песочные часы" },
		{ 4000047, "Тлеющее сердце" },
		{ 4000048, "Маска демона" },
		{ 4000049, "Семя жадности" },
		{ 4000050, "Талисман охотника" },
		{ 4000051, "Звериные клыки" },
		{ 4000052, "Пронзатель небес" },
		{ 4000053, "Линза для жезлов" },
		{ 4000054, "Шлем рыцаря" },
		{ 4000055, "Клинок ярости" },
		{ 4000056, "Лупа" },
		{ 4000057, "Дикие тентакли" },
		{ 4000058, "Лысина Cайтамы" },
		{ 4000059, "Серебряный ключ" },
		{ 4000060, "Яростный глаз" },
		{ 4000061, "Пристальное наблюдение" },
		{ 4000062, "Кровавый ключ" },
		{ 4000063, "Перчатка конечности" },
		{ 4000064, "Шляпа исследователя" },
		{ 4000065, "Энергетическая печать" },
		{ 4000066, "Чёрная метка" },
		{ 4000067, "Серебряный компас" },
		{ 4000068, "Сундук-матрёшка" },
		{ 4000069, "Ключ перезапуска" },
		{ 4000070, "Ящик пандоры" },
		{ 4000071, "Ветренное ухо" },
		{ 4000072, "Разноцветный плащ" },
		{ 4000073, "Печать Цзянши" },
		{ 4000074, "Невидимые крылья" },
		{ 4000075, "Шевелюра Супер Сайяна" },
		{ 4000076, "Хладагент" },
		{ 4000080, "Лишний мозг" },
		{ 4000081, "Кардиостимулятор" },
		{ 4000082, "Денежный колокольчик" },
		{ 4000901, "Счастливые заячьи ушки" },
		{ 4000902, "D8" },
		{ 4000903, "Очки учёного" },
		{ 4000931, "Духовное зеркало" },
		{ 4000932, "Плащ мечника" },
		{ 4000933, "Би Ань" },
		{ 4000934, "Жнец" },
		{ 4000935, "Истинная форма" },
		{ 4000936, "Рог друида" },
		{ 4000937, "Чумная маска" },
		{ 4000938, "Водолазный костюм" },
		{ 4000961, "Супернаконечник" },
		{ 4000962, "Ядовитый наконечник" },
		{ 4000963, "Тесла-наконечник" },
		{ 4000964, "Ледяной наконечник" },
		{ 4000965, "Огненный наконечник" },
		{ 4000966, "Расширяющий наконечник" },
		{ 4000999, "Мистический артефакт" },
		{
			4100001,
			Colorize("Макс. ОЗ", "#33CC33") + " +int1\\Размер персонажа ×int2%\\Отдача int3%"
		},
		{ 4100002, "Скорость передвижения +int1%\\Дают иммунитет к замедляющим эффектам (кроме замедления от каста заклинаний)" },
		{
			4100003,
			"Медленно восстанавливает твои " + Colorize("ОЗ", "#33CC33") + " до int1 когда их меньше int1"
		},
		{ 4100004, "Пока ты стоишь на месте, твои задержка каста, интервал каста, и разброс постепенно уменьшаются на -int1%" },
		{ 4100005, "При касте заклинания, есть int1% шанс выпустить копию в случайном направлении" },
		{
			4100006,
			"При убийстве врага, есть int1% шанс восстановить int2 " + Colorize("ОЗ", "#33CC33")
		},
		{ 4100007, "При убийстве врага, есть int1% шанс призвать преследующего врагов духа и наносящего int2&DMG урона" },
		{ 4100008, "При убийстве врага, есть int1% шанс создать костяной щит, летающий вокруг тебя" },
		{
			4100009,
			"При получении урона, наносит всем врагам урон, равный int1&DMG + float1% " + Colorize("макс. ОЗ", "#33CC33") + " всех врагов (float2% для боссов)"
		},
		{
			4100010,
			"При убийстве врага, создаёт Волшебную пулю, которая следует за тобой\\Созданная пуля наносит урон, равный int1% " + Colorize("макс. ОЗ", "#33CC33") + " убитого врага"
		},
		{ 4100011, "Дают иммунитет к напольным шипам, а также лужам яда и слизи" },
		{ 4100012, "Призывает несколько духов (int1) которые могут прервать заклинания врагов" },
		{ 4100013, "Позволяют тебе левитировать" },
		{ 4100014, "При убийстве врага, есть int1% шанс появления монетки" },
		{
			4100015,
			"Позволяет восстанавливать " + Colorize("ОЗ", "#33CC33") + " при подборе монеток"
		},
		{
			4100016,
			"Даёт int1 ед. " + Colorize("щита", "#C500FE") + "\\Даёт int3 ед. " + Colorize("щита", "#C500FE") + " за каждые int2 убийства врагов"
		},
		{
			4100017,
			"Дают int1 ед. " + Colorize("щита", "#C500FE") + " при входе в комнату"
		},
		{ 4100018, "Наполняет воздух ароматом монет. Каждый раз при входе в следующую комнату, даёт дополнительные монеты в виде int1% от имеющихся (но не больше int2)" },
		{
			4100019,
			"Восстанавливает int1 " + Colorize("ОЗ", "#33CC33") + " при входе в комнату"
		},
		{ 4100020, "float1% шанс мгновенно убить любого врага, кроме боссов" },
		{ 4100021, "Уменьшает Скорость передвижения до int1%\\Увеличивает Скорость передвижения до int2% если не получать урон в течение float1 сек." },
		{
			4100022,
			Colorize("Макс. маны", "") + " +int1"
		},
		{
			4100023,
			Colorize("Реген. маны", "") + " +int1/с"
		},
		{ 4100024, "Количество реликвий на выбор +int1" },
		{ 4100025, "Лимит призванных существ ×int1\\Этот эффект распространяется только на те существа, что призываются непосредственно самим игроком" },
		{
			4100026,
			"Каждое использование зелья увеличивает " + Colorize("макс. ОЗ", "#33CC33") + " на int1 и " + Colorize("Макс. маны", "") + " на int2"
		},
		{ 4100027, "При использовании зелья есть int1% шанс получить ещё одно случайное зелье" },
		{ 4100028, "В магазине всегда будет появляться комната с зельями\\В комнате обработки всегда будет появляться комната слияния" },
		{
			4100029,
			"Восстанавливают int1 " + Colorize("Маны", "") + " при убийстве врагов"
		},
		{
			4100030,
			"Даёт int1 ед. " + Colorize("временного щита", "#9D9D9B") + " при входе в комнату"
		},
		{ 4100034, "Уменьшает весь получаемый игроком и его существами урон на int1%" },
		{
			4100035,
			"Замедляет большинство вражеских снарядов в " + Colorize("радиусе эффекта", "#FFD700") + " float1&rangeм"
		},
		{
			4100036,
			"Даёт int2 ед. " + Colorize("временного щита", "#9D9D9B") + " при убийстве int1 врагов"
		},
		{ 4100037, "За каждое имеющееся уникальное проклятие, наносимый игроком и его существами урон увеличивается на +int1%" },
		{ 4100038, "Позволяет перебрасывать реликвии при выборе — int1 раз" },
		{ 4100039, "Каст заклинаний больше не замедляет тебя" },
		{ 4100040, "Улучшает одну из твоих реликвий\\Если ни одна реликвия не может быть улучшена, то выдаётся одна обычная реликвия" },
		{
			4100041,
			"Ты можешь управлять своим жезлом на расстоянии вплоть до float1 метров\\" + Colorize("Радиус эффектов", "#FFD700") + " заклинаний: int1%"
		},
		{ 4100042, "Даёт int1% шанс уклониться от атаки" },
		{ 4100043, "Увеличивает наносимый игроком и его существами урон на +int2% за каждые несколько имеющихся монет (int1)" },
		{ 4100044, "Количество слотов в жезлах +int1" },
		{ 4100045, "Даёт невидимость если не атаковать в течение float1 сек.\\Атака делает тебя снова видимым" },
		{
			4100046,
			"При смерти восстанавливают твои " + Colorize("ОЗ", "#33CC33") + " до int1%\\Исчезают после использования"
		},
		{
			4100047,
			"Наносит int1&DMG урона в секунду всем врагам в " + Colorize("радиусе эффекта", "#FFD700") + " float1&rangeм"
		},
		{
			4100048,
			"Увеличивает весь " + Colorize("крит. шанс", "#FE5D00") + " на +int1%"
		},
		{
			4100049,
			"Поглощает всё последующее лечение\\После поглощения int1 лечения оно вырастет и увеличит твой " + Colorize("макс. ОЗ", "#33CC33") + " на int2"
		},
		{ 4100050, "Увеличивает дальность зрения" },
		{ 4100051, "Увеличивают весь наносимый игроком и его существами урон на +int1%" },
		{ 4100052, "Заклинания могут проходить сквозь стены" },
		{ 4100053, "Отталкивание врагов заклинаниями +int1%" },
		{ 4100054, "Уменьшает неразборчивый урон получаемый игроком и его существами до float1%" },
		{
			4100055,
			"Увеличивает " + Colorize("крит. урон", "#FE5D00") + " с 200% до int1%"
		},
		{
			4100056,
			"Увеличивает " + Colorize("радиус эффектов", "#FFD700") + " заклинаний и реликвий на +int1%"
		},
		{ 4100057, "Скорость передвижения +int1%" },
		{ 4100058, "Увеличивает весь наносимый игроком и его существами урон на +int1%\\Увеличивает весь получаемый игроком и его существами урон на +int2%" },
		{ 4100059, "Даёт доступ ко всем сундукам и дверям, заблокированным на ключ" },
		{
			4100060,
			"За каждые int1 отсутствующих " + Colorize("ОЗ", "#33CC33") + ", увеличивает весь наносимый игроком и его существами урон на +float1%"
		},
		{
			4100061,
			"Показывает полоску " + Colorize("ОЗ", "#33CC33") + " у всех существ\\На втором уровне будет показывать численное значение"
		},
		{ 4100062, "После убийства босса, будет всегда появляться комната с алыми реликвиями" },
		{ 4100063, "Время от времени убивает половину врагов в комнате не являющихся боссами" },
		{ 4100064, "Уровни имеют на один выбор двери больше" },
		{
			4100065,
			"Увеличивает эффективность " + Colorize("зарядки", "#E086EC") + " вторичных слотов во всех жезлах на +int1%"
		},
		{ 4100066, "Один случайный товар в магазине теперь бесплатный" },
		{ 4100067, "Каждая комната с врагами будет гарантированно иметь сундук или алтарь" },
		{ 4100068, "При открытии сундука, есть int1%