Decompiled source of RuSols v1.4.3

BepInEx/plugins/RuSols/RuSols.Bepin.dll

Decompiled 6 days ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
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.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using I2.Loc;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.TextCore.LowLevel;
using UnityEngine.UI;
using UnityEngine.UI.Extensions;
using _3_Script.UI.SaveUI;

[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("RuSols.Bepin")]
[assembly: AssemblyTitle("RuSols.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 RuSols;

public class CustomMultipleOptionSelector : ListRotateSelector<string>, IPrefRestoreSetter
{
	public Func<int> initializationStarted;

	public Action<string, int> changed;

	public override string displayStr => ((RotateSelector<string>)(object)this).currentSelected;

	protected override void InitImplement()
	{
		base.CurrentIndex = initializationStarted?.Invoke() ?? 0;
	}

	protected override void OnChanged(string value)
	{
		changed?.Invoke(value, base.CurrentIndex);
	}

	public void RestoreFlagOrPref()
	{
	}
}
public class CoroutineRunner : MonoBehaviour
{
}
public class BooleanSetting : ListRotateSelector<bool>, IPrefRestoreSetter
{
	public Func<bool> initializationStarted;

	public Action<bool> changed;

	private LocalizedString _textOff = LocalizedString.op_Implicit("UI_System/Graphic_Status_Off");

	private LocalizedString _textOn = LocalizedString.op_Implicit("UI_System/Graphic_Status_On");

	public override string displayStr => LocalizedString.op_Implicit((base.CurrentIndex == 0) ? _textOff : _textOn);

	protected override void InitImplement()
	{
		base.list = new List<bool> { false, true };
		base.CurrentIndex = ((initializationStarted?.Invoke() ?? false) ? 1 : 0);
	}

	protected override void OnChanged(bool value)
	{
		changed?.Invoke(value);
	}

	public void RestoreFlagOrPref()
	{
	}
}
public class DonateLinkButton : MonoBehaviour, ISubmitHandler, IEventSystemHandler
{
	public void OnSubmit(BaseEventData eventData)
	{
		Application.OpenURL("https://www.donationalerts.com/r/crazyman_ik");
	}
}
public enum Cases
{
	Nominative,
	Genitive,
	Dative,
	Accusative,
	Instrumental,
	Prepositional
}
public class Name
{
	private readonly string _caseA = "";

	private readonly string _caseB = "";

	private readonly string _caseC = "";

	private readonly string _caseD = "";

	private readonly string _caseE = "";

	private readonly string _caseF = "";

	private readonly bool _single = true;

	public Name(string name)
	{
		_caseA = name;
	}

	public Name(string caseA, string caseB, string caseC, string caseD, string caseE, string caseF)
	{
		_caseA = caseA;
		_caseB = caseB;
		_caseC = caseC;
		_caseD = caseD;
		_caseE = caseE;
		_caseF = caseF;
		_single = false;
	}

	public string GetFinal(Cases cases)
	{
		if (_single)
		{
			return _caseA;
		}
		return cases switch
		{
			Cases.Nominative => _caseA, 
			Cases.Genitive => _caseB, 
			Cases.Dative => _caseC, 
			Cases.Accusative => _caseD, 
			Cases.Instrumental => _caseE, 
			Cases.Prepositional => _caseF, 
			_ => "", 
		};
	}
}
[BepInPlugin("Astetrio.CrazyMan.RuSols", "RuSols", "1.4.3")]
public class RuSols : BaseUnityPlugin
{
	public class Result<T> where T : class
	{
		public T value;
	}

	public const string DonateKey = "MMDonate";

	public const string SupportKey = "MMSupport";

	public const string JiGenderKey = "Ji Gender";

	public const string UseIngameTranslationKey = "Ingame Translation";

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

	public const string Name = "RuSols";

	public const string Version = "1.4.3";

	private static readonly DateTime _oldVersionDate = new DateTime(2024, 6, 3);

	private static readonly DateTime _ingameTranslationsVersionDate = new DateTime(2024, 8, 14);

	private readonly Dictionary<string, (GameObject, Func<bool>)> _togglesAndOther = new Dictionary<string, (GameObject, Func<bool>)>();

	private readonly ConcurrentDictionary<string, string> _ingameTranslations = new ConcurrentDictionary<string, string>();

	private CoroutineRunner _coroutineRunner;

	private Coroutine _fixSceneSpecificProblemsCoroutine;

	private Coroutine _downloadingNewVersionCoroutine;

	private ConfigEntry<bool> _toggleJiGenderConfig;

	private ConfigEntry<bool> _useIngameTranslationConfig;

	private Font _customFont;

	private TMP_FontAsset _customFontTMP;

	private bool _hasNewVersion;

	private bool _isOldVersion;

	private bool _isUpdated;

	private bool _isDownloadingNewVersionError;

	private bool _isVersionWithIngameTranslations;

	public static RuSols Instance { get; private set; } = null;


	public string ServerVersion { get; private set; } = "1.4.3";


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


	public bool IsJiMale => _toggleJiGenderConfig.Value;

	public bool IsDownloadingNewVersionError => _isDownloadingNewVersionError;

	public bool HasNewVersion => _hasNewVersion;

	public bool IsRussian => LocalizationManager.CurrentLanguageCode == "ru";

	private void Awake()
	{
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: Expected O, but got Unknown
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Expected O, but got Unknown
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0122: Expected O, but got Unknown
		//IL_0154: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Expected O, but got Unknown
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Expected O, but got Unknown
		//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Expected O, but got Unknown
		//IL_0211: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Expected O, but got Unknown
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_025d: Expected O, but got Unknown
		//IL_028f: Unknown result type (might be due to invalid IL or missing references)
		//IL_029c: Expected O, but got Unknown
		//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_02db: Expected O, but got Unknown
		//IL_030d: Unknown result type (might be due to invalid IL or missing references)
		//IL_031a: Expected O, but got Unknown
		//IL_034b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0359: Expected O, but got Unknown
		//IL_038b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0398: Expected O, but got Unknown
		//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d7: Expected O, but got Unknown
		//IL_0409: Unknown result type (might be due to invalid IL or missing references)
		//IL_0416: Expected O, but got Unknown
		//IL_0447: Unknown result type (might be due to invalid IL or missing references)
		//IL_0455: Expected O, but got Unknown
		//IL_04df: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e9: Expected O, but got Unknown
		//IL_04ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0506: Expected O, but got Unknown
		//IL_0509: Unknown result type (might be due to invalid IL or missing references)
		//IL_0510: Unknown result type (might be due to invalid IL or missing references)
		//IL_0486: Unknown result type (might be due to invalid IL or missing references)
		//IL_0494: Expected O, but got Unknown
		((BaseUnityPlugin)this).Logger.LogEvent += OnLoggerLog;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Инициализация RuSols");
		Instance = this;
		_toggleJiGenderConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "IsJiAreMale", true, "Is sol Ji are male?");
		_useIngameTranslationConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "UseIngameTranslation", false, "Use in-game translation");
		if (TryGetVersionDate(out var result))
		{
			_isOldVersion = result <= _oldVersionDate;
			_isVersionWithIngameTranslations = result >= _ingameTranslationsVersionDate;
		}
		_customFont = new Font(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "WildWordsLower.ttf"))
		{
			name = "WildWordsLower"
		};
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Патчим некоторые методы");
		Harmony val = new Harmony("Astetrio.CrazyMan.RuSols");
		if (TryGetMethod("VersionText", "Start", out var method))
		{
			MethodInfo methodInfo = AccessTools.Method(typeof(Patches), "Start_VersionText", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("RCGUIPanel", "AwakeInit", out method))
		{
			MethodInfo methodInfo2 = AccessTools.Method(typeof(Patches), "AwakeInit_RCGUIPanel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIControlButton", "Awake", out method))
		{
			MethodInfo methodInfo3 = AccessTools.Method(typeof(Patches), "Awake_UIControlButton", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("InputPromptUILabel", "Awake", out method))
		{
			MethodInfo methodInfo4 = AccessTools.Method(typeof(Patches), "Awake_InputPromptUILabel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("TutorialUITaskEntry", "Awake", out method))
		{
			MethodInfo methodInfo5 = AccessTools.Method(typeof(Patches), "Awake_TutorialUITaskEntry", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo5), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("I2LocalizeSpacingOptionPlugin", "Start", out method))
		{
			MethodInfo methodInfo6 = AccessTools.Method(typeof(Patches), "Start_I2LocalizeSpacingOptionPlugin", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo6), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIManager", "Awake", out method))
		{
			MethodInfo methodInfo7 = AccessTools.Method(typeof(Patches), "Awake_UIManager", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo7), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("SavePanel", "ShowInit", out method))
		{
			MethodInfo methodInfo8 = AccessTools.Method(typeof(Patches), "ShowInit_SavePanel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("UIInteractRootPanel", "ShowInit", out method))
		{
			MethodInfo methodInfo9 = AccessTools.Method(typeof(Patches), "ShowInit_UIInteractRootPanel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo9), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("TestRope", "EnterLevelAwake", out method))
		{
			MethodInfo methodInfo10 = AccessTools.Method(typeof(Patches), "EnterLevelAwake_TestRope", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo10), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("LocalizationManager", "AddSource", out method))
		{
			MethodInfo methodInfo11 = AccessTools.Method(typeof(Patches), "AddSource_LocalizationManager", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo11), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("GameLevel", "Awake", out method))
		{
			MethodInfo methodInfo12 = AccessTools.Method(typeof(Patches), "Awake_GameLevel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo12), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("LoadingScreenPanel", "ShowLoading", out method))
		{
			MethodInfo methodInfo13 = AccessTools.Method(typeof(Patches), "ShowLoading_LoadingScreenPanel", (Type[])null, (Type[])null);
			val.Patch(method, (HarmonyMethod)null, new HarmonyMethod(methodInfo13), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("RCGUITimeDisplay", "UpdateText", out method))
		{
			MethodInfo methodInfo14 = AccessTools.Method(typeof(Patches), "UpdateText_RCGUITimeDisplay", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo14), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		if (TryGetMethod("SkillTreeUI", "UpdateCurrentNodeView", out method))
		{
			MethodInfo methodInfo15 = AccessTools.Method(typeof(Patches), "UpdateCurrentNodeView_SkillTreeUI", (Type[])null, (Type[])null);
			val.Patch(method, new HarmonyMethod(methodInfo15), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Перехватываем получение текстов");
		TMP_FontAsset val2 = TMP_FontAsset.CreateFontAsset(_customFont, 45, 9, (GlyphRenderMode)4165, 1024, 1024, (AtlasPopulationMode)1, true);
		((Object)val2).name = "WildWordsLower";
		_customFontTMP = val2;
		LocalizationManager.OnLocalizeEvent += new OnLocalizeCallback(OnLocalize);
		SceneManager.activeSceneChanged += OnSceneChanged;
		GameObject val3 = new GameObject("RuSols Coroutine Runner");
		((Object)val3).hideFlags = (HideFlags)(((Object)val3).hideFlags | 0x3D);
		Object.DontDestroyOnLoad((Object)(object)val3);
		_coroutineRunner = val3.AddComponent<CoroutineRunner>();
		((MonoBehaviour)_coroutineRunner).StartCoroutine(AsyncAwake());
	}

	private IEnumerator AsyncAwake()
	{
		TryRunFixSceneSpecificProblems(SceneManager.GetActiveScene());
		yield return null;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"RuSols Инициализирован");
	}

	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)
		if (_fixSceneSpecificProblemsCoroutine != null)
		{
			((MonoBehaviour)_coroutineRunner).StopCoroutine(_fixSceneSpecificProblemsCoroutine);
			_fixSceneSpecificProblemsCoroutine = null;
		}
		_fixSceneSpecificProblemsCoroutine = ((MonoBehaviour)_coroutineRunner).StartCoroutine(FixSceneSpecificProblems());
		IEnumerator FixSceneSpecificProblems()
		{
			if (_togglesAndOther.TryGetValue("Ji Gender", out var value2) && (Object)(object)value2.Item1 == (Object)null)
			{
				_togglesAndOther.Remove("Ji Gender");
			}
			if (((Scene)(ref newScene)).name == "TitleScreenMenu")
			{
				Result<Transform> result2 = new Result<Transform>();
				Result<TMP_Text> result3 = new Result<TMP_Text>();
				if (IsRussian)
				{
					LocalizationManager.SetLanguageAndCode("Русский", "ru", true, false);
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Фиксим текст \"Настройки\"");
				yield return this.SearchFor<Transform>(result2, (Transform)null, "SettingOptionPanel", -1f);
				yield return this.SearchFor<TMP_Text>(result3, result2.value, "PauseText", -1f);
				RectTransform rectTransform = result3.value.rectTransform;
				rectTransform.sizeDelta += new Vector2(200f, 0f);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Добавляем переключалки в настройках языка");
				if (!_togglesAndOther.TryGetValue("Ji Gender", out var value3) || (Object)(object)value3.Item1 == (Object)null)
				{
					yield return this.SearchFor<Transform>(result2, (Transform)null, "Setting Sub Panels(Switcher/Tab)", -1f);
					Transform settingsUIPanel2 = result2.value;
					if (_isVersionWithIngameTranslations)
					{
						yield return CreateBooleanToggle(settingsUIPanel2, "Ingame Translation", "Использовать официальный перевод", () => _useIngameTranslationConfig.Value, delegate(bool value)
						{
							_useIngameTranslationConfig.Value = value;
							UpdateAllTexts();
						}, delegate
						{
						});
					}
					yield return CreateBooleanToggle(settingsUIPanel2, "Ji Gender", "Мужские обращения к Цзи (Канон)", () => _toggleJiGenderConfig.Value, delegate(bool value)
					{
						_toggleJiGenderConfig.Value = value;
						UpdateJiGenderTexts();
					}, null, () => false);
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Добавляем дополнительные кнопки в главном меню");
				yield return this.SearchFor<Transform>(result2, (Transform)null, "MainMenuButton_Credit", -1f);
				GameObject gameObject = ((Component)result2.value).gameObject;
				GameObject gameObject2 = ((Component)result2.value.parent).gameObject;
				yield return CreateMainMenuButton(gameObject, gameObject2.transform, "MMDonate", "Дать деняк переводчику :3", new UnityAction(OnDonateClicked));
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Дополнительные кнопки добавлены");
			}
			else
			{
				Result<Transform> result2 = new Result<Transform>();
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Добавляем переключалки в настройках языка");
				if (!_togglesAndOther.TryGetValue("Ji Gender", out var value4) || (Object)(object)value4.Item1 == (Object)null)
				{
					yield return this.SearchFor<Transform>(result2, (Transform)null, "[Keep Enable]OptionPanels(Switch/Tabs)", -1f);
					Transform settingsUIPanel2 = result2.value;
					if (_isVersionWithIngameTranslations)
					{
						yield return CreateBooleanToggle(settingsUIPanel2, "Ingame Translation", "Использовать официальный перевод", () => _useIngameTranslationConfig.Value, delegate(bool value)
						{
							_useIngameTranslationConfig.Value = value;
							UpdateAllTexts();
						});
					}
					yield return CreateBooleanToggle(settingsUIPanel2, "Ji Gender", "Мужские обращения к Цзи (Канон)", () => _toggleJiGenderConfig.Value, delegate(bool value)
					{
						_toggleJiGenderConfig.Value = value;
						UpdateJiGenderTexts();
					}, null, () => false);
				}
			}
		}
	}

	public void InitializeData(LanguageSourceData data)
	{
		bool isMale = true;
		bool useIngameTranslation = _useIngameTranslationConfig.Value && _isVersionWithIngameTranslations;
		int languageIndex = data.mLanguages.FindIndex((LanguageData x) => x.Code == "ru");
		List<TermData> terms = data.mTerms;
		Parallel.For(0, terms.Count, delegate(int j)
		{
			TermData val = terms[j];
			string term = val.Term;
			string value = val.Languages[languageIndex];
			_ingameTranslations[term] = value;
			if (!useIngameTranslation)
			{
				if (term == "Fonts/UI_Font")
				{
					val.Languages[languageIndex] = (_isVersionWithIngameTranslations ? "NotoSans-Russian-Regular" : "EN_DejaVuSans");
				}
				else
				{
					bool flag = false;
					bool flag2 = false;
					if (isMale && Translation.JiMaleTranslations.TryGetValue(term, out var value2))
					{
						flag = true;
						val.Languages[languageIndex] = ReplaceNames(value2);
					}
					if (_isOldVersion && Translation.OldJinPrices.TryGetValue(term, out value2))
					{
						flag2 = true;
						val.Languages[languageIndex] = ReplaceNames(value2);
					}
					if (!flag && !flag2 && Translation.Translations.TryGetValue(term, out value2))
					{
						val.Languages[languageIndex] = ReplaceNames(value2);
					}
				}
			}
		});
		data.AddAsset((Object)(object)_customFontTMP);
		LanguageData obj = data.mLanguages[languageIndex];
		obj.Name = "Русский";
		obj.SetEnabled(true);
	}

	public string GetVersionText()
	{
		string text = CurrentGameVersion + " <color=#ffffff>(Перевод на русский - RuSols от CrazyMan v1.4.3t)</color>";
		if (HasNewVersion)
		{
			if (_isUpdated)
			{
				text = text + " <color=#ffffff>Обновлено до v" + ServerVersion + " перезапусти игру для завершения</color>";
			}
			else
			{
				string text2 = "";
				if (_isDownloadingNewVersionError)
				{
					text2 = "ошибка автообновления";
				}
				else if (_downloadingNewVersionCoroutine != null)
				{
					text2 = "идёт авто-обновление";
				}
				text = text + " <color=#ffffff>Доступна новая версия перевода! (v" + ServerVersion + ") " + text2 + "</color>";
			}
		}
		return text;
	}

	public void ReplaceBossNamesIn(GameObject go)
	{
		if (IsRussian && !_useIngameTranslationConfig.Value)
		{
			((MonoBehaviour)_coroutineRunner).StartCoroutine(ReplaceBossNamesCoroutine());
		}
		IEnumerator ReplaceBossNamesCoroutine()
		{
			List<Transform> result2 = new List<Transform>();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Получаем список интро боссов");
			yield return this.SearchForAll<Transform>(result2, go, "Boss Intro Acting", 5f);
			for (int i = 0; i < result2.Count; i++)
			{
				Transform bosses = result2[i].Find("View");
				if ((Object)(object)bosses == (Object)null)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)"Не удалось получить список интро боссов");
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Список интро боссов получен");
					for (int j = 0; j < bosses.childCount; j++)
					{
						Transform child = bosses.GetChild(j);
						Transform val = child.Find("Subtitle_Text/Title");
						if ((Object)(object)val != (Object)null && TryGetBossName(((Object)child).name, out var name))
						{
							((Component)val).GetComponent<TMP_Text>().text = name.ToUpper();
							((BaseUnityPlugin)this).Logger.LogInfo((object)("Босс (" + ((Object)child).name + ") найден: " + name));
						}
						else
						{
							((BaseUnityPlugin)this).Logger.LogInfo((object)("Босс (" + ((Object)child).name + ") не найден"));
						}
						yield return null;
					}
				}
			}
		}
	}

	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);
	}

	public IEnumerator SearchFor<T>(Result<T> result, Transform parent, string name, float time = -1f) where T : Object
	{
		WaitForSecondsRealtime delay = new WaitForSecondsRealtime(1f);
		float startTime = Time.time;
		result.value = default(T);
		if ((Object)(object)parent == (Object)null)
		{
			while ((Object)(object)result.value == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем " + name));
				T[] array = Object.FindObjectsOfType<T>(true);
				foreach (T val in array)
				{
					if (((Object)val).name == name)
					{
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Объект найден " + ((Object)val).name));
						result.value = val;
						break;
					}
				}
				if ((Object)(object)result.value == (Object)null)
				{
					yield return delay;
				}
				if (time >= 0f && Time.time - startTime > time)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Объект не найден");
					break;
				}
			}
			yield break;
		}
		while ((Object)(object)result.value == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем " + name + " внутри " + ((Object)parent).name));
			T[] componentsInChildren = ((Component)parent).GetComponentsInChildren<T>(true);
			foreach (T val2 in componentsInChildren)
			{
				if (((Object)val2).name == name)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Объект найден " + ((Object)val2).name));
					result.value = val2;
					break;
				}
			}
			if ((Object)(object)result.value == (Object)null)
			{
				yield return delay;
			}
			if (time >= 0f && Time.time - startTime > time)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Объект не найден");
				break;
			}
		}
	}

	public IEnumerator SearchForAll<T>(List<T> results, GameObject parent, string name, float time = -1f) where T : Object
	{
		WaitForSecondsRealtime delay = new WaitForSecondsRealtime(1f);
		float startTime = Time.time;
		if ((Object)(object)parent == (Object)null)
		{
			while (results.Count < 1)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем " + name));
				T[] array = Object.FindObjectsOfType<T>(true);
				foreach (T val in array)
				{
					if (((Object)val).name.Contains(name))
					{
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Объект найден " + ((Object)val).name));
						results.Add(val);
					}
				}
				if (results.Count < 1)
				{
					yield return delay;
				}
				if (time >= 0f && Time.time - startTime > time)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Объект не найден");
					break;
				}
			}
			yield break;
		}
		while (results.Count < 1)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Ищем " + name + " внутри " + ((Object)parent).name));
			T[] componentsInChildren = parent.GetComponentsInChildren<T>(true);
			foreach (T val2 in componentsInChildren)
			{
				if (((Object)val2).name.Contains(name))
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)("Объект найден " + ((Object)val2).name));
					results.Add(val2);
				}
			}
			if (results.Count < 1)
			{
				yield return delay;
			}
			if (time >= 0f && Time.time - startTime > time)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Объект не найден");
				break;
			}
		}
	}

	private IEnumerator CreateMainMenuButton(GameObject baseButton, Transform parent, string name, string viewName, UnityAction clickedCallback)
	{
		GameObject newButton = Object.Instantiate<GameObject>(baseButton, parent);
		newButton.transform.SetSiblingIndex(baseButton.transform.GetSiblingIndex() + 1);
		AutoAttributeManager.AutoReference(newButton);
		((Object)newButton).name = "MainMenuButton_" + name;
		_togglesAndOther[name] = (newButton, () => true);
		newButton.SetActive(IsRussian);
		TMP_Text componentInChildren = newButton.GetComponentInChildren<TMP_Text>();
		Object.DestroyImmediate((Object)(object)((Component)componentInChildren).GetComponent<Localize>());
		componentInChildren.text = viewName;
		yield return null;
		UIControlButton component = newButton.GetComponent<UIControlButton>();
		component.onSubmit.AddListener(clickedCallback);
		component.clickToShowGroup = null;
	}

	private IEnumerator CreateBooleanToggle(Transform settingsUIPanel, string name, string viewName, Func<bool> initializationCallback, Action<bool> changedCallback, Action<GameObject> createdCallback = null, Func<bool> activationCheck = null)
	{
		Transform languagePanelLayout = settingsUIPanel.Find("Language Panel/Layout");
		if (!((Object)(object)languagePanelLayout != (Object)null))
		{
			yield break;
		}
		Result<Transform> result1 = new Result<Transform>();
		Transform parent = languagePanelLayout.parent;
		SelectableNavigationProvider selectableNavigationProvider = ((Component)parent).GetComponent<SelectableNavigationProvider>();
		yield return this.SearchFor<Transform>(result1, settingsUIPanel.Find("Language Panel"), "Selector Group Component", -1f);
		GameObject val = Object.Instantiate<GameObject>(((Component)result1.value).gameObject, languagePanelLayout, false);
		Transform child = val.transform.GetChild(0);
		Button component = ((Component)child).GetComponent<Button>();
		UIControlButton component2 = ((Component)child).GetComponent<UIControlButton>();
		Button component3 = ((Component)languagePanelLayout.Find("Selector Group Component").GetChild(0)).GetComponent<Button>();
		UIControlButton component4 = ((Component)component3).GetComponent<UIControlButton>();
		Transform obj = child.Find("Label");
		Transform val2 = child.Find("Text (TMP)");
		SelectableNavigationRemapping val3 = default(SelectableNavigationRemapping);
		if (!((Component)component3).gameObject.TryGetComponent<SelectableNavigationRemapping>(ref val3))
		{
			SelectableNavigationRemapping val4 = ((Component)component3).gameObject.AddComponent<SelectableNavigationRemapping>();
			val4.IsHorizontal = false;
			val4.IsRebindWhenOnEnable = true;
			AccessTools.Field(typeof(SelectableNavigationRemapping), "myProvider").SetValue(val4, selectableNavigationProvider);
			AccessTools.Field(typeof(SelectableNavigationRemapping), "conditions").SetValue(val4, new AbstractConditionComp[0]);
		}
		((Object)val).name = "[" + name + "]Selector Group Component";
		Object.Destroy((Object)(object)((Component)child).GetComponent<LanguageUISelector>());
		BooleanSetting booleanSetting = ((Component)child).gameObject.AddComponent<BooleanSetting>();
		((RotateSelector<bool>)(object)booleanSetting).text = ((Component)val2).GetComponent<TMP_Text>();
		FlagFieldEntryInt val5 = new FlagFieldEntryInt();
		((FlagFieldEntry<int>)val5).fieldName = name;
		((ListRotateSelector<bool>)booleanSetting).entry = val5;
		booleanSetting.initializationStarted = initializationCallback;
		booleanSetting.changed = changedCallback;
		SelectableNavigationRemapping val6 = ((Component)child).gameObject.AddComponent<SelectableNavigationRemapping>();
		val6.IsHorizontal = false;
		val6.IsRebindWhenOnEnable = true;
		AccessTools.Field(typeof(SelectableNavigationRemapping), "myProvider").SetValue(val6, selectableNavigationProvider);
		AccessTools.Field(typeof(SelectableNavigationRemapping), "conditions").SetValue(val6, new AbstractConditionComp[0]);
		Type typeFromHandle = typeof(UIControlButton);
		AccessTools.Field(typeFromHandle, "_activateConditions").SetValue(component2, new AbstractConditionComp[0]);
		AccessTools.Field(typeFromHandle, "_onSubmitActions").SetValue(component2, new AbstractStateAction[0]);
		AccessTools.Field(typeFromHandle, "_button").SetValue(component2, component);
		FieldInfo fieldInfo = AccessTools.Field(typeFromHandle, "_buttonSoundGroup");
		fieldInfo.SetValue(component2, fieldInfo.GetValue(component4));
		FieldInfo fieldInfo2 = AccessTools.Field(typeFromHandle, "instructionPanelProvider");
		fieldInfo2.SetValue(component2, fieldInfo2.GetValue(component4));
		FieldInfo fieldInfo3 = AccessTools.Field(typeFromHandle, "provider");
		fieldInfo3.SetValue(component2, fieldInfo3.GetValue(component4));
		AccessTools.Method(typeFromHandle, "Awake", (Type[])null, (Type[])null).Invoke(component2, null);
		Object.Destroy((Object)(object)((Component)obj).GetComponent<Localize>());
		((Component)obj).GetComponent<TMP_Text>().text = viewName;
		if (activationCheck == null)
		{
			activationCheck = () => true;
		}
		_togglesAndOther[name] = (val, activationCheck);
		val.SetActive(IsRussian && activationCheck());
		UIRootPanel component5 = ((Component)settingsUIPanel.parent.parent).GetComponent<UIRootPanel>();
		if ((Object)(object)component5 != (Object)null)
		{
			FieldInfo fieldInfo4 = AccessTools.Field(typeof(UIRootPanel), "animators");
			Animator[] array = fieldInfo4.GetValue(component5) as Animator[];
			Array.Resize(ref array, array.Length + 1);
			array[^1] = ((Component)child).GetComponent<Animator>();
			fieldInfo4.SetValue(component5, array);
		}
		selectableNavigationProvider.AutoNavigateBindForAll();
		createdCallback?.Invoke(val);
	}

	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;
	}

	private IEnumerator DownloadYandexDiskFile(string targetURL, string checksum = null, Action<byte[]> downloaded = null, Action error = null)
	{
		string text = "https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=" + targetURL;
		UnityWebRequest request = UnityWebRequest.Get(text);
		try
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Посылаем запрос на получение ссылки для скачивания");
			yield return request.SendWebRequest();
			if ((int)request.result == 1)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Пытаемся распарсить результат");
				string targetURL2;
				try
				{
					targetURL2 = ((JToken)JObject.Parse(request.downloadHandler.text)).Value<string>((object)"href");
				}
				catch (Exception ex)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)ex);
					yield break;
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Начинаем скачивание файла");
				yield return DownloadFile(targetURL2, checksum, 5, downloaded, error);
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Не удалось получить ссылку для скачивания файла! (Ошибка: " + request.error + ")"));
			}
		}
		finally
		{
			((IDisposable)request)?.Dispose();
		}
	}

	private IEnumerator DownloadFile(string targetURL, string checksum = null, int maxAttempts = 5, Action<byte[]> downloaded = null, Action error = null)
	{
		if (string.IsNullOrEmpty(targetURL))
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"targetURL в DownloadFile пуст");
			yield break;
		}
		int attempts = 0;
		bool success = false;
		while (!success && attempts < maxAttempts)
		{
			attempts++;
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"Начинаем скачивание файла (попытка {attempts})");
			UnityWebRequest request = UnityWebRequest.Get(targetURL);
			try
			{
				yield return request.SendWebRequest();
				if ((int)request.result == 1)
				{
					byte[] data = request.downloadHandler.data;
					if (string.IsNullOrEmpty(checksum) || VerifyChecksum(data, checksum))
					{
						success = true;
						((BaseUnityPlugin)this).Logger.LogInfo((object)"Файл успешно скачан");
						downloaded?.Invoke(data);
					}
					else
					{
						((BaseUnityPlugin)this).Logger.LogWarning((object)"Контрольная сумма отличается. Пробуем ещё раз...");
					}
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogError((object)("Не удалось скачать файл! (Ошибка: " + request.error + ")"));
					error?.Invoke();
				}
			}
			finally
			{
				((IDisposable)request)?.Dispose();
			}
			if (!success && attempts < maxAttempts)
			{
				yield return (object)new WaitForSeconds(1f);
			}
		}
		if (!success)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"Не удалось скачать файл после {maxAttempts} попыток");
		}
	}

	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();
	}

	private static void UpdateVersionText()
	{
		VersionText val = Object.FindObjectOfType<VersionText>();
		if ((Object)(object)val != (Object)null)
		{
			val.text.text = Instance.GetVersionText();
		}
	}

	private static string ReplaceNames(string input)
	{
		return input;
	}

	private static bool TryGetBossName(string bossObjectName, out string name)
	{
		bool result = true;
		switch (bossObjectName)
		{
		case "Boss_SpearHorseMan":
			name = "Генерал Инчжао";
			break;
		case "Boss_MrX":
			name = "Канхуэй";
			break;
		case "XingTen":
			name = "Син-тянь";
			break;
		case "XingTen_HeadLess":
			name = "Син-тянь";
			break;
		case "Boss_GouMang":
			name = "Гоуман";
			break;
		case "Boss_DaoChang":
			name = "Яньлао";
			break;
		case "Boss_JeiChuan":
			name = Translation.Jiequan.GetFinal(Cases.Nominative);
			break;
		case "Boss_Ji":
			name = "Цзи";
			break;
		case "Boss_FuDie":
			name = "Госпожа Бабочка";
			break;
		case "Boss_YiGung":
			name = "Эйгун";
			break;
		case "Boss_FuXi NuWa":
			name = "Клан Фэн";
			break;
		case "Boss_Skyrending Claw":
			name = "Коготь";
			break;
		default:
			name = "";
			result = false;
			break;
		}
		return result;
	}

	private static bool TryGetLanguageIndex(out int languageIndex)
	{
		languageIndex = -1;
		for (int i = 0; i < LocalizationManager.Sources.Count; i++)
		{
			int num = LocalizationManager.Sources[i].mLanguages.FindIndex((LanguageData x) => x.Code == "ru");
			if (num >= 0)
			{
				languageIndex = num;
				break;
			}
		}
		return languageIndex >= 0;
	}

	private static void UpdateJiGenderTexts()
	{
		if (!TryGetLanguageIndex(out var languageIndex))
		{
			return;
		}
		foreach (KeyValuePair<string, string> jiMaleTranslation in Translation.JiMaleTranslations)
		{
			LocalizationManager.GetTermData(jiMaleTranslation.Key).SetTranslation(languageIndex, jiMaleTranslation.Value, (string)null);
		}
	}

	private static void UpdateAllTexts()
	{
		if (!TryGetLanguageIndex(out var languageIndex))
		{
			return;
		}
		if (Instance._useIngameTranslationConfig.Value && Instance._isVersionWithIngameTranslations)
		{
			foreach (KeyValuePair<string, string> ingameTranslation in Instance._ingameTranslations)
			{
				LocalizationManager.GetTermData(ingameTranslation.Key).SetTranslation(languageIndex, ingameTranslation.Value, (string)null);
			}
		}
		else
		{
			foreach (KeyValuePair<string, string> translation in Translation.Translations)
			{
				TermData termData = LocalizationManager.GetTermData(translation.Key);
				if (termData != null)
				{
					termData.SetTranslation(languageIndex, ReplaceNames(translation.Value), (string)null);
				}
			}
			foreach (KeyValuePair<string, string> jiMaleTranslation in Translation.JiMaleTranslations)
			{
				TermData termData2 = LocalizationManager.GetTermData(jiMaleTranslation.Key);
				if (termData2 != null)
				{
					termData2.SetTranslation(languageIndex, ReplaceNames(jiMaleTranslation.Value), (string)null);
				}
			}
			if (Instance._isOldVersion)
			{
				foreach (KeyValuePair<string, string> oldJinPrice in Translation.OldJinPrices)
				{
					TermData termData3 = LocalizationManager.GetTermData(oldJinPrice.Key);
					if (termData3 != null)
					{
						termData3.SetTranslation(languageIndex, ReplaceNames(oldJinPrice.Value), (string)null);
					}
				}
			}
		}
		LocalizationManager.LocalizeAll(true);
	}

	private static bool TryGetVersionDate(out DateTime result)
	{
		Match match = Regex.Match(ConfigManager.Instance.Version, "Ver\\.(\\d{4})(\\d{2})(\\d{2})");
		result = DateTime.Now;
		if (match.Success && int.TryParse(match.Groups[1].Value, out var result2) && int.TryParse(match.Groups[2].Value, out var result3) && int.TryParse(match.Groups[3].Value, out var result4))
		{
			result = new DateTime(result2, result3, result4);
			return true;
		}
		return false;
	}

	private void OnLoggerLog(object sender, LogEventArgs e)
	{
	}

	private void OnLocalize()
	{
		bool isRussian = IsRussian;
		foreach (KeyValuePair<string, (GameObject, Func<bool>)> item in _togglesAndOther)
		{
			item.Value.Item1.SetActive(isRussian && item.Value.Item2());
		}
	}

	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 (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_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Expected O, but got Unknown
		GameObject val = new GameObject(name);
		val.transform.SetParent(parent, false);
		val.layer = LayerMask.NameToLayer("UI");
		return (val, val.AddComponent<RectTransform>());
	}

	private static (GameObject, RectTransform) CreateToggle(string name, string description, Transform parent, bool defaultValue, Action<bool> valueChangedCallback)
	{
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: 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_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: 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_0174: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b6: 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_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Unknown result type (might be due to invalid IL or missing references)
		(GameObject, RectTransform) tuple = CreateUIElement(name, ((Component)parent).transform);
		GameObject item = tuple.Item1;
		RectTransform item2 = tuple.Item2;
		Toggle val = item.AddComponent<Toggle>();
		((Graphic)item.AddComponent<Image>()).color = Color.clear;
		(GameObject, RectTransform) tuple2 = CreateUIElement("Text", (Transform)(object)item2);
		GameObject item3 = tuple2.Item1;
		RectTransform item4 = tuple2.Item2;
		TextMeshProUGUI obj = item3.AddComponent<TextMeshProUGUI>();
		(GameObject, RectTransform) tuple3 = CreateUIElement("Background", (Transform)(object)item2);
		GameObject item5 = tuple3.Item1;
		RectTransform item6 = tuple3.Item2;
		Image targetGraphic = item5.AddComponent<Image>();
		(GameObject, RectTransform) tuple4 = CreateUIElement("Checkmark", (Transform)(object)item6);
		GameObject item7 = tuple4.Item1;
		RectTransform item8 = tuple4.Item2;
		Image val2 = item7.AddComponent<Image>();
		((Graphic)val2).color = Color.black;
		((TMP_Text)obj).text = description;
		((TMP_Text)obj).fontSize = 26f;
		((TMP_Text)obj).alignment = (TextAlignmentOptions)516;
		((Selectable)val).targetGraphic = (Graphic)(object)targetGraphic;
		val.graphic = (Graphic)(object)val2;
		val.isOn = defaultValue;
		((UnityEvent<bool>)(object)val.onValueChanged).AddListener((UnityAction<bool>)delegate(bool value)
		{
			valueChangedCallback?.Invoke(value);
		});
		item6.anchorMin = new Vector2(1f, 0.5f);
		item6.anchorMax = new Vector2(1f, 0.5f);
		item6.pivot = new Vector2(1f, 0.5f);
		item6.anchoredPosition = new Vector2(-8f, 0f);
		item6.sizeDelta = new Vector2(32f, 32f);
		item8.anchorMin = new Vector2(0.5f, 0.5f);
		item8.anchorMax = new Vector2(0.5f, 0.5f);
		item8.pivot = new Vector2(0.5f, 0.5f);
		item8.anchoredPosition = new Vector2(0f, 0f);
		item8.sizeDelta = new Vector2(20f, 20f);
		item4.anchorMin = new Vector2(0f, 0f);
		item4.anchorMax = new Vector2(1f, 1f);
		item4.pivot = new Vector2(0.5f, 0.5f);
		item4.anchoredPosition = new Vector2(-32f, 0f);
		item4.sizeDelta = new Vector2(-64f, 0f);
		return (item, item2);
	}

	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("RuSols 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 GetPath(Transform tr)
	{
		Transform parent = tr.parent;
		if ((Object)(object)parent == (Object)null)
		{
			return ((Object)tr).name;
		}
		return GetPath(parent) + "/" + ((Object)tr).name;
	}

	private static void OnDonateClicked()
	{
		Application.OpenURL("https://www.donationalerts.com/r/crazyman_ik");
	}

	private static void OnSupportClicked()
	{
		Application.OpenURL("https://forms.yandex.ru/u/6662d53b90fa7b2d16dbfcfb");
	}
}
public class Patches
{
	private static Type _versionTextType;

	private static Type _optionEntryType;

	private static Type _phoneBubbleType;

	private static Type _loadingScreenPanelType;

	private static Type _tutorialUITaskEntryType;

	private static Type _i2LocalizeSpacingOptionPluginType;

	private static FieldInfo _testRopeInitField;

	private static FieldInfo _versionTextTextField;

	private static FieldInfo _loadingScreenPanelIndexField;

	private static FieldInfo _i2LocalizeSpacingOptionPluginOptionEntriesField;

	private static MethodInfo _loadingScreenPanelUpdateViewMethod;

	static Patches()
	{
		_versionTextType = AccessTools.TypeByName("VersionText");
		_optionEntryType = AccessTools.TypeByName("OptionEntry");
		_phoneBubbleType = AccessTools.TypeByName("PhoneBubble");
		_loadingScreenPanelType = AccessTools.TypeByName("LoadingScreenPanel");
		_tutorialUITaskEntryType = AccessTools.TypeByName("TutorialUITaskEntry");
		_i2LocalizeSpacingOptionPluginType = AccessTools.TypeByName("I2LocalizeSpacingOptionPlugin");
		_testRopeInitField = AccessTools.Field(AccessTools.TypeByName("TestRope"), "_init");
		_versionTextTextField = AccessTools.Field(_versionTextType, "text");
		_loadingScreenPanelIndexField = AccessTools.Field(_loadingScreenPanelType, "currentIndex");
		_i2LocalizeSpacingOptionPluginOptionEntriesField = AccessTools.Field(_i2LocalizeSpacingOptionPluginType, "optionEntries");
		_loadingScreenPanelUpdateViewMethod = AccessTools.Method(_loadingScreenPanelType, "UpdateView", (Type[])null, (Type[])null);
	}

	public static void Start_VersionText(Component __instance)
	{
		object? value = _versionTextTextField.GetValue(__instance);
		Text val = (Text)((value is Text) ? value : null);
		if ((Object)(object)val == (Object)null)
		{
			__instance.gameObject.SetActive(false);
			return;
		}
		RuSols.Instance.CurrentGameVersion = val.text;
		val.text = RuSols.Instance.GetVersionText();
	}

	public static void AwakeInit_RCGUIPanel(Component __instance)
	{
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		if (!(((Object)__instance).name == "OptionMenuPanel"))
		{
			return;
		}
		TMP_Text[] componentsInChildren = __instance.GetComponentsInChildren<TMP_Text>(true);
		foreach (TMP_Text val in componentsInChildren)
		{
			if (((Object)val).name == "PauseText")
			{
				RectTransform rectTransform = val.rectTransform;
				rectTransform.sizeDelta += new Vector2(200f, 0f);
				break;
			}
		}
	}

	public static void Awake_UIControlButton(Component __instance)
	{
		if (((object)__instance).GetType().Name != "SaveSlotUIButton")
		{
			return;
		}
		HorizontalLayoutGroup componentInParent = __instance.GetComponentInParent<HorizontalLayoutGroup>();
		((HorizontalOrVerticalLayoutGroup)componentInParent).childScaleWidth = true;
		try
		{
			((Behaviour)((Component)((Component)componentInParent).transform.GetChild(2)).GetComponent<LayoutElement>()).enabled = false;
		}
		catch
		{
		}
		TableLayoutGroup[] componentsInChildren = __instance.GetComponentsInChildren<TableLayoutGroup>(true);
		foreach (TableLayoutGroup val in componentsInChildren)
		{
			if (((Object)val).name == "Grid")
			{
				val.ColumnWidths[0] = 360f;
				val.ColumnWidths[1] = 280f;
				val.FlexibleRowHeight = false;
				((Component)((Component)val).transform.GetChild(0)).GetComponent<TMP_Text>().enableWordWrapping = true;
				break;
			}
		}
	}

	public static void Awake_InputPromptUILabel(Component __instance)
	{
		LayoutElement component = __instance.GetComponent<LayoutElement>();
		Component val = default(Component);
		if ((Object)(object)component != (Object)null && !__instance.TryGetComponent(_tutorialUITaskEntryType, ref val))
		{
			component.preferredWidth = 400f;
		}
	}

	public static void Awake_TutorialUITaskEntry(Component __instance)
	{
		LayoutElement component = __instance.GetComponent<LayoutElement>();
		component.flexibleWidth = 1f;
		component.preferredWidth = -1f;
	}

	public static void Start_I2LocalizeSpacingOptionPlugin(Object __instance)
	{
		IList list = _i2LocalizeSpacingOptionPluginOptionEntriesField.GetValue(__instance) as IList;
		object value = Activator.CreateInstance(_optionEntryType, "Русский");
		list.Add(value);
	}

	public static void Awake_UIManager(Component __instance)
	{
		//IL_002f: 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_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: 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_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: 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_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		Component[] componentsInChildren = __instance.gameObject.GetComponentsInChildren(_phoneBubbleType, true);
		for (int i = 0; i < componentsInChildren.Length; i++)
		{
			Transform transform = componentsInChildren[i].transform;
			Transform obj = ((transform is RectTransform) ? transform : null);
			Transform child = obj.GetChild(0);
			((RectTransform)obj).anchoredPosition = ((RectTransform)obj).anchoredPosition - new Vector2(0f, 20f);
			Transform child2 = child.GetChild(0);
			Transform obj2 = ((child2 is RectTransform) ? child2 : null);
			Transform child3 = obj2.GetChild(0);
			RectTransform val = (RectTransform)(object)((child3 is RectTransform) ? child3 : null);
			((RectTransform)obj2).sizeDelta = ((RectTransform)obj2).sizeDelta + new Vector2(0f, 20f);
			((RectTransform)obj2).anchoredPosition = ((RectTransform)obj2).anchoredPosition + new Vector2(0f, 20f);
			val.sizeDelta += new Vector2(0f, 20f);
			Transform child4 = child.GetChild(1);
			RectTransform val2 = (RectTransform)(object)((child4 is RectTransform) ? child4 : null);
			Transform child5 = child.GetChild(2);
			RectTransform val3 = (RectTransform)(object)((child5 is RectTransform) ? child5 : null);
			Transform child6 = child.GetChild(7);
			Transform obj3 = ((child6 is RectTransform) ? child6 : null);
			val2.anchoredPosition += new Vector2(0f, 20f);
			val3.anchoredPosition += new Vector2(0f, 20f);
			((RectTransform)obj3).anchoredPosition = ((RectTransform)obj3).anchoredPosition + new Vector2(0f, 20f);
		}
	}

	public static void ShowInit_SavePanel(Component __instance)
	{
		Transform obj = __instance.transform.Find("ConfirmPanelProvider/UIOptionPanel/RightPanel");
		RectTransform val = (RectTransform)(object)((obj is RectTransform) ? obj : null);
		if (!((Object)(object)val == (Object)null))
		{
			Transform obj2 = ((Transform)val).Find("OptionPanelBottom");
			RectTransform val2 = (RectTransform)(object)((obj2 is RectTransform) ? obj2 : null);
			if (!((Object)(object)val2 == (Object)null))
			{
				((Component)val).GetComponent<LayoutElement>().minWidth = (RuSols.Instance.IsRussian ? 360 : 180);
				((Component)val2).GetComponent<LayoutElement>().flexibleWidth = 1f;
			}
		}
	}

	public static void ShowInit_UIInteractRootPanel(Component __instance)
	{
		RectTransform val = null;
		Transform transform = __instance.transform;
		for (int i = 0; i < transform.childCount; i++)
		{
			Transform child = transform.GetChild(i);
			if (((Object)child).name.Contains("UIOptionPanel"))
			{
				Transform child2 = child.GetChild(0);
				val = (RectTransform)(object)((child2 is RectTransform) ? child2 : null);
				break;
			}
		}
		if (!((Object)(object)val == (Object)null))
		{
			Transform obj = ((Transform)val).Find("OptionPanelBottom");
			RectTransform val2 = (RectTransform)(object)((obj is RectTransform) ? obj : null);
			if (!((Object)(object)val2 == (Object)null))
			{
				((Component)val).GetComponent<LayoutElement>().minWidth = (RuSols.Instance.IsRussian ? 240 : 180);
				((Component)val2).GetComponent<LayoutElement>().flexibleWidth = 1f;
			}
		}
	}

	public static void EnterLevelAwake_TestRope(Component __instance)
	{
		_testRopeInitField.SetValue(__instance, true);
	}

	public static void AddSource_LocalizationManager(LanguageSourceData Source)
	{
		RuSols.Instance.InitializeData(Source);
	}

	public static void Awake_GameLevel(Component __instance)
	{
		RuSols.Instance.Log("Получаем список интро боссов", (LogLevel)16);
		RuSols.Instance.ReplaceBossNamesIn(__instance.gameObject);
	}

	public static void ShowLoading_LoadingScreenPanel(LoadingScreenPanel __instance)
	{
		_loadingScreenPanelIndexField.SetValue(__instance, Random.Range(0, __instance.CurrentTips.Count));
		_loadingScreenPanelUpdateViewMethod.Invoke(__instance, new object[0]);
	}

	public static bool UpdateText_RCGUITimeDisplay(RCGUITimeDisplay __instance)
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		float valueOfDataType = ((RCGUIBase<float>)(object)__instance).GetValueOfDataType();
		float num = Time.time - valueOfDataType;
		Debug.Log((object)$"Time since last save: {num}");
		int num2 = (int)TimeSpan.FromSeconds(num).TotalMinutes;
		((TMP_Text)__instance.text).text = string.Format("{0} {1} {2}", __instance.prefix, num2, ((object)(LocalizedString)(ref __instance.postfix)).ToString().Replace("{{M}}", GetCorrectWordForm(num2, "минуту", "минуты", "минут")));
		return false;
	}

	public static bool UpdateCurrentNodeView_SkillTreeUI(SkillTreeUI __instance)
	{
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		Debug.Log((object)"UpdateCurrentNodeView");
		SkillCore pluginCore = __instance.currentSkillNodeButton.pluginCore;
		if (pluginCore.IsAcquired)
		{
			__instance.AlreadyActivatePanel.gameObject.SetActive(true);
			__instance.skillPointText.text = "";
			Debug.Log((object)"技能拿到了,隱藏");
		}
		else
		{
			Debug.Log((object)"技能沒拿到了,顯示要多少技能點");
			__instance.AlreadyActivatePanel.gameObject.SetActive(false);
			int acquireCost = pluginCore.AcquireCost;
			if (acquireCost == 0)
			{
				__instance.skillPointText.text = "";
			}
			else if (__instance.skillPointData.ValueInt >= acquireCost)
			{
				__instance.skillPointText.text = LocalizedString.op_Implicit(__instance.skillTextPreText) + " <color=\"green\">" + acquireCost + "</color> " + ((object)(LocalizedString)(ref __instance.skillTextPostText)).ToString().Replace("{{P}}", GetCorrectWordForm(acquireCost, "очко", "очка", "очков"));
			}
			else
			{
				__instance.skillPointText.text = LocalizedString.op_Implicit(__instance.skillTextPreText) + " <color=\"red\">" + acquireCost + "</color> " + ((object)(LocalizedString)(ref __instance.skillTextPostText)).ToString().Replace("{{P}}", GetCorrectWordForm(acquireCost, "очко", "очка", "очков"));
			}
		}
		if ((Object)(object)((RCGUIPanel)__instance).UICompResetGroup == (Object)null)
		{
			Debug.LogError((object)"UICompResetGroup == null", (Object)(object)__instance);
			return false;
		}
		((RCGUIPanel)__instance).UICompResetGroup.UIResetForChildren();
		return false;
	}

	private static string GetCorrectWordForm(int number, string singular, string few, string many)
	{
		if (number % 100 >= 11 && number % 100 <= 19)
		{
			return many;
		}
		switch (number % 10)
		{
		case 1:
			return singular;
		case 2:
		case 3:
		case 4:
			return few;
		default:
			return many;
		}
	}
}
public static class Translation
{
	public static readonly IReadOnlyDictionary<string, List<Name>> NamesTranslations = new Dictionary<string, List<Name>>
	{
		{
			"Yi",
			new List<Name>
			{
				new Name("Йи"),
				new Name("И"),
				new Name("Яи"),
				new Name("Юи")
			}
		},
		{
			"Shuan",
			new List<Name>
			{
				new Name("Сянь-сянь", "Сянь-сяня", "Сянь-сяню", "Сянь-сяня", "Сянь-сянем", "Сянь-сяне"),
				new Name("Сюань-Сюань", "Сюань-Сюаня", "Сюань-Сюаню", "Сюань-Сюаня", "Сюань-Сюанем", "Сюань-Сюане"),
				new Name("Шуаньшуань", "Шуаньшуаня", "Шуаньшуаню", "Шуаньшуаня", "Шуаньшуанем", "Шуаньшуане"),
				new Name("Шуаншуан", "Шуаншуана", "Шуаншуану", "Шуаншуана", "Шуаншуаном", "Шуаншуане")
			}
		},
		{
			"Ruyi",
			new List<Name>
			{
				new Name("Рюйи"),
				new Name("Жу И"),
				new Name("Руи")
			}
		},
		{
			"Fudie",
			new List<Name>
			{
				new Name("Госпожа Бабочка", "Госпожи Бабочки", "Госпоже Бабочке", "Госпожу Бабочку", "Госпожой Бабочкой", "Госпоже Бабочке"),
				new Name("Госпожа Эфирна", "Госпожи Эфирны", "Госпоже Эфирне", "Госпожу Эфирну", "Госпожой Эфирной", "Госпоже Эфирне"),
				new Name("Эфирная Дама", "Эфирной Дамы", "Эфирной Даме", "Эфирную Даму", "Эфирной Дамой", "Эфирной Даме"),
				new Name("Леди Этериал"),
				new Name("Леди Эфирная", "Леди Эфирной", "Леди Эфирной", "Леди Эфирную", "Леди Эфирной", "Леди Эфирной"),
				new Name("Фуде")
			}
		},
		{
			"Jiequan",
			new List<Name>
			{
				new Name("Цзекуань", "Цзекуаня", "Цзекуаню", "Цзекуаня", "Цзекуанем", "Цзекуане"),
				new Name("Цзецюань", "Цзецюаня", "Цзецюаню", "Цзецюаня", "Цзецюанем", "Цзецюане")
			}
		},
		{
			"Lear",
			new List<Name>
			{
				new Name("Лир", "Лира", "Лиру", "Лира", "Лиром", "Лире"),
				new Name("Ли Эр", "Ли Эра", "Ли Эру", "Ли Эра", "Ли Эром", "Ли Эре")
			}
		},
		{
			"Shennong",
			new List<Name>
			{
				new Name("Шэнь-нун", "Шэнь-нуна", "Шэнь-нуну", "Шэнь-нуна", "Шэнь-нуном", "Шэнь-нуне"),
				new Name("Шеннгонг", "Шеннгонга", "Шеннгонгу", "Шеннгонга", "Шеннгонгом", "Шеннгонге")
			}
		},
		{
			"Eigong",
			new List<Name>
			{
				new Name("Эйгун"),
				new Name("И Гун"),
				new Name("Яигон")
			}
		}
	};

	public static Name Lear = NamesTranslations["Lear"][1];

	public static Name Jiequan = NamesTranslations["Jiequan"][1];

	public static string LearN = Lear.GetFinal(Cases.Nominative);

	public static string LearG = Lear.GetFinal(Cases.Genitive);

	public static string LearD = Lear.GetFinal(Cases.Dative);

	public static string LearA = Lear.GetFinal(Cases.Accusative);

	public static string LearI = Lear.GetFinal(Cases.Instrumental);

	public static string LearP = Lear.GetFinal(Cases.Prepositional);

	public static string JiequanN = Jiequan.GetFinal(Cases.Nominative);

	public static string JiequanG = Jiequan.GetFinal(Cases.Genitive);

	public static string JiequanD = Jiequan.GetFinal(Cases.Dative);

	public static string JiequanA = Jiequan.GetFinal(Cases.Accusative);

	public static string JiequanI = Jiequan.GetFinal(Cases.Instrumental);

	public static string JiequanP = Jiequan.GetFinal(Cases.Prepositional);

	public static readonly IReadOnlyDictionary<string, string> Translations = new Dictionary<string, string>
	{
		{ "A0_S4/M0_A0_S4_開頭烤魚Part1_Chat00", "Йи!" },
		{ "A0_S4/M0_A0_S4_開頭烤魚Part1_Chat01", "Как только я учуял этот запах, я сразу понял, что ты здесь." },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat00", "Ты снова втихаря ешь жареную рыбу!" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat01", "..." },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat02", "Разве ты не в предвкушении сегодняшнего ужина?" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat03", "Тётушка по соседству вчера научила меня готовить чесночную лапшу. На этот раз я ничего не испорчу!" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat03_Option1", "Надеюсь в этот раз она будет нормально приправлена." },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat03_Option1_Ans00", "Не волнуйся, я тебя не подведу!" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat03_Option2", "Можешь не готовить мою порцию." },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat03_Option2_Ans00", "Хмф. Думаю, тогда я сам всё съем!" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat04", "Ты прибежал ко мне только для того, чтобы поговорить об ужине?" },
		{ "A0_S4/M1_A0_S4_開頭烤魚Part2_Chat05", "Ах да, цветок!" },
		{ "A0_S4/M2_A0_S4_尋找大紅槿Part1_Chat00", "Хм, я думал что в запретной пещере есть такие, но пока что не увидел ни одного. Где же ты, Алый Гибискус?" },
		{ "A0_S4/M2_A0_S4_尋找大紅槿Part1_Chat01", "Алый Гибискус? Это тот цветок, из-за которого ты так суетишься?" },
		{ "A0_S4/M2_A0_S4_尋找大紅槿Part1_Chat02", "Агась. Это цветок, который они используют для церемонии. По словам Жрицы, чем больше цветок—" },
		{ "A0_S4/M2_A0_S4_尋找大紅槿Part1_Chat03", "Вон там есть один." },
		{ "A0_S4/M3_A0_S4_尋找大紅槿Part2_Chat00", "Ого, ты прав! Но я не уверен, что смогу забраться так высоко." },
		{ "A0_S4/M4_A0_S4_尋找大紅槿Part3_Chat00", "Эй, погоди-ка. А как кабан забрался туда?!" },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat00", "Оу... Он вырвал цветок..." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat01", "Ну что ж. Возможно, ему он нужен больше чем мне." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02", "Эх, скоро стемнеет. Давай вернёмся в деревню. Я поищу в другом месте в следующий раз." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02_Option1", "...Я принесу тебе этот цветок." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02_Option1_Ans00", "А? Да всё в порядке, тебе не нужно..." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02_Option1_Ans01", "Ты действительно собираешься пойти за ним?" },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02_Option2", "Кабан ушёл не слишком далеко." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat02_Option2_Ans00", "Эм, ты собираешься вернуть его ради меня? Кабаны Данкан, знаешь ли, могут бегать очень быстро..." },
		{ "A0_S4/M5_A0_S4_尋找大紅槿Part4_Chat03", "Хорошо, я подожду тебя здесь. Будь осторожен, не поранься!" },
		{ "A0_S4/M6_A0_S4_尋找大紅槿_閒聊1_Chat00", "Этот кабан только что скрылся из виду! Думаешь, ты сможешь его догнать?" },
		{ "A0_S4/M7_A0_S4_尋找大紅槿_閒聊2_Chat00", "Цветок вон на том утёсе. Ты можешь забраться туда по верёвке, но будь осторожен." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat00", "Надеюсь, ты не пострадал. Этот кабан был огромным." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat01", "Не нагружай себя слишком сильно. Всего год назад тебе всё ещё требовалась моя помощь, чтобы ходить, помнишь?" },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat02", "Держи." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat03", "Вау! Ты действительно вернул его мне!" },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat04", "Вблизи он ещё красивее!" },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat05", "Со временем даже самые красивые цветы увядают." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat06", "Ничего страшного. По крайней мере, мы здесь, чтобы увидеть его, пусть и ненадолго." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat07", "Я не очень понимаю, в чём смысл всего этого." },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat08", "Ха, но ты всё равно старался изо всех сил, чтобы помочь мне вернуть его! Спасибо, Йи!" },
		{ "A0_S4/M8_A0_S4_取得大紅槿_Chat09", "Нам нужно возвращаться. У нас будут неприятности, если нас найдут здесь." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat00", "Ух ты, в этот раз на фестивале так много людей!" },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat01", "Смотри, в каждом доме есть сушёное мясо, а кто-то даже делает вино..." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat02", "С тех пор как ты появился, у нас два года подряд были обильные урожаи. Кажется ты стал официальным талисманом удачи в деревне." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat03", "Это просто совпадение." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat04", "О, не говори так! Когда ты помог старейшинам справиться с нашествием крыс, мы все говорили о том, как нам повезло, что ты рядом." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat05", "А ещё хвала Солам за то, что они благословили Деревню Цветущих Персиков и позаботились о том, чтобы все мы были сыты и одеты." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat06", "Если больше ничего не нужно... я бы хотел вернуться к сушке рыбы." },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat07", "Останься ненадолго! Воспользуйся возможностью осмотреть прилавки и пообщаться со всеми!" },
		{ "A0_S1/M9_A0_S1_進入桃花村_Chat08", "Я позабочусь о рыбке! Увидимся позже!" },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble00", "С рассветом вдох, с закатом выдох дня.\nВсе дни прекрасны — истина проста." },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble01", "В последнее время Сянь-сянь просто кипит энергией!" },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble02", "Да, помнится, малыш долго не мог прийти в себя после ухода родителей." },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble03", "Но тот тип, с которым он общается... Он немного странный." },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble04", "Божественные Солы, я смиренно прошу вас прислушаться к моей просьбе..." },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble05", "В прошлом году моя дочь была одной из немногих, кого выбрали." },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble06", "Какое благословение! Интересно, каково это — жить с богами?" },
		{ "A0_S1/M10_A0_S1_桃花村民閒聊_Bubble07", "Уверена, это потрясающе. Жаль, что никто так и не вернулся, чтобы рассказать нам об этом." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat00", "В давние времена, когда наши предки жили в суровой дикой местности, им приходилось терпеть лютые холода и натиск свирепых хищников." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat01", "Не в силах смотреть на страдания людей, десять милосердных Солов спустились с небес." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat02", "Поначалу некоторые невежды подняли свои мечи в сторону Солов. Но этих глупцов постиг божественный гнев, а их кости превратились в пыль." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat03", "Те, кто был благочестив и почтителен, последовали за Солами в страну за пределами Девяносто Девяти Небес, в рай, где каждый мог процветать." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat04", "Всезнающие и всемогущие Солы одарили нас своей мудростью и научили истине всех вещей." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat06", "Когда персики созреют, Солы выберут нескольких из нас для великой привилегии." },
		{ "A0_S1/M11_A0_S1_卜巫太陽神話_Chat07", "И те, кому посчастливилось быть избранным, проживут остаток своей жизни среди божественных Солов." },
		{ "A0_S1/M12_A0_S1_卜巫閒聊泡泡_Bubble00", "Так что ведите себя хорошо, дети. Слушайте, следуйте и верьте, и возможно, однажды вы тоже будете избраны." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat00", "Что? На что, чёрт возьми, ты смотришь? Проваливай!" },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat01", "Я не хочу принимать никакого участия в этом дурацком фестивале." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat01_Option1", "Ты сам то не выглядишь намного умнее." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat01_Option1_Ans00", "Что?! И кем ты себя возомнил, карапуз?!" },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat01_Option2", "Я ничего не говорил." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat01_Option2_Ans00", "Поверь мне, этот взгляд в твоих глазах сказал мне о многом." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat02", "Будь проклята эта чёртова церемония... Когда-нибудь я покажу всем, что на самом деле это..." },
		{ "A0_S1/M13_A0_S1_神農初次見面_Chat03", "*Вздох*, неважно. Ты не поймёшь." },
		{ "A0_S1/M14_A0_S1_神農嫌棄泡泡_Bubble00", "...От всей этой чепухи у меня прокисает вино!" },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat00", "Ты вернулся! Ты увидел что-нибудь интересное?" },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat01", "Я почистил тот Алый Гибискус, который ты мне подарил. Позже я пришью его к своей одежде." },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat02", "Это необязательно, но те, кого выбирают, обычно носят цветы. Так ты выглядишь намного круче!" },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat03", "Стоит ли этому радоваться?" },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat04", "Конечно! Я скоро увижу своих маму и папу." },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat05", "Интересно, заметят ли они, что я стал выше?" },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat06", "..." },
		{ "A0_S1/M15_A0_S1_回到軒軒的家_Chat07", "Давай зайдём внутрь, я проголодался." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat00", "Йи, я ухожу через несколько дней. Ты будешь следить за тем, чтобы правильно питаться, когда останешься один?" },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat01", "Помни, что рис хранится в корзине, а фрукты на столе следует съесть до того, как они испортятся..." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat02", "Перестань волноваться." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat03", "Ха-ха, ну не забывай, ладно? Я, наверное, не смогу отправлять тебе письма, когда буду жить с Солами, знаешь ли." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat04", "Грустно думать, что мне больше не с кем будет поспорить." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat05", "Тебе не страшно?" },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat06", "Я отправляюсь туда, где никогда раньше не был. Конечно мне немного страшно." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat07", "Если ты боишься, то не уходи." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat08", "Я должен. Быть избранным Солами — это благословение." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat09", "Кроме того, у меня всегда было чувство, что однажды... Мне придётся расстаться с тобой, Йи." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat10", "Ничто не предопределено заранее. Ты сам творишь свою судьбу. Не поддавайся суевериям." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat11", "Возможно ты прав, но расставание — это не обязательно плохо." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat12", "Я впервые побежал в запретную пещеру, когда мама с папой ушли. Там я и встретил тебя." },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat13", "Кто бы мог подумать, что игра на флейте заставит кого-то появиться из этого камня?" },
		{ "A0_S5/M16_A0_S5_與軒軒吃晚餐Part1_Chat14", "...Как скажешь." },
		{ "A0_S5/M17_A0_S5_與軒軒吃晚餐Part2_Chat00", "Но... поскольку я скоро ухожу, не мог бы ты выполнить одну мою просьбу до начала церемонии?" },
		{ "A0_S5/M17_A0_S5_與軒軒吃晚餐Part2_Chat01", "Какую?" },
		{ "A0_S5/M17_A0_S5_與軒軒吃晚餐Part2_Chat02", "Та история, которую ты мне рассказывал о человеке, борющемся с наводнением... Расскажи мне, чем она закончилась. Он добрался до дома?" },
		{ "A0_S5/M17_A0_S5_與軒軒吃晚餐Part2_Chat03", "Он ведь не умер, да?" },
		{ "A0_S5/M17_A0_S5_與軒軒吃晚餐Part2_Chat04", "Хорошо..." },
		{ "A0_S5/M18_A0_S5_與軒軒吃晚餐Part3_Chat00", "На чём мы остановились? Он путешествовал через горы и реки..." },
		{ "A0_S2/M19_A0_S2_場景標題祭典當晚_Theater00", "Деревня Цветущих Персиков, ночь проведения церемонии." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat00", "Господин Йи, ваш покорный слуга приветствует вас." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat01", "Я боялся, что вы потеряете счёт времени, и позвонил, чтобы напомнить." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat02", "Если вы пропустите сегодняшний день, то следующей жатвы придётся ждать ещё два года." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat03", "Я знаю." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat04", "Как обстоят дела с охраной в Комплексе Обработки Приматов?" },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat05", "Система показывает, что в настоящее время действует состояние низкой боевой готовности. Патрулирует всего несколько стражей." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat06", "Прошу простить меня за беспокойство, но если сработает сигнализация, ситуация может выйти из под контроля." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat07", "Кстати, ваша <color=#ff5959>Мистическая Нимфа</color> находится с вами?" },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat08", "Она у меня с собой... но она не летает. Только некоторые её части находятся в рабочем состоянии." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat09", "Прошло слишком много времени с тех пор, как я её перезаряжал." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat10", "Жаль. Если бы у неё было достаточно энергии, вы могли бы использовать Режим Разведки <color=#ff5959>Мистической Нимфы</color>." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat11", "В конце концов, ваш организм только недавно полностью восстановился, так что, возможно, лучше не пренебрегать осторожностью." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat12", "Не составит труда просто оставить за собой кровавое месиво." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat13", "Безусловно. Ваш покорный слуга никогда не сомневался в вашем воинском мастерстве, Господин Йи." },
		{ "A0_S2/M20_A0_S2_AI來電提醒羿出發_Chat14", "Действуйте по вашему усмотрению, и пусть удача будет к вам благосклонна." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat00", "Эй, урод!" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat01", "Наконец-то ты показал своё истинное лицо, да? Я видел всё, что ты сделал." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat01_Option1", "Тебе просто мерещится всякое." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat01_Option2", "Я просто разговаривал сам с собой." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat02", "Ты думаешь, что сможешь одурачить меня этой дурацкой шляпой? Ты что, принимаешь меня за одного из этих придурков?" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat03", "Когда кто-то разговаривает сам с собой, разве он не обращается к тем, кто наблюдает за ним?" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat04", "Наблюдает?" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat05", "Не думай, что я не заметил. Я видел, как эти причудливые статуи светились посреди ночи." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat06", "А всякий раз, когда я накрываю их тканью, таинственный ветер сдувает её прочь!" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat07", "Я с самого начала знал правду: эти статуи одержимы демонами!" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat08", "Демонов не существует. Это всего лишь заблуждения глупцов." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat09", "Демоны на свободе и точка! А ещё они едят людей!" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat10", "Это место — не рай, здесь нет богов, и я не знаю, кто придумал всю эту чушь." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat11", "Признайся. Ты, наверное, кое-что знаешь обо всём этом!" },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat12", "..." },
		{ "A0_S2/M21_A0_S2_神農發現破綻_Chat13", "Хмф. Ладно, храни свои секреты. Когда-нибудь я докажу свою правоту прямо у всех на глазах." },
		{ "A0_S2/M22_A0_S2_神農閒聊二_Bubble00", "Больше не беспокой меня." },
		{ "A0_S2/M23_A0_S2_村民祭典閒聊_Bubble00", "Ух ты! Петарды!" },
		{ "A0_S2/M23_A0_S2_村民祭典閒聊_Bubble01", "У Шэнь-нуна активное воображение. Одиночество сделало его немного сумасшедшим..." },
		{ "A0_S2/M23_A0_S2_村民祭典閒聊_Bubble02", "Те, кто будет избран, смогут жить с богами!" },
		{ "A0_S2/M23_A0_S2_村民祭典閒聊_Bubble03", "Персиковые деревья в этом году расцвели просто великолепно! Спасибо богам за то, что они благословили нашу Деревню Цветущих Персиков." },
		{ "A0_S3/M24_A0_S3_祭典卜巫禱詞_Bubble00", "Жрица Деревни Цветущих Персиков принимает ваш указ!" },
		{ "A0_S3/M24_A0_S3_祭典卜巫禱詞_Bubble01", "В соответствии с приказами Солов, мы смиренно отдаём дань уважения Летающему Трону." },
		{ "A0_S3/M25_A0_S3_軒軒告別_Manga00", "Спасибо тебе за то, что заботился обо мне последние два года, Йи." },
		{ "A0_S3/M25_A0_S3_軒軒告別_Manga01", "Мне пора уходить!" },
		{ "A0_S3/M25_A0_S3_軒軒告別_Manga02", "Ваа!" },
		{ "A0_S3/M26_A0_S3_卜巫驚恐_Chat00", "О боги... Избавьте нас от своего гнева!" },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat00", "Ч-что происходит? Йи...?" },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat00_Option1", "Йи, которого ты знаешь — это ложь." },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat00_Option1_Ans00", "Ложь...? Но ты — единственный кто у меня остался..." },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat00_Option2", "Мне нужно идти. Береги себя." },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat00_Option2_Ans00", "Что ты хочешь этим сказать? Тогда кто ты?" },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat01", "Подожди! Я не понимаю!" },
		{ "A0_S3/M27_A0_S3_羿離開桃花村_Chat02", "Что это было? Почему ты..." },
		{ "A0_S3/M28_A0_S3_羿離開桃花村_Bubble00", "Подожди, куда ты идёшь? Йи!" },
		{ "A1_S1/M29_A1_S1_螢幕警報訊息_Bubble00", "<i>Внимание! Обнаружена необычная активность в зоне животноводства.\nВнимание! Обнаружена необычная активность в зоне животноводства.\nВнимание—</i>" },
		{ "A1_S1/M29_A1_S1_螢幕警報訊息_Bubble01", "<i>Внимание! Примат прорвал ограждение.\nВнимание! Примат прорвал ограждение.</i>" },
		{ "A1_S1/M29_A1_S1_螢幕警報訊息_Bubble02", "<i>Обнаружено незаконное нарушение периметра солариан.</i>" },
		{ "A1_S1/M29_A1_S1_螢幕警報訊息_Bubble03", "<i>Комбайн повреждён. Инициировано отключение и починка системы.</i>" },
		{ "A1_S1/M29_A1_S1_螢幕警報訊息_Bubble04", "<i>Обнаружено нарушение периметра живым организмом.\nОбнаружено нарушение периметра живым организмом.</i>" },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat00", "Ваше благородие, дела плохи." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat01", "Ваше недавнее уничтожение комбайна, вызвало общесистемную тревогу." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat02", "Что ещё хуже, девять Солов могут пробудиться раньше времени..." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat03", "Неважно. Рано или поздно мои действия должны были привлечь внимание." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat04", "Я приготовился к худшему." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat05", "Допустим, что это правда..." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat06", "...почему-же тогда вы вмешались так рано? Это не входило в наши планы." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat07", "Это ради детёныша приматов?" },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat09", "Не сомневайся в моих действия. Просто делай свою работу." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat10", "Конечно. Прошу простить мои опасения. Просто все наши расчёты были выброшены в мусорное ведро." },
		{ "A1_S1/M30_A1_S1_AI來電九王甦醒_Chat11", "В любом случае, пожалуйста, как можно быстрее доберитесь до запланированной безопасной зоны. И прежде всего соблюдайте осторожность." },
		{ "NPC_Lear/M31_AG_Lear_S0_格檔教學殘影一_Bubble00", "Использование тела как среды для рассеивания энергии... Это действительно может сработать?" },
		{ "NPC_Lear/M31_AG_Lear_S0_格檔教學殘影一_Bubble01", "Возможно, её нужно направить! Просто позволь энергии прийти и влиться в своё тело." },
		{ "NPC_Lear/M32_AG_Lear_S0_格檔教學殘影二_Bubble00", "Затем используй талисман, чтобы влить Ци в свою цель. Побеждай медленно и уверенно." },
		{ "NPC_Lear/M32_AG_Lear_S0_格檔教學殘影二_Bubble01", "Хм... Кажется, я что-то упускаю..." },
		{ "NPC_Lear/M33_AG_Lear_S0_格檔教學驗收_Bubble00", "Точно! Дело не только в том, чтобы всё сделать правильно, но и в том, чтобы выбрать нужное время!" },
		{ "NPC_Lear/M34_AG_Lear_S0_格檔教學驗收完成_Bubble00", "Стань текучей водой и позволь неподвижности преодолеть движение. Великолепно!" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat00", "А, это ты. Мы снова встретились, собрат-ученик." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat01", "Я тебя не знаю..." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat02", "Хотя ты кажешься мне знакомым..." },
		{
			"NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat03",
			LearN + "? Невозможно..."
		},
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat04", "Наши судьбы были переплетены задолго до того, как кто-либо из нас осознал это." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat05", "...Где я?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat06", "Беспредельное Пространство." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07", "...Место, где силы неба и земли пересекаются с пространством-временем и сознанием." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07_Option1", "Ты ненастоящий. Это всего лишь иллюзия." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07_Option1_Ans00", "Что можно считать реальным среди этого многообразия? А что можно считать ложным?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07_Option2", "Я не понимаю ни слова из\nтого, что ты говоришь." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07_Option2_Ans00", "Один спрашивает, а другой отвечает, но ни один из них не может знать наверняка." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat07_Option2_Ans01", "Разве это не чудесно?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat08", "..." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat09", "Ты создал всё это?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat10", "Этот скромный даос не обладает подобным мастерством, хоть и изучает Фусан уже множество лет..." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat11", "Перед лицом его многочисленных сокровенных техник, я всё ещё понимаю лишь половину." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat12", "Ты не знаешь, как покинуть это место?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat13", "В этом нет ничего сложного. Осознай, что является естественным, и просто действуй в соответствии со своими мыслями." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat14", "Однако я прошу тебя уделить мне немного времени. Ты протянул мне руку помощи много лет назад, поэтому я не должен прерывать наш цикл Дао." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat15", "Я сказал, что не знаю тебя..." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat16", "Этот рог позволяет пользователю входить в резонанс с Фусаном, что даёт возможность путешествовать между центральным и внешним узлами." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat17", "Эта штука вернёт меня обратно в Павильон Четырёх Сезонов?" },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat18", "Я никогда не думал, что у узлов есть такая функция. Если это действительно сработает, это сэкономит мне много времени." },
		{ "NPC_Lear/M43_AG_Lear_S1_李耳初次見面_Chat19", "Ха, этот рог бесполезен для обычных людей. Но не для тебя. Так что прими его." },
		{ "NPC_Lear/M44_AG_Lear_S1_李耳初次見面後_Bubble00", "Все пути в конце концов сходятся. Мы ещё встретимся." },
		{ "NPC_Lear/M47_AG_Lear_S2_太極踢教學殘影一_Bubble00", "Что я делаю...? Я не пытаюсь танцевать..." },
		{ "NPC_Lear/M47_AG_Lear_S2_太極踢教學殘影一_Bubble01", "Я назову это Пинком Тай-чи! Но, может быть, \nещё слишком рано давать ему название?" },
		{ "NPC_Lear/M48_AG_Lear_S2_太極踢教學殘影二_Bubble00", "Фокус не в том, чтобы предсказать, а в том, чтобы разоблачить. Твоя реакция так же важна, как и выбор времени." },
		{ "NPC_Lear/M48_AG_Lear_S2_太極踢教學殘影二_Bubble01", "Исполь