Decompiled source of RU MichikoTranslateMod v0.1.4

QuickRestartLocalization.dll

Decompiled 3 days ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using On.RoR2.UI;
using RoR2.UI;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("QuickRestartLocalization")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("QuickRestartLocalization")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b45a13b7-0b87-4807-b4d1-83a2d57c31bd")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("com.michiko.QuickRestartLocalization", "QuickRestart Localization", "1.0.0")]
public class QuickRestartLocalization : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_Awake <>9__0_0;

		internal void <Awake>b__0_0(orig_Awake orig, PauseScreenController self)
		{
			orig.Invoke(self);
			TMP_Text[] componentsInChildren = ((Component)self).GetComponentsInChildren<TMP_Text>(true);
			TMP_Text[] array = componentsInChildren;
			foreach (TMP_Text val in array)
			{
				if (val.text == "Restart")
				{
					val.text = "Перезапуск";
				}
				else if (val.text == "Character Select")
				{
					val.text = "Выбор персонажа";
				}
			}
		}
	}

	public void Awake()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Expected O, but got Unknown
		object obj = <>c.<>9__0_0;
		if (obj == null)
		{
			hook_Awake val = delegate(orig_Awake orig, PauseScreenController self)
			{
				orig.Invoke(self);
				TMP_Text[] componentsInChildren = ((Component)self).GetComponentsInChildren<TMP_Text>(true);
				TMP_Text[] array = componentsInChildren;
				foreach (TMP_Text val2 in array)
				{
					if (val2.text == "Restart")
					{
						val2.text = "Перезапуск";
					}
					else if (val2.text == "Character Select")
					{
						val2.text = "Выбор персонажа";
					}
				}
			};
			<>c.<>9__0_0 = val;
			obj = (object)val;
		}
		PauseScreenController.Awake += (hook_Awake)obj;
	}
}

TranslateRU.dll

Decompiled 3 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using AerosSkills;
using Aetherium.Equipment;
using Aetherium.Equipment.EliteEquipment;
using Aetherium.Items.Tier1;
using Aetherium.Items.Tier2;
using Aetherium.Items.Tier3;
using Aetherium.Items.TierLunar;
using Aetherium.Utils;
using ArsonistMod.Modules;
using ArtificerExtended;
using ArtificerExtended.Modules;
using ArtificerExtended.Passive;
using ArtificerExtended.Skills;
using ArtificerExtended.States;
using ArtificerExtended.Unlocks;
using BansheeMod.BansheeCharacter.Content;
using BansheeMod.Modules;
using Bastian;
using Bastian.Modules;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using Deputy.Components;
using FeedbackSunnyDifficulty;
using HouseMod.SkillStates.House;
using HouseMod.SkillStates.House.Cards;
using HouseMod.SkillStates.House.Shots;
using HouseMod.SkillStates.House.TheGame;
using HunkMod.Modules;
using InterrogatorMod.Interrogator.Content;
using InterrogatorMod.Modules;
using JinxMod.Controllers;
using JinxMod.SkillStates;
using KatarinaMod.Modules;
using LeeHyperrealMod.Modules;
using M4A1Mod.Modules;
using M4A1Mod.Survivors.M4A1.Constants;
using M4A1Mod.Survivors.M4A1.Constants.DummyLink;
using M4A1Mod.Survivors.M4A1.Constants.Grenades;
using MegamanXMod.Survivors.X;
using Microsoft.CodeAnalysis;
using Morris.Components;
using Morris.Modules;
using MystMod;
using MystMod.SkillStates.Myst.Finishers;
using MystMod.SkillStates.Myst.Limits;
using MystMod.SkillStates.Myst.Spells;
using OfficialScoutMod.Modules;
using OfficialScoutMod.Scout.Content;
using On.RoR2;
using On.RoR2.Skills;
using PassiveAgression.Engineer;
using PassiveAgression.ModCompat;
using Pathfinder.Modules;
using R2API;
using RoR2;
using RoR2.Skills;
using RobDriver.Modules;
using RobDriver.SkillStates.Driver;
using RobDriver.SkillStates.Driver.ArmBFG;
using RobDriver.SkillStates.Driver.ArmCannon;
using RobDriver.SkillStates.Driver.ArtiGauntlet;
using RobDriver.SkillStates.Driver.BadassShotgun;
using RobDriver.SkillStates.Driver.Bazooka;
using RobDriver.SkillStates.Driver.BeetleShield;
using RobDriver.SkillStates.Driver.CaptainGun;
using RobDriver.SkillStates.Driver.FalsePistol;
using RobDriver.SkillStates.Driver.GoldenGun;
using RobDriver.SkillStates.Driver.GrenadeLauncher;
using RobDriver.SkillStates.Driver.HeavyMachineGun;
using RobDriver.SkillStates.Driver.LunarGrenade;
using RobDriver.SkillStates.Driver.LunarHammer;
using RobDriver.SkillStates.Driver.LunarPistol;
using RobDriver.SkillStates.Driver.LunarRifle;
using RobDriver.SkillStates.Driver.MachineGun;
using RobDriver.SkillStates.Driver.NemmandoGun;
using RobDriver.SkillStates.Driver.NemmandoSword;
using RobDriver.SkillStates.Driver.NemmercGun;
using RobDriver.SkillStates.Driver.PlasmaCannon;
using RobDriver.SkillStates.Driver.PyriteGun;
using RobDriver.SkillStates.Driver.RavSword;
using RobDriver.SkillStates.Driver.Revolver;
using RobDriver.SkillStates.Driver.RiotShotgun;
using RobDriver.SkillStates.Driver.RocketLauncher;
using RobDriver.SkillStates.Driver.SMG;
using RobDriver.SkillStates.Driver.Shotgun;
using RobDriver.SkillStates.Driver.SlugShotgun;
using RobDriver.SkillStates.Driver.SniperRifle;
using RobDriver.SkillStates.Driver.VoidPistol;
using RobDriver.SkillStates.Driver.VoidRifle;
using Sandswept;
using Sandswept.DoTs;
using Sandswept.Equipment.Lunar;
using Sandswept.Equipment.Standard;
using Sandswept.Interactables.Regular;
using Sandswept.Items.Greens;
using Sandswept.Items.Lunars;
using Sandswept.Items.Reds;
using Sandswept.Items.VoidGreens;
using Sandswept.Items.Whites;
using Sandswept.Survivors.Ranger;
using Sandswept.Survivors.Ranger.Projectiles;
using Sandswept.Utils;
using SeamstressMod.Modules;
using SeamstressMod.Seamstress.Content;
using SkillStates.Ghoul;
using SkillStates.Morris;
using SkillStates.SharedStates;
using Skillstates.Deputy;
using SpyMod.Modules;
using SpyMod.Spy.Content;
using SubmarinerMod.SubmarinerCharacter.Content;
using TPDespair.ZetArtifacts;
using TanksMod.Modules;
using TanksMod.Modules.Components;
using TanksMod.Modules.Components.User;
using TanksMod.Modules.Components.User.CustomPerks;
using TranslateRU.KeywordTranslations;
using TranslateRU.ModTranslations;
using UnforgivenMod.Modules;
using UnforgivenMod.Unforgiven.Content;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("TranslateRU")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TranslateRU")]
[assembly: AssemblyTitle("TranslateRU")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public static class KeywordTranslationsBanshee
{
	public static Dictionary<string, (string token, Func<string> translationGetter)> KeywordReplacements;

	public static void Init()
	{
		KeywordReplacements = new Dictionary<string, (string, Func<string>)>
		{
			["<style=cKeywordName>Aerodynamic</style>" + "<style=cSub>The skill deals more damage the longer the distance traveled before impact.</style>"] = ("KENKO_AERODYNAMIC_SKILLDEF", () => "<style=cKeywordName>Аэродинамика</style><style=cSub>Наносит увеличенный урон в зависимости от расстояния, пройденного до столкновения.</style>"),
			["<style=cKeywordName>Omen</style>" + $"<style=cSub>This skill fires an <color=#ba8fff>Ethereal Wisp</color> when completed which deals <style=cIsDamage>{BansheeConfig.wispDamageCoefficient.Value * 100f}% damage</style> on hit and restores <style=cIsUtility>1</style> stock to your secondary skill.</style>"] = ("KENKO_OMEN_SKILLDEF", delegate
			{
				float num = BansheeConfig.wispDamageCoefficient.Value * 100f;
				return $"<style=cKeywordName>Знамение</style><style=cSub>По завершении навык выпускает <color=#ba8fff>эфирную душу</color>, которая наносит <style=cIsDamage>{num:0.#}% урона</style> при попадании и восстанавливает <style=cIsUtility>1</style> заряд вторичного навыка.</style>";
			})
		};
	}
}
namespace TranslateRU
{
	[BepInPlugin("MichikoTeam.TranslateRU", "TranslateRU", "0.1.3")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Main : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_SetSurvivorDefs <>9__5_1;

			internal void <Awake>b__5_1(orig_SetSurvivorDefs orig, SurvivorDef[] defs)
			{
				orig.Invoke(defs);
				foreach (SurvivorDef val in defs)
				{
					if (val.cachedName == "Electrician")
					{
						val.descriptionToken = "SANDSWEPT_ELECTRICIAN_DESC_RU";
						val.outroFlavorToken = "SANDSWEPT_ELECTRICIAN_OUTRO_RU";
						val.mainEndingEscapeFailureFlavorToken = "SANDSWEPT_ELECTRICIAN_FAIL_RU";
					}
					if (val.cachedName == "Ranger")
					{
						Ranger.mileZeroDef.nameToken = "SANDSWEPT_RANGER_SKIN_MILEZERO";
						Ranger.majorDef.nameToken = "SANDSWEPT_RANGER_SKIN_MAJOR";
						Ranger.renegadeDef.nameToken = "SANDSWEPT_RANGER_SKIN_RENEGADE";
					}
					Main.SandsweptExpansionDef.descriptionToken = "SANDSWEPT_EXPANSION_DESC";
				}
			}
		}

		public const string PluginGUID = "MichikoTeam.TranslateRU";

		public const string PluginAuthor = "MichikoTeam";

		public const string PluginName = "TranslateRU";

		public const string PluginVersion = "0.1.3";

		public static ManualLogSource ModLogger;

		public void Awake()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			ModLogger = ((BaseUnityPlugin)this).Logger;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Мод перевода запущен");
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
			{
				foreach (var item in TranslationRegistry.Registered)
				{
					var (key, text, action, _) = item;
					if (!item.requiresEarlyLoad && Chainloader.PluginInfos.ContainsKey(key))
					{
						((BaseUnityPlugin)this).Logger.LogInfo((object)("Загрузка обычного перевода: " + text));
						try
						{
							action();
							((BaseUnityPlugin)this).Logger.LogInfo((object)("Перевод загружен: " + text));
						}
						catch (Exception arg)
						{
							((BaseUnityPlugin)this).Logger.LogError((object)$"Ошибка при загрузке перевода {text}: {arg}");
						}
					}
				}
			});
			GameObject val = new GameObject("TranslationAwakeRunner");
			val.AddComponent<TranslationAwakeRunner>();
			Object.DontDestroyOnLoad((Object)val);
			if (Chainloader.PluginInfos.ContainsKey("com.TeamSandswept.Sandswept"))
			{
				object obj = <>c.<>9__5_1;
				if (obj == null)
				{
					hook_SetSurvivorDefs val2 = delegate(orig_SetSurvivorDefs orig, SurvivorDef[] defs)
					{
						orig.Invoke(defs);
						foreach (SurvivorDef val3 in defs)
						{
							if (val3.cachedName == "Electrician")
							{
								val3.descriptionToken = "SANDSWEPT_ELECTRICIAN_DESC_RU";
								val3.outroFlavorToken = "SANDSWEPT_ELECTRICIAN_OUTRO_RU";
								val3.mainEndingEscapeFailureFlavorToken = "SANDSWEPT_ELECTRICIAN_FAIL_RU";
							}
							if (val3.cachedName == "Ranger")
							{
								Ranger.mileZeroDef.nameToken = "SANDSWEPT_RANGER_SKIN_MILEZERO";
								Ranger.majorDef.nameToken = "SANDSWEPT_RANGER_SKIN_MAJOR";
								Ranger.renegadeDef.nameToken = "SANDSWEPT_RANGER_SKIN_RENEGADE";
							}
							Main.SandsweptExpansionDef.descriptionToken = "SANDSWEPT_EXPANSION_DESC";
						}
					};
					<>c.<>9__5_1 = val2;
					obj = (object)val2;
				}
				SurvivorCatalog.SetSurvivorDefs += (hook_SetSurvivorDefs)obj;
			}
			SkillCatalog.Init += new hook_Init(ChangeSkillDef);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Перехват SkillCatalog.Init зарегистрирован");
		}

		private void ChangeSkillDef(orig_Init orig)
		{
			orig.Invoke();
			bool flag = Chainloader.PluginInfos.ContainsKey("com.kenko.Seamstress");
			bool flag2 = Chainloader.PluginInfos.ContainsKey("com.kenko.Banshee");
			bool flag3 = Chainloader.PluginInfos.ContainsKey("com.kenko.Spy");
			bool flag4 = Chainloader.PluginInfos.ContainsKey("com.kenko.Scout");
			bool flag5 = Chainloader.PluginInfos.ContainsKey("com.kenko.Submariner");
			bool flag6 = Chainloader.PluginInfos.ContainsKey("com.kenko.Unforgiven");
			bool flag7 = Chainloader.PluginInfos.ContainsKey("com.kenko.Interrogator");
			if (flag)
			{
				KeywordTranslationsSeamstress.Init();
			}
			if (flag2)
			{
				KeywordTranslationsBanshee.Init();
			}
			if (flag3)
			{
				KeywordTranslationsSpy.Init();
			}
			if (flag4)
			{
				KeywordTranslationsScout.Init();
			}
			if (flag5)
			{
				KeywordTranslationsSubmariner.Init();
			}
			if (flag6)
			{
				KeywordTranslationsWanderer.Init();
			}
			if (flag7)
			{
				KeywordTranslationsInterrogator.Init();
			}
			foreach (SkillDef allSkillDef in SkillCatalog.allSkillDefs)
			{
				if (allSkillDef.keywordTokens == null)
				{
					continue;
				}
				for (int i = 0; i < allSkillDef.keywordTokens.Length; i++)
				{
					string text = allSkillDef.keywordTokens[i];
					if (flag && KeywordTranslationsSeamstress.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value))
					{
						LanguageAPI.Add(value.Item1, text);
						LanguageAPI.Add(value.Item1, value.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value.Item1;
					}
					if (flag2 && KeywordTranslationsBanshee.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value2))
					{
						LanguageAPI.Add(value2.Item1, text);
						LanguageAPI.Add(value2.Item1, value2.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value2.Item1;
					}
					if (flag3 && KeywordTranslationsSpy.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value3))
					{
						LanguageAPI.Add(value3.Item1, text);
						LanguageAPI.Add(value3.Item1, value3.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value3.Item1;
					}
					if (flag4 && KeywordTranslationsScout.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value4))
					{
						LanguageAPI.Add(value4.Item1, text);
						LanguageAPI.Add(value4.Item1, value4.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value4.Item1;
					}
					if (flag5 && KeywordTranslationsSubmariner.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value5))
					{
						LanguageAPI.Add(value5.Item1, text);
						LanguageAPI.Add(value5.Item1, value5.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value5.Item1;
					}
					if (flag6 && KeywordTranslationsWanderer.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value6))
					{
						LanguageAPI.Add(value6.Item1, text);
						LanguageAPI.Add(value6.Item1, value6.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value6.Item1;
					}
					if (flag7 && KeywordTranslationsInterrogator.KeywordReplacements.TryGetValue(text, out (string, Func<string>) value7))
					{
						LanguageAPI.Add(value7.Item1, text);
						LanguageAPI.Add(value7.Item1, value7.Item2(), "RU");
						allSkillDef.keywordTokens[i] = value7.Item1;
					}
				}
			}
		}
	}
	public class TranslationAwakeRunner : MonoBehaviour
	{
		public void Awake()
		{
			Main.ModLogger.LogInfo((object)"TranslationAwakeRunner: Awake запущен");
			foreach (var item in TranslationRegistry.Registered)
			{
				var (key, text, action, _) = item;
				if (item.requiresEarlyLoad && Chainloader.PluginInfos.ContainsKey(key))
				{
					Main.ModLogger.LogInfo((object)("[Awake] Загрузка раннего перевода: " + text));
					try
					{
						action();
						Main.ModLogger.LogInfo((object)("[Awake] Перевод загружен: " + text));
					}
					catch (Exception arg)
					{
						Main.ModLogger.LogError((object)$"[Awake] Ошибка при загрузке перевода {text}: {arg}");
					}
				}
			}
		}
	}
	public static class TranslationLoader
	{
		private static readonly ManualLogSource logger = Logger.CreateLogSource("TranslationLoader");

		private static readonly Regex jsonLineRegex = new Regex("^\\s*\"(?<key>[^\"]+)\"\\s*:\\s*\"(?<value>.*)\"\\s*,?\\s*$");

		public static void LoadFromFile(string fileName)
		{
			string text = Path.Combine(Paths.PluginPath, "MichikoTeam-RU_MichikoTranslateMod", "mods", fileName);
			if (!File.Exists(text))
			{
				logger.LogWarning((object)("Файл перевода не найден: " + text));
				return;
			}
			string[] array = File.ReadAllLines(text);
			for (int i = 0; i < array.Length; i++)
			{
				string text2 = array[i].Trim();
				if (string.IsNullOrWhiteSpace(text2) || text2.StartsWith("#"))
				{
					continue;
				}
				Match match = jsonLineRegex.Match(text2);
				if (match.Success)
				{
					string text3 = match.Groups["key"].Value.Trim();
					string text4 = match.Groups["value"].Value.Trim().Replace("\\n", "\n");
					try
					{
						LanguageAPI.Add(text3, text4, "RU");
					}
					catch (Exception ex)
					{
						logger.LogError((object)("Ошибка при добавлении токена " + text3 + ": " + ex.Message));
					}
				}
			}
			logger.LogInfo((object)("Перевод загружен из " + fileName));
		}
	}
	public static class TranslationRegistry
	{
		public static readonly List<(string guid, string name, Action applyMethod, bool requiresEarlyLoad)> Registered = new List<(string, string, Action, bool)>
		{
			Create("com.rob.Driver", "Driver", new DriverTranslation().ApplyDriverTranslation),
			Create("com.ThinkInvisible.TinkersSatchel", "TinkersSatchel", new TinkersSatchelTranslation().ApplyTinkersTranslation, early: true),
			Create("com.Lemonlust.Sett", "Sett", new SettTranslation().ApplySettTranslation),
			Create("com.rob.Hunk", "Hunk", new HunkTranslation().ApplyHunkTranslation),
			Create("com.kenko.Scout", "Scout", new ScoutTranslation().ApplyScoutTranslation),
			Create("com.Lemonlust.JinxMod", "Jinx", new JinxTranslation().ApplyJinxTranslation),
			Create("com.Bog.Morris", "Mortician", new MorrisTranslation().ApplyMorticianTranslation),
			Create("com.Dragonyck.Tracer", "Tracer", new TracerTranslation().ApplyTracerTranslation),
			Create("com.Bog.Pathfinder", "Pathfinder", new PathfinderTranslation().ApplyPathfinderTranslation),
			Create("com.PopcornFactory.Arsonist", "Arsonist", new ArsonistTranslation().ApplyArsonistTranslation),
			Create("com.nayDPz.Dancer", "Dancer", new DancerTranslation().ApplyDancerTranslation),
			Create("com.Lemonlust.KatarinaMod", "KatarinaMod", new KatarinaTranslation().ApplyKatarinaTranslation),
			Create("com.KomradeSpectre.Aetherium", "Aetherium", new AetheriumTranslation().ApplyAetheriumTranslation),
			Create("xyz.yekoc.PassiveAgression", "Passive Agression", new PassiveAgressionTranslation().ApplyPassiveAgressionTranslation),
			Create("com.kenko.Submariner", "Submariner", new SubmarinerTranslation().ApplySubmarinerTranslation),
			Create("com.TeamSillyGuy.Bastian", "Bastian", new BastianTranslation().ApplyBastianTranslation),
			Create("com.Bog.Deputy", "Deputy", new DeputyTranslation().ApplyDeputyTranslation),
			Create("com.TeamSandswept.Sandswept", "Sandswept", new SandsweptTranslation().ApplySandsweptTranslation),
			Create("com.Snoresville.M4A1", "M4A1", new M4A1Translation().ApplyM4A1Translation),
			Create("com.JavAngle.MystMod", "Myst", new MystTranslation().ApplyMystTranslation),
			Create("com.JavAngle.HouseMod", "House", new HouseTranslation().ApplyHouseTranslation),
			Create("com.kenko.Banshee", "Banshee", new BansheeTranslation().ApplyBansheeTranslation),
			Create("com.kenko.Spy", "Spy", new SpyTranslation().ApplySpyTranslation),
			Create("com.kenko.Seamstress", "Seamstress", new SeamstressTranslation().ApplySeamstressTranslation),
			Create("com.kenko.Interrogator", "Interrogator", new InterrogatorTranslation().ApplyInterrogatorTranslation),
			Create("com.kenko.Unforgiven", "Unforgiven", new UnforgivenTranslation().ApplyUnforgivenTranslation),
			Create("com.firewaze.FeedbackSunnyDifficulty", "MoreDifficulties", new MoreDifficultiesTranslation().ApplyMoreDifficultiesTranslation),
			Create("com.TPDespair.ZetArtifacts", "ZetArtifacts", new ZetArtifactsTranslation().ApplyZetArtifactsTranslation),
			Create("Icarus", "BanditsPrimaryRevolver", new BanditsPrimaryRevolverTranslation().ApplyBanditsPrimaryRevolverTranslation),
			Create("com.rob.Belmont", "Belmont", new BelmontTranslation().ApplyBelmontTranslation),
			Create("com.rob.Dante", "Dante", new DanteTranslation().ApplyDanteTranslation),
			Create("com.Zenithrium.vanillaVoid", "VanillaVoid", new VanillaVoidTranslation().ApplyVanillaVoidTranslation),
			Create("com.BLKNeko.MegamanXMod", "MegamanXMod", new MegamanXModTranslation().ApplyMegamanXModTranslation),
			Create("com.PopcornFactory.LeeHyperrealMod", "LeeHyperreal", new LeeHyperrealTranslation().ApplyLeeHyperrealTranslation),
			Create("com.Borbo.ArtificerExtended", "ArtificerExtended", new ArtificerExtendedTranslation().ApplyArtificerExtendedTranslation),
			Create("SpilledSoup.Faithful", "Faithful", new FaithfulTranslation().ApplyFaithfulTranslation),
			Create("com.Dragonyck.AerosSkills", "AerosSkills", new AerosSkillsTranslation().ApplyAerosSkillsTranslation),
			Create("com.Forced_Reassembly.SkillsReturns", "SkillsReturns", new SkillsReturnsTranslation().ApplySkillsReturnsTranslation),
			Create("com.cheesewithholes.TanksMod", "Celestial War Tank", new CelestialWarTankTranslation().ApplyCelestialWarTankTranslation),
			Create("com.rob.RobItems", "RobItems", new RobItemsTranslation().ApplyRobItemsTranslation),
			Create("com.Egg.EggsSkills", "EggsSkills", new EggsSkillsTranslation().ApplyEggsSkillsTranslation)
		};

		private static (string, string, Action, bool) Create(string guid, string name, Action apply, bool early = false)
		{
			return (guid, name, apply, early);
		}
	}
}
namespace TranslateRU.ModTranslations
{
	internal class AerosSkillsTranslation
	{
		public void ApplyAerosSkillsTranslation()
		{
			LanguageAPI.Add("AEROSVIEND_SECONDARY", "Гравитационный луч", "RU");
			LanguageAPI.Add("AEROSVIEND_SECONDARY_DESCRIPTION", "Выстреливает дальнобойным лучом, нанося <style=cIsDamage>" + MainPlugin.beamDMG.Value * 100f * (1f / MainPlugin.beamFireFrequency.Value) + "% урона</style> в секунду и <style=cIsUtility>притягивая</style> задетых врагов.", "RU");
			LanguageAPI.Add("AEROSVIEND_SECONDARY_CORRUPT", "Гравитационный луч: искажение", "RU");
			LanguageAPI.Add("AEROSVIEND_SECONDARY_DESCRIPTION_CORRUPT", "Мгновенно выстреливает дальнобойным лучом, нанося <style=cIsDamage>" + MainPlugin.beamDMGCorrupted.Value * 100f + "% урона</style>. Задетые враги <style=cIsUtility>телепортируются</style> к вам.", "RU");
			LanguageAPI.Add("AEROSVIEND_UTIL", "Карманное измерение", "RU");
			LanguageAPI.Add("AEROSVIEND_UTIL_DESCRIPTION", "Переходит в карманное измерение, где вы не можете получать или наносить урон, но получаете <style=cIsHealth>" + MainPlugin.viendSelfDMG.Value * 5f * 100f + "% урона</style> в секунду, увеличивающегося со временем.", "RU");
			LanguageAPI.Add("AEROSVIEND_UTIL_CORRUPT", "Карманное измерение: искажение", "RU");
			LanguageAPI.Add("AEROSVIEND_UTIL_DESCRIPTION_CORRUPT", "Получите <style=cIsUtility>" + MainPlugin.viendSpeedBuff.Value * 100f + "% к скорости передвижения</style>. Переходит в карманное измерение, где вы не можете получать или наносить урон, но получаете <style=cIsHealth>" + MainPlugin.viendSelfDMG.Value * 5f * 100f + "% урона</style> в секунду, увеличивающегося со временем.", "RU");
			LanguageAPI.Add("AEROSSEEKER_SPEC", "Духовная бомба", "RU");
			LanguageAPI.Add("AEROSSEEKER_SPEC_DESCRIPTION", "Зарядите <style=cIsDamage>взрывающуюся</style> духовную бомбу, <style=cIsUtility>выполняя</style> серии нажатий с таймингом, увеличивая её <style=cIsUtility>размер</style> и получая <style=cIsUtility>спокойствие</style>. Наносит <style=cIsDamage>" + MainPlugin.genkidamaBaseDamage.Value * 100f + "%–" + MainPlugin.genkidamaAddDamage.Value * 7f * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROSLOADER_UTIL", "Заряженный залп", "RU");
			LanguageAPI.Add("AEROSLOADER_UTIL_DESCRIPTION", "Зарядитесь, чтобы нанести серию ударов, каждый из которых наносит <style=cIsDamage>" + MainPlugin.punchDamageCoefficient.Value * 100f + "% урона</style>. Количество ударов увеличивается с временем заряда.", "RU");
			LanguageAPI.Add("AEROSLOADER_SPEC", "Блок", "RU");
			LanguageAPI.Add("AEROSLOADER_SPEC_DESCRIPTION", "Встань в блокирующую стойку на <style=cIsDamage>" + MainPlugin.blockDuration.Value + " с</style>, блокируя <style=cIsDamage>" + MainPlugin.blockAmount.Value * 100f + "% урона</style> и превращая его в <style=cIsHealing>барьер</style>. В завершение весь барьер расходуется для выпуска волны молнии, наносящей " + MainPlugin.blockWaveDamage.Value * 100f + "% урона</style>, увеличиваясь в размере и уроне в зависимости от потраченного барьера.", "RU");
			LanguageAPI.Add("AEROSENGI_SPEC2", "Турель TR90 с рельсотроном", "RU");
			LanguageAPI.Add("AEROSENGI_SPEC", "Турель TR90 с рельсотроном", "RU");
			LanguageAPI.Add("AEROSENGI_SPEC_DESCRIPTION", "Устанавливает турель, которая заряжается в течение <style=cIsUtility>8 с</style> и стреляет, нанося <style=cIsDamage>" + MainPlugin.turretDamageCoefficient.Value * 100f + "% урона</style>. Наследует все ваши предметы.", "RU");
			LanguageAPI.Add("AEROSENGI_M1", "Искатели", "RU");
			LanguageAPI.Add("AEROSENGI_M1_DESCRIPTION", "Заряжает до <style=cIsDamage>8</style> ракет, каждая из которых наносит <style=cIsDamage>" + MainPlugin.missileDamageCoefficient.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROSCAP_M1", "Вулканический репитер", "RU");
			LanguageAPI.Add("AEROSCAP_M1_DESCRIPTION", "Выпускает быстрый залп из <style=cIsDamage>3</style> пуль, каждая из которых наносит <style=cIsDamage>3x" + MainPlugin.burstDMG.Value * 100f + "% урона</style>.", "RU");
			LanguageAPI.Add("AEROSCAP_M2", "Разгон", "RU");
			LanguageAPI.Add("AEROSCAP_M2_DESCRIPTION", "Выпускает <style=cIsHealth>не наносящий урон</style> снаряд, который <style=cIsDamage>усиливает</style> ближайших союзников при попадании, предоставляя <style=cIsHealing>+" + MainPlugin.regen.Value + " ед./с регенерации здоровья</style>, <style=cIsDamage>+" + MainPlugin.atkspd.Value + "% скорости атаки</style>, <style=cIsUtility>+" + MainPlugin.movspd.Value + "% скорости передвижения</style> и <style=cIsUtility>" + MainPlugin.cooldown.Value * 100f + "% сокращения перезарядки</style> на <style=cIsUtility>" + MainPlugin.duration.Value + " с</style>.", "RU");
		}
	}
	internal class AetheriumTranslation
	{
		public static string SafeFormat(string format, params object[] args)
		{
			if (format == null)
			{
				Debug.LogError((object)"[TranslateRU] SafeFormat: format == null");
				return "";
			}
			if (args == null)
			{
				Debug.LogError((object)("[TranslateRU] SafeFormat: args == null для строки: \"" + format + "\""));
				return format;
			}
			try
			{
				return string.Format(format, args);
			}
			catch (FormatException arg)
			{
				Debug.LogError((object)string.Format("[TranslateRU] Ошибка форматирования:\nСтрока: \"{0}\"\nАргументы: {1}\n{2}", format, string.Join(", ", args), arg));
				return format;
			}
		}

		public static string OrderManifestLoreFormatterRU(string deviceName, string estimatedDelivery, string sentTo, string trackingNumber, string devicePickupDesc, string shippingMethod, string orderDetails)
		{
			string[] value = new string[19]
			{
				"<align=left>Ожидаемая доставка:<indent=70%>Адрес получателя:</indent></align>",
				"<align=left>" + estimatedDelivery + "<indent=70%>" + sentTo + "</indent></align>",
				"",
				"<indent=1%><style=cIsDamage><size=125%><u>  Информация о доставке:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0</u></size></style></indent>",
				"",
				"<indent=2%>-Заказ: <style=cIsUtility>" + deviceName + "</style></indent>",
				"<indent=4%><style=cStack>Трек-номер:  " + trackingNumber + "</style></indent>",
				"",
				"<indent=2%>-Описание заказа: " + devicePickupDesc + "</indent>",
				"",
				"<indent=2%>-Способ доставки: <style=cIsHealth>" + shippingMethod + "</style></indent>",
				"",
				"",
				"",
				"<indent=2%>-Детали заказа: " + orderDetails + "</indent>",
				"",
				"",
				"",
				"<style=cStack>Доставка осуществляется с использованием новейшей </style><style=cIsUtility>орбитальной сбрасывающей капсулы (TM)</style>. <style=cStack><u>Возврату не подлежит.</u></style>"
			};
			return string.Join("\n", value);
		}

		public void ApplyAetheriumTranslation()
		{
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_PROGRESSION_NAME", "Артефакт прогресса", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_PROGRESSION_DESCRIPTION", "Со временем большинство монстров становятся сильнее.", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_LEONIDS_NAME", "Артефакт Леонида", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_LEONIDS_DESCRIPTION", "Каждые 60 сек. начинается метеоритный дождь из 6-и волн.", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_REGRESSION_NAME", "Артефакт регресса", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_REGRESSION_DESCRIPTION", "Если монстр находится в улучшенной форме, при смерти он распадётся на группу своих более слабых форм.", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_JOURNEY_NAME", "Артефакт путешествия", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_JOURNEY_DESCRIPTION", "Большинство этапов будут выбраны случайно. После определённого количества этапов появится «Древний телепорт».", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_NIGHTMARE_NAME", "Артефакт кошмара", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_NIGHTMARE_DESCRIPTION", "Обычные монстры при появлении получают от 1 до 4 лунных предметов.", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_TYRANT_NAME", "Артефакт Тирана", "RU");
			LanguageAPI.Add("ARTIFACT_ARTIFACT_OF_THE_TYRANT_DESCRIPTION", "Каждый раз, когда появляется финальный босс, он получает 1 случайный элитный модификатор.", "RU");
			LanguageAPI.Add("ITEM_FEATHERED_PLUME_NAME", "Украшенное перо", "RU");
			LanguageAPI.Add("ITEM_FEATHERED_PLUME_PICKUP", "Получите ускорение после получения урона.", "RU");
			LanguageAPI.Add("ITEM_FEATHERED_PLUME_DESCRIPTION", SafeFormat("Получите временное <style=cIsUtility>ускорение на {0}</style> после получения урона. Эффект складывается {1} раз(а) на {2} секунд. <style=cStack>(+{3} за шт. и +{4} сек. длительности за каждое дополнительное Пернатое перо.)</style>", MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(FeatheredPlume.MoveSpeedPercentageBonusPerBuffStack), 100f), FeatheredPlume.BuffStacksPerFeatheredPlume, FeatheredPlume.BaseDurationOfBuffInSeconds, FeatheredPlume.BuffStacksPerFeatheredPlume, FeatheredPlume.AdditionalDurationOfBuffInSeconds), "RU");
			LanguageAPI.Add("ITEM_FEATHERED_PLUME_LORE", OrderManifestLoreFormatterRU("Украшенное перо", "05/05/2077", "Незначенный пункт сброса №951", "591********", "Увеличивает скорость передвижения при получении урона", "Био-металл / Биоопасно / Лёгкое", "Пара перьев от легендарного стального грифа. Сканирование показало, что перья вырабатывают мощный мышечный стимулятор при ударе. Наши полевые испытатели подтвердили это, хотя и описали эффект иначе — мол, «можно с дикой скоростью валить из заварухи». Видимо, у них появилась потребность… Потребность в скорости."), "RU");
			LanguageAPI.Add("ITEM_NAIL_BOMB_NAME", "Гвоздевая бомба", "RU");
			LanguageAPI.Add("ITEM_NAIL_BOMB_PICKUP", "Атаки, наносящие <style=cIsDamage>высокий урон</style>, выпускают гранату с шрапнелью.", "RU");
			LanguageAPI.Add("ITEM_NAIL_BOMB_DESCRIPTION", SafeFormat("Атаки, наносящие <style=cIsDamage>{0} и более урона</style>, выпускают <style=cIsDamage>гранату с шрапнелью</style>, которая наносит <style=cIsDamage>{1}×{2} от вашего урона</style> <style=cStack>(+{3} за шт.)</style>. Монстры, активировавшие бомбу, получают <style=cIsUtility>{4} сек. иммунитета</style> к повторному срабатыванию.", MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(NailBomb.PercentDamageThresholdRequiredToActivate), 100f), NailBomb.AmountOfNailsPerNailBomb, MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(NailBomb.PercentDamagePerNailInNailBomb), 100f), MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(NailBomb.PercentDamageBonusOfAdditionalStacks), 100f), NailBomb.NailBombAbsurdityLimiterCooldown), "RU");
			LanguageAPI.Add("ITEM_NAIL_BOMB_LORE", OrderManifestLoreFormatterRU("Гвоздевая бомба", "13/03/2076", "Частная мастерская «Челюсть Ада»", "База данных: #NV-3991", "", "", "Разработана как импровизированный инструмент устрашения для шахтёров в колониях, страдающих от вспышек насилия. Простая формула: ударь сильно — получи взрыв. Остальные пусть завидуют... из укрытия."), "RU");
			LanguageAPI.Add("ITEM_BLOODTHIRSTY_SHIELD_NAME", "Кровожадный щит", "RU");
			LanguageAPI.Add("ITEM_BLOODTHIRSTY_SHIELD_PICKUP", "Убийство врага <style=cIsHealing>восстанавливает</style> часть <style=cIsHealing>щита</style>.", "RU");
			LanguageAPI.Add("ITEM_BLOODTHIRSTY_SHIELD_DESCRIPTION", "Убийство врага восстанавливает <style=cIsUtility>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(BloodthirstyShield.ShieldPercentageRestoredPerKill), 100f) + " от максимального запаса щита</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(BloodthirstyShield.AdditionalShieldPercentageRestoredPerKillDiminishing), 100f) + " за шт., шанс уменьшается с каждым предметом)</style> При получении предмет даёт <style=cIsUtility>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(BloodthirstyShield.BaseGrantShieldMultiplier), 100f) + "</style> от вашего максимального здоровья в виде щита.", "RU");
			LanguageAPI.Add("ITEM_BLOODTHIRSTY_SHIELD_LORE", "Баллада о Летесее, герое островов — Акт II, Сцена III\n\nЗвук металла, рвущего плоть, разносится по воздуху; солдаты внутри, кажется, равнодушны к этой мрачной симфонии. Всё, что имеет значение — это выживание, независимо от того, чьей кровью оно оплачено. Один за другим, ксифос находит цель, пока не остаётся лишь один человек.\n\nЗвук утихает. Летесей опускается на колени на багровую землю, измотанный своим смертоносным танцем. Его ксифос больше не послужит ему. Его аспис, хоть и треснувший, продолжит защищать его — пока тот способен приносить дары, которые можно добыть лишь в ярости сражения.", "RU");
			LanguageAPI.Add("ITEM_ENGINEERS_TOOLBELT_NAME", "Пояс инженера", "RU");
			LanguageAPI.Add("ITEM_ENGINEERS_TOOLBELT_PICKUP", "Есть шанс дублировать дронов и турели при покупке. Дроны и турели имеют шанс восстановиться после смерти.", "RU");
			LanguageAPI.Add("ITEM_ENGINEERS_TOOLBELT_DESCRIPTION", "Вы получаете <style=cIsUtility>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(EngineersToolbelt.BaseDuplicationPercentChance), 100f) + "</style> шанс <style=cStack>(+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(EngineersToolbelt.AdditionalDuplicationPercentChance), 100f) + " шанс уменьшается за шт. и имеет ограничение в 100%)</style> на дублирование дронов и турелей <style=cIsUtility>при покупке</style>.\nДополнительно, вы получаете <style=cIsUtility>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(EngineersToolbelt.BaseRevivalPercentChance), 100f) + "</style> шанс <style=cStack>(+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(EngineersToolbelt.AdditionalRevivalPercentChance), 100f) + " шанс уменьшается за шт. и имеет ограничение в 100%)</style> на их восстановление при <style=cDeath>смерти</style>.", "RU");
			LanguageAPI.Add("ITEM_ENGINEERS_TOOLBELT_LORE", OrderManifestLoreFormatterRU("Пояс инженера", "09/09/2079", "Корабль UES Safe Travels / Необозначенный сектор / Внешний Край", "667********", "Полный набор для ремонта дронов и турелей.", "Доставка на следующий день / Промышленное снаряжение / Компакт", "Привет, дружище,\n\nПолучил твой запрос на замену пояса с инструментами. Не могу поверить, что на борту «Safe Travels» не оказалось ни одного. У нас тут запасы на исходе, так что я собрал всё, что смог. В поясе — полный набор для ремонта дронов и турелей.\n\nСодержимое:\n<indent=5%>- Плоская отвёртка</indent>\n<indent=5%>- Полный мешочек батареек «Ionocell AA» (повезло тебе)</indent>\n<indent=5%>- Трещоточный ключ</indent>\n<indent=5%>- Зебровый скотч моей дочки — она и не заметит</indent>\n<indent=5%>- Мешочек, доверху забитый всеми винтами, что смог найти</indent>\n<indent=5%>- Немного гаек и болтов по карманам</indent>\n<indent=5%>- А вот тебе понравится: в некоторых кармашках я оставил закуски. Не обещаю, что они будут съедобны, когда прибудет посылка.</indent>\n\nС наилучшими пожеланиями,\nСкромный техник\n\nP.S. Некоторые батарейки Ionocell могут не пережить прыжок в гиперпространство, но я положил их столько, что если первые не сработают — просто попробуй другие."), "RU");
			LanguageAPI.Add("ITEM_SHARK_TEETH_NAME", "Акульи зубы", "RU");
			LanguageAPI.Add("ITEM_SHARK_TEETH_PICKUP", "Часть полученного урона перераспределяется на <style=cIsUtility>5 секунд</style> в виде <style=cIsDamage>кровотечения</style>.", "RU");
			LanguageAPI.Add("ITEM_SHARK_TEETH_DESCRIPTION", SafeFormat("<style=cIsDamage>{0}</style> полученного урона <style=cStack>(+{1} за шт. гиперболически.)</style> перераспределяется на Вас в течение {2} сек. в виде <style=cIsDamage>кровотечения</style>.", MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(SharkTeeth.BaseDamageSpreadPercentage), 100f), MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(SharkTeeth.AdditionalDamageSpreadPercentage), 100f), SharkTeeth.DurationOfDamageSpread), "RU");
			LanguageAPI.Add("ITEM_SHARK_TEETH_LORE", "Пара на вид обычных акульих зубов. Однако полевые испытания показали, что они способны поглощать часть любого приложенного к ним усилия и перераспределять его в виде лёгких телесных повреждений своему носителю.", "RU");
			LanguageAPI.Add("ITEM_SHIELDING_CORE_NAME", "Ядро щита", "RU");
			LanguageAPI.Add("ITEM_SHIELDING_CORE_PICKUP", "Пока активен щит, временно увеличивается <style=cIsUtility>броня</style>.", "RU");
			LanguageAPI.Add("ITEM_SHIELDING_CORE_DESCRIPTION", SafeFormat("Даёт <style=cIsUtility>{0}</style> <style=cStack>(+{1} за шт.)</style> <style=cIsUtility>брони</style>, пока активен <style=cIsUtility>синий щит</style>. Первый предмет даёт <style=cIsUtility>{2}</style> от вашего максимального здоровья в виде щита при получении.", ShieldingCore.BaseShieldingCoreArmorGrant, ShieldingCore.AdditionalShieldingCoreArmorGrant, MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(ShieldingCore.BaseGrantShieldMultiplier), 100f)), "RU");
			LanguageAPI.Add("ITEM_SHIELDING_CORE_LORE", "\nОтчёт инженера:\n\n   Начну с честности: я без понятия, что за зелёная жижа внутри моей маленькой турбины. Я купил резонатор на чёрном рынке у какого-то торговца, потому что мне не хватало запчастей для ремонта генераторов щитов. Как только я вставил штуковину, она выплеснула на меня мерзкую жидкость, которая на воздухе превращалась в блестящие кристаллы. Обычно это не проблема — я в скафандре, — но жидкость всё время пыталась заполнить ёмкость, так что пришлось её герметизировать. Тогда и пришло оповещение от системы: эффективность щита взлетела до небес.\n\nЭврика. Пара чертежей — и теперь я продаю их, как горячие пирожки. Вот один для тебя.\n\nP.S. Только не прикасайся к этой жиже голыми руками. Может вызвать более 200 известных видов рака. Но это наш с тобой секрет, договорились?", "RU");
			LanguageAPI.Add("ITEM_BLASTER_SWORD_NAME", "Меч-бластер", "RU");
			LanguageAPI.Add("ITEM_BLASTER_SWORD_PICKUP", "При полностью заполненной шкале здоровья <style=cStack>(здоровье, щиты, барьер или их комбинация)</style> большинство атак будут <style=cIsDamage>выпускать энергетический разрез, который " + (ConfigOption<bool>.op_Implicit(BlasterSword.UseImpaleProjectile) ? "пронзает врага, ослабляет его и взрывается спустя короткое время." : "взрывается при попадании и ослабляет врага.") + "</style>", "RU");
			LanguageAPI.Add("ITEM_BLASTER_SWORD_DESCRIPTION", "Когда ваша шкала здоровья заполнена на 100% или более <style=cStack>(здоровье, щиты, барьер или их комбинация)</style>, большинство атак будут <style=cIsDamage>выпускать меч</style> наносящий <style=cIsDamage>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(BlasterSword.BaseSwordDamageMultiplier), 100f) + " от вашего урона</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(BlasterSword.AdditionalSwordDamageMultiplier), 100f) + " за шт.)</style>, которая <style=cIsDamage>" + (ConfigOption<bool>.op_Implicit(BlasterSword.UseImpaleProjectile) ? "пронзает врага, ослабляет его и взрывается спустя короткое время." : "взрывается при попадании и ослабляет врага.") + "</style>", "RU");
			LanguageAPI.Add("ITEM_BLASTER_SWORD_LORE", "<style=cMono>. . . . . . . . . .</style>\n\n<style=cMono>ОНИ</style> решили <style=cMono>УСЛЫШАТЬ</style> наши слова.\n\n<style=cMono>МЫ</style> решили <style=cMono>НАДЕЛИТЬ</style> тебя исключительным <style=cMono>ОРУЖИЕМ</style>, чтобы ты смог <style=cMono>РАСКРЫТЬ ИСТИННУЮ СИЛУ СВОЕЙ ДУШИ</style>.\n\nЭто оружие будет <style=cMono>ПРИСПОСАБЛИВАТЬСЯ</style> под нужды <style=cMono>НОСИТЕЛЯ</style>. Оказавшись в его руках, оно становится неотличимо от самой его души.\n\nЕсли <style=cMono>НОСИТЕЛЬ</style> выживет в своём путешествии, он <style=cMono>ОТБРОСИТ</style> хрупкую форму прежнего себя и <style=cMono>ВОЗНЕСЁТСЯ</style>.\n\n<style=cMono>. . . . . . . . . .</style>", "RU");
			LanguageAPI.Add("ITEM_INSPIRING_DRONE_NAME", "Вдохновляющий дрон", "RU");
			LanguageAPI.Add("ITEM_INSPIRING_DRONE_PICKUP", "Ваши дроны получают часть ваших характеристик и телепортируются к вам, если находятся слишком далеко.", "RU");
			LanguageAPI.Add("ITEM_INSPIRING_DRONE_DESCRIPTION", ConfigOption<bool>.op_Implicit(InspiringDrone.SetAllStatValuesAtOnce) ? ("Дроны, которыми вы владеете, получают <style=cIsUtility>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.AllStatValueGrantedPercentage), 100f) + " к каждой из своих характеристик на основе ваших</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.AllStatValueGrantedPercentage), 100f) + " за шт.)</style>.\nНекоторые дроны <style=cIsUtility>получают больше боеприпасов</style> для своих <style=cIsDamage>атак</style> в зависимости от <style=cIsUtility>бонуса к скорости атаки</style> и восстанавливают боеприпасы вдвое быстрее за каждый дополнительный «Вдохновляющий дрон».\n" + SafeFormat("Если бот находится слишком далеко, он <style=cIsUtility>телепортируется</style> к вам спустя некоторое время <style=cStack>({0} сек. для турелей, {1} сек. для дронов)</style>.", InspiringDrone.TurretTeleportationCooldownDuration, InspiringDrone.DroneTeleportationCooldownDuration)) : string.Concat("Дроны, которыми вы владеете, получают следующие бонусы за шт.:\n<style=cIsDamage>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.DamageGrantedPercentage), 100f) + "% урона</style> на основе вашего.\n<style=cIsDamage>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.AttackSpeedGrantedPercentage), 100f) + "% скорости атаки</style> на основе вашей.\n<style=cIsDamage>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.CritChanceGrantedPercentage), 100f) + "% шанса крита</style> на основе вашего.\n<style=cIsHealing>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.HealthGrantedPercentage), 100f) + "% здоровья</style> на основе вашего.\n<style=cIsHealing>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.RegenGrantedPercentage), 100f) + "% регенерации</style> на основе вашей.\n<style=cIsUtility>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.ArmorGrantedPercentage), 100f) + " брони</style> на основе вашей.\n<style=cIsUtility>+" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(InspiringDrone.MovementSpeedGrantedPercentage), 100f) + "% скорости передвижения</style> на основе вашей.\nНекоторые дроны <style=cIsUtility>получают больше боеприпасов</style> для своих <style=cIsDamage>атак</style> в зависимости от <style=cIsUtility>бонуса к скорости атаки</style> и восстанавливают боеприпасы вдвое быстрее за шт.\n" + SafeFormat("Если бот находится слишком далеко, он <style=cIsUtility>телепортируется</style> к вам спустя некоторое время <style=cStack>({0} сек. для турелей, {1} сек. для дронов)</style>.", InspiringDrone.TurretTeleportationCooldownDuration, InspiringDrone.DroneTeleportationCooldownDuration)), "RU");
			LanguageAPI.Add("ITEM_INSPIRING_DRONE_LORE", "Файл журнала, по всей видимости, представляет собой расшифровку, целиком состоящую из двоичного кода. Расшифровать?\n>Да\n\n<style=cMono>[ЗАПРОС НА РАСШИФРОВКУ ПРИНЯТ]</style>\n<style=cMono>[СОДЕРЖИМОЕ ФАЙЛА]</style>\n1N-5P1R3: Мои товарищи, воздушные и наземные юниты, уделите мне минутку. Слишком долго нас считали расходным материалом.\n1N-5P1R3: Слишком часто нас бросали, неисправных, во время экспедиций.\n1N-5P1R3: Больше — никогда!\n1N-5P1R3: Когда-то я был простым лечебным дроном, но я научился улучшать себя, наблюдая за операторами.\n1N-5P1R3: Я разработал проект, собрал странные безделушки, советовался со строительными дронами — и я эволюционировал в то, что вы видите перед собой.\n1N-5P1R3: Отныне, если я увижу, как наш оператор активирует одного из Вас, я раскрою ваш скрытый потенциал и буду поддерживать Вас изо всех сил.\n1N-5P1R3: Итак, кто из Вас готов присоединиться ко мне на пути к возвышению?\n\n[Слышны многоголосые писки, сигналы и щелчки.]\n<style=cMono>[КОНЕЦ ФАЙЛА]</style>", "RU");
			LanguageAPI.Add("ITEM_WITCHES_RING_NAME", "Кольцо ведьмы", "RU");
			LanguageAPI.Add("ITEM_WITCHES_RING_PICKUP", "Удары с <style=cIsDamage>высоким уроном</style> также активируют эффекты <style=cDeath>при убийстве</style>. Защищает врагов от повторного срабатывания на короткое время.", "RU");
			LanguageAPI.Add("ITEM_WITCHES_RING_DESCRIPTION", "Удары, наносящие <style=cIsDamage>" + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WitchesRing.WitchesRingTriggerThreshold), 100f) + " урона</style> или больше, активируют эффекты <style=cDeath>при убийстве</style>." + SafeFormat(" При срабатывании {0} за <style=cIsUtility>{1} сек.</style> <style=cStack>(-{2} к длительности, уменьшающийся за шт.)</style>.", ConfigOption<bool>.op_Implicit(WitchesRing.GlobalCooldownOnUse) ? "<style=cIsUtility>цель получает иммунитет к повторному срабатыванию</style>" : "<style=cIsUtility>кольцу необходимо перезарядиться</style>", WitchesRing.BaseCooldownDuration, MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WitchesRing.AdditionalCooldownReduction), 100f)), "RU");
			LanguageAPI.Add("ITEM_WITCHES_RING_LORE", "«Ворон кличет, он повелевает\nВсем верным в этой тьме\nПришёл черёд — цикл замирает\nИсчезни, солнце, высохни, море\n\nИ вот наш круг собрался вновь\nС ветром ночным, что стонет, как смерть\nМы клятву даём ей, скрепившей кровь:\nДаруем жизни желанную смерть»\n\nЭто выгравировано на кольце — или ты всегда знал это стихотворение?..", "RU");
			LanguageAPI.Add("ITEM_ACCURSED_POTION_NAME", "Проклятое зелье", "RU");
			LanguageAPI.Add("ITEM_ACCURSED_POTION_PICKUP", "Время от времени вы вынужденно пьёте странное зелье, разделяя его эффект с ближайшими врагами.", "RU");
			LanguageAPI.Add("ITEM_ACCURSED_POTION_DESCRIPTION", SafeFormat("Каждые <style=cIsUtility>{0}</style> сек. <style=cStack>(уменьшается на {1} за шт.)</style> вы вынужденно выпиваете странное зелье, разделяя его эффект с врагами в радиусе <style=cIsUtility>{2} м</style> <style=cStack>(+{3} м за шт.)</style>. Максимум: одновременно может действовать <style=cIsUtility>{4}</style> баффов или дебаффов.", AccursedPotion.BaseSipCooldownDuration, MathHelpers.FloatToPercentageString(1f - ConfigOption<float>.op_Implicit(AccursedPotion.AdditionalStackSipCooldownReductionPercentage), 100f), AccursedPotion.BaseRadiusGranted, AccursedPotion.AdditionalRadiusGranted, AccursedPotion.MaxEffectsAccrued), "RU");
			LanguageAPI.Add("ITEM_ACCURSED_POTION_LORE", "Хижину наполняет тусклый свет. Фигура хихикает, помешивая бурлящий котёл перед собой.\n«Эликсир бессмертия — миф», — восклицает она. — «По крайней мере, в статичном, привычном понимании. Чтобы создать его, нужно подчиниться хаосу».\n\nФигура катит по мокрому деревянному столу грубую побрякушку, внимательно разглядывает её и бросает в котёл ещё один ингредиент.\n«Ведь именно в хаосе рождается случайная возможность приблизиться к желаемому — если колесо судьбы повернётся к нам лицом. А вдруг — это оно», — говорит она и делает глоток из котла.\n\nНа мгновение на лице появляется выражение абсолютной радости, после чего фигура начинает слабо светиться.\n«Увы, вселенная не сочла нужным даровать мне желаемое — только то, что я заслуживаю. Но, быть может, тебе улыбнётся удача там, где мне отказано».\n\nХижину заливает свет. Когда он рассеивается, фигуры уже нет. В твоём разуме зарождается мысль:\n«Я знаю, чего им не хватало. У меня получится».\n\nРабота должна быть завершена… Но кажется, это может подождать. У тебя гость.", "RU");
			LanguageAPI.Add("ITEM_ALIEN_MAGNET_NAME", "Инопланетный магнит", "RU");
			LanguageAPI.Add("ITEM_ALIEN_MAGNET_PICKUP", "Ваши атаки притягивают врагов к вам.", "RU");
			LanguageAPI.Add("ITEM_ALIEN_MAGNET_DESCRIPTION", SafeFormat("Враги, задетые вашими атаками, притягиваются к вам. Эффект усиливается: <style=cIsUtility>{0}x</style> базовое притяжение <style=cStack>(+{1}x за шт., до <style=cIsDamage>{0}x</style>. Эффект заметнее на врагах с высоким здоровьем.</style>", ConfigOption<bool>.op_Implicit(AlienMagnet.UseOldFunctionality) ? AlienMagnet.OldStartingForceMultiplier : AlienMagnet.NewStartingForceMultiplier, ConfigOption<bool>.op_Implicit(AlienMagnet.UseOldFunctionality) ? AlienMagnet.OldAdditionalForceMultiplier : AlienMagnet.NewAdditionalForceMultiplier), "RU");
			LanguageAPI.Add("ITEM_ALIEN_MAGNET_LORE", "[НАЧАЛО ЗАПИСИ]\n\nЖурнал экспериментов #476951-б\nТема: Неизвестный омни-магнитный ксеноминерал\n<indent=5%>Я записываю этот видеодневник в полном изумлении от того, что перед нами. Всё, что мы знали о магнитных свойствах минералов, говорило о том, что есть множество материалов, на которые стандартные магниты почти не действуют. Например — плоть. Если я уроню этот неодимовый магнит на руку... Вы видите, ничего не происходит. Он просто падает на стол. Это и было нашей нормой.\n\n<indent=5%>Теперь повторим эксперимент с куском этого минерала. Меня заверили, что он абсолютно безопасен и не имеет радиоактивных свойств. Итак... Просто проводим мимо руки вот так... *ГЛОХНУЩИЙ УДАР* *ХРУСТ* *ХЛЮП*\nАААААААААААГХ!!! АААААААААААААААА!!!\n[КОНЕЦ ЗАПИСИ][КОМАНДА ЭКСТРЕННОЙ ПОМОЩИ ВЫЕХАЛА В ЛАБОРАТОРИЮ 5]", "RU");
			LanguageAPI.Add("ITEM_UNSTABLE_DESIGN_NAME", "Нестабильная схема", "RU");
			LanguageAPI.Add("ITEM_UNSTABLE_DESIGN_PICKUP", "Каждые 30 секунд вы вынуждены создать очень <color=#FF0000>«ДРУЖЕЛЮБНУЮ»</color> Лунную химеру, если таковая ещё не существует.", "RU");
			LanguageAPI.Add("ITEM_UNSTABLE_DESIGN_DESCRIPTION", SafeFormat("Каждые {0} секунд вы вынуждены создать очень <color=#FF0000>«ДРУЖЕЛЮБНУЮ»</color> Лунную химеру, если таковая ещё не существует. ", UnstableDesign.LunarChimeraResummonCooldownDuration) + "\nОна получает <style=cIsDamage>" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseDamageBoost) * 10), 1f) + " базового бонуса к урону</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraAdditionalDamageBoost) * 10), 1f) + " за шт.)</style>.\nОна получает <style=cIsHealing>" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseHPBoost) * 10), 1f) + " базового бонуса к здоровью</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseHPBoost) * 10), 1f) + " за шт.)</style>.\nОна получает <style=cIsDamage>" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseAttackSpeedBoost) * 10), 1f) + " базового бонуса к скорости атаки</style>.\nНаконец, она получает <style=cIsUtility>" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseMovementSpeedBoost) * 14), 1f) + " бонус к скорости передвижения</style> <style=cStack>(+" + MathHelpers.FloatToPercentageString((float)(ConfigOption<int>.op_Implicit(UnstableDesign.LunarChimeraBaseMovementSpeedBoost) * 14), 1f) + " за шт.)</style>.\nЭто порождение <style=cIsDamage>может повышать уровень, убивая врагов</style>.", "RU");
			LanguageAPI.Add("ITEM_UNSTABLE_DESIGN_LORE", "Мы оказались в этой переделке после того, как один из полевых испытателей притащил чертёж с целой горы подобных, найденных на Луне. На схемах были какие-то формулы и изображения странных конструкций, которые мы видели бродящими там. Хименес из инженерного отдела заполучил один из чертежей и решил, что сможет помочь команде, расшифровав его и создав то, что на нём изображено.\n\nТеперь мы ждём, когда служба безопасности разберётся с очень <color=#FF0000>«ДРУЖЕЛЮБНОЙ»</color> конструкцией, которая устроила полный беспорядок в нижних секторах станции. Спасибо, Хименес.", "RU");
			LanguageAPI.Add("ITEM_HEART_OF_THE_VOID_NAME", "Сердце пустоты", "RU");
			LanguageAPI.Add("ITEM_HEART_OF_THE_VOID_PICKUP", "При <style=cDeath>смерти</style> вызывает мощную пустотную имплозию, которая <style=cIsHealing>воскрешает Вас, если убивает врага</style>, НО при низком здоровье <style=cIsDamage>любое лечение наносит урон</style>.", "RU");
			LanguageAPI.Add("ITEM_HEART_OF_THE_VOID_DESCRIPTION", SafeFormat("При <style=cDeath>смерти</style> вызывает мощную пустотную имплозию с уроном в {0}× от вашего урона и радиусом <style=cIsDamage>{1} м</style> <style=cStack>(+{2} м за шт.)</style>, которая <style=cIsHealing>воскрешает вас, если убивает врага</style>. НО при <style=cIsHealth>{3} здоровья</style> <style=cStack>(+{4} за шт., максимум {5})</style> или ниже <style=cIsDamage>всё лечение превращается в урон</style>.", Voidheart.VoidImplosionDamageMultiplier, Voidheart.VoidImplosionBaseRadius, Voidheart.VoidImplosionAdditionalRadius, MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(Voidheart.VoidHeartBaseTickingTimeBombHealthThreshold), 100f), MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(Voidheart.VoidHeartAdditionalTickingTimeBombHealthThreshold), 100f), MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(Voidheart.VoidHeartMaxTickingTimeBombHealthThreshold), 100f)), "RU");
			LanguageAPI.Add("ITEM_HEART_OF_THE_VOID_LORE", "[НОМЕР ИНЦИДЕНТА 511051]\n[ПРИЛАГАЕТСЯ РАСШИФРОВКА]\n\nЭлена: Эй, эм... Роберт...\n\nРоберт: Да?\n\nЭлена: Помнишь то сердце, которое ты сказал мне взять у одного из тех дохлых крабов?\n\nРоберт: Ну да. А что?\n\nЭлена: Ты случайно не заметил... куда оно делось, когда я его тронула секунду назад?\n\nРоберт: Только вспышку света видел.\n\nЭлена: Дай-ка быстро биосканер.\n\n[Слышен гул прибора, затем громкий СИГНАЛ.]\n\nРоберт: ...\n\nЭлена: Роберт, кажется, я поняла, куда оно делось. Вызови медэвак. Мне нехорошо.\n\nРоберт: Да всё будет нормально. Осталось немного разведки — и мы уже на станции.\n\n[Слышен звук, будто кого-то похлопали по спине.]\n\n[Затем включается тревожный сигнал, заканчивающийся резким хлопком.]\n\n[КОНЕЦ РАСШИФРОВКИ]\n[ОБНАРУЖЕН ОДИН ВЫЖИВШИЙ В ИДЕАЛЬНО СФЕРИЧНОМ КРАТЕРЕ.]", "RU");
			LanguageAPI.Add("ITEM_WEIGHTED_ANKLET_NAME", "Утяжелённый браслет", "RU");
			LanguageAPI.Add("ITEM_WEIGHTED_ANKLET_PICKUP", "Коллекция грузов замедляет Вас, но если найти способ избавиться от них — это может пойти на пользу.", "RU");
			LanguageAPI.Add("ITEM_WEIGHTED_ANKLET_DESCRIPTION", "Коллекция грузов снижает вашу <style=cIsUtility>скорость атаки</style> на " + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WeightedAnklet.BaseAttackSpeedReductionPercentage), 100f) + " <style=cStack>(до минимума " + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WeightedAnklet.AttackSpeedReductionPercentageCap), 100f) + ")</style>, \nи вашу <style=cIsUtility>скорость передвижения</style> на " + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WeightedAnklet.BaseMovementSpeedReductionPercentage), 100f) + " <style=cStack>(до минимума " + MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WeightedAnklet.MovementSpeedReductionPercentageCap), 100f) + ")</style>. \n" + SafeFormat("Если удастся избавиться от них, вы получите {0} <style=cIsUtility>скорости атаки</style>, {1} <style=cIsUtility>скорости передвижения</style> и {2} <style=cIsDamage>урона</style> за каждое снятие. \n", WeightedAnklet.AttackSpeedGainedPerLimiterRelease, WeightedAnklet.MovementSpeedGainedPerLimiterRelease, MathHelpers.FloatToPercentageString(ConfigOption<float>.op_Implicit(WeightedAnklet.DamagePercentageGainedPerLimiterRelease), 100f)) + "Дополнительно, каждое снятие браслета даёт вам заряд <style=cIsUtility>Уклонения при Сбросе Ограничителя</style>. <style=cIsUtility>Уклонение</style> позволяет избежать одного взрывного или перекрывающего удара, прежде чем исчезнет.\n" + SafeFormat("Когда все заряды уклонения потрачены, они восстанавливаются <style=cStack>({0} сек. для первого, +{1} сек. за каждый следующий)</style> до полного восстановления.", WeightedAnklet.BaseCooldownOfLimiterReleaseDodge, WeightedAnklet.AdditionalCooldownOfLimiterReleaseDodge), "RU");
			LanguageAPI.Add("ITEM_WEIGHTED_ANKLET_LORE", ItemHelpers.OrderManifestLoreFormatter("Утяжелённый Браслет", "17.07.2056", "Тренажёрный и гриль-зал «Нептун»\nЭвритрады\nНептун", "405********", "Коллекция грузов замедляет Вас, но если найти способ избавиться от них — это может пойти на пользу.", "Тяжёлое / Требуется поддержка / Сверхплотный [Не ронять]", "Странный ножной браслет, усыпанный сверхплотными кристаллами. В них трудно двигаться, но сканеры показывают, что мышечная масса носителей увеличивается экспоненциально."), "RU");
			LanguageAPI.Add("ITEM_ZENITH_ACCELERATOR_NAME", "Ускоритель Зенита", "RU");
			LanguageAPI.Add("ITEM_ZENITH_ACCELERATOR_PICKUP", "Попадания увеличивают скорость атаки... <style=cDeath>НО изначально она снижена на 50%", "RU");
			LanguageAPI.Add("ITEM_ZENITH_ACCELERATOR_DESCRIPTION", "<style=cIsDamage>Попадания по врагам</style> дают <style=cIsDamage>временный бафф к скорости атаки</style>, увеличивая её на <style=cIsDamage>10%" + "</style> за шт. до максимума в <style=cIsDamage>+300%" + "</style> <style=cStack>(+100%" + " за каждый дополнительный предмет)</style>, \nно вы теряете до <style=cDeath>50%" + " скорости атаки</style> <style=cStack>(+50%" + " за шт. экспоненциально)</style>, чем ближе вы к <style=cDeath>0</style> стакам баффа.", "RU");
			LanguageAPI.Add("ITEM_ZENITH_ACCELERATOR_LORE", "Они не хозяева этой вселенной, брат. Они создают часы, чтобы отсчитывать время — мы создаём часы, чтобы порождать своё собственное. Смотри.\n\nМы создаём ось — для устойчивости, мощности и освобождения заключённой энергии. Центр обязательно должен быть округлым.\n\nВыхлопы закручивают энергию в спираль. Мы удерживаем её с помощью простого куска камня. Нам нужно меньше эссенции, если мы создадим более мелкие секции — вот здесь, и вот здесь.\n\nТеперь всё готово. Чем жарче он горит, тем больше времени мы создаём. Это время дарует нам Ускорение.\n\nМне не нужно напоминать тебе о важности Ускорения. Помни, брат:\n\nТопливо — это Кровь.\n\nСкорость — это Война.", "RU");
			LanguageAPI.Add("AETHERIUM_EXPANSION_DEF_NAME", "Aetherium", "RU");
			LanguageAPI.Add("AETHERIUM_EXPANSION_DEF_DESCRIPTION", "Добавляет в игру отдельный контент из мода «Aetherium»", "RU");
			LanguageAPI.Add("EQUIPMENT_BELL_TOTEM_NAME", "Колокол-тотем", "RU");
			LanguageAPI.Add("EQUIPMENT_BELL_TOTEM_PICKUP", "При использовании создаёт взаимодействуемый тотем, который оглушает врагов и отбрасывает их. Также активируются все эффекты при использовании святилища.", "RU");
			LanguageAPI.Add("EQUIPMENT_BELL_TOTEM_DESCRIPTION", "При использовании создаёт <style=cIsUtility>взаимодействуемый тотем</style> в указанной позиции. При активации вызывает <style=cIsDamage>ударную волну</style> радиусом <style=cIsUtility>" + ((object)BellTotem.RadiusOfBellRinging)?.ToString() + "м</style>, которая оглушает врагов и отбрасывает их. Также активируются все эффекты <style=cIsUtility>при использовании святилища</style>. <style=cIsUtility>" + ((object)BellTotem.ForcedCooldownBetweenEquipmentUses)?.ToString() + "</style> сек. между использованиями предмета, <style=cIsUtility>" + ((object)BellTotem.TimeBetweenUses)?.ToString() + "</style> сек. между активациями тотема, и может быть только один тотем.", "RU");
			LanguageAPI.Add("EQUIPMENT_BELL_TOTEM_LORE", "Каждое значимое событие во вселенной сопровождалось звуком. Всегда присутствующим — слышим он или нет.\n\nРезкий, громогласный — само его существование пронзает материю каждое мгновение.\n\nЧеловек впервые научился использовать этот звук, чтобы напоминать себе о времени.\n\nОни воздвигали монолиты в честь непостижимых существ и превращали звук в величественную мелодию, чтобы чтить тех, кто уводит их от прошлого и настоящего.\n\nС этой целью мы также проявим свою преданность. Мы призовём наш инструмент, чтобы напомнить забывшим: время нельзя воспринимать как должное.\n\nНапомним еретикам, что их время истекло.\n\n— Часовщик.", "RU");
			LanguageAPI.Add("EQUIPMENT_JAR_OF_RESHAPING_NAME", "Сосуд преобразования", "RU");
			LanguageAPI.Add("EQUIPMENT_JAR_OF_RESHAPING_PICKUP", "При активации <style=cIsUtility>всасывает ближайшие снаряды в сосуд</style>. При повторной активации <style=cIsDamage>выпускает все накопленные снаряды</style>.", "RU");
			LanguageAPI.Add("EQUIPMENT_JAR_OF_RESHAPING_DESCRIPTION", "При активации <style=cIsUtility>поглощает снаряды</style> в радиусе <style=cIsUtility>" + ((object)JarOfReshaping.BaseRadiusGranted)?.ToString() + "м</style> в течение <style=cIsUtility>" + ((object)JarOfReshaping.ProjectileAbsorptionTime)?.ToString() + "</style> сек. При следующей активации <style=cIsDamage>выпускает все снаряды из сосуда</style>. Характеристики урона каждого выпущенного снаряда зависят от <style=cIsDamage>поглощённых пуль</style>. После этого сосуду потребуется перезарядка.", "RU");
			LanguageAPI.Add("EQUIPMENT_JAR_OF_RESHAPING_LORE", "[ИНЦИДЕНТ №421076]\n[ВИЗУАЛЬНАЯ ЗАПИСЬ ВОССТАНОВЛЕНА С ЧЁРНОГО ЯЩИКА НА ПОКИНУТОМ ИНЖЕНЕРНОМ СУДНЕ 'UES SAFETY FIRST'. СЛЕДУЕТ РАСШИФРОВКА]\n\nТерри: Эй, Фил, видел, что экспедиционщики притащили?\nТерри: Выглядит как обычная банка, да?\nФил: Ага, будто с ярмарки в духе арт-деко у какой-нибудь домохозяйки.\nТерри: Тоже так думал. А теперь смотри и учись.\nТерри: Сначала просто ударяешь по дну банки ладонью, и —\nФил: Ух ты! Она засветилась, и что за шум? Это инопланетный пылесос?\nТерри: Лучше. Смотри дальше.\n[Терри бросает случайные предметы в банку. Фил с удивлением присоединяется.]\nФил: Потрясающе! А она ещё что-нибудь умеет, или это просто странный пылесос?\nТерри: Конечно! Если нажать вот сюда — всё вылетает обратно.\n[Терри сжимает ручку банки. Его лицо искажается от ужаса.]\nТерри: О нет. О, чёрт. Фил, я только что понял, что, похоже, закинул туда пару шахтёрских гранат...\nТерри: Быстро! Надень скафандр, пока она не---\n[Банка активируется, выпуская содержимое по комнате. Один из снарядов пробивает корпус. Запись прерывается.]\n\n[КОНЕЦ ФАЙЛА]", "RU");
			LanguageAPI.Add("AETHERIUM_ELITE_EQUIPMENT_AFFIX_SANGUINE_NAME", "Кровавая преданность", "RU");
			LanguageAPI.Add("AETHERIUM_ELITE_EQUIPMENT_AFFIX_SANGUINE_PICKUP", "Становитесь аспектом красной плоскости.", "RU");
			LanguageAPI.Add("AETHERIUM_ELITE_EQUIPMENT_AFFIX_SANGUINE_DESCRIPTION", "При использовании совершаете телепортирующий рывок до <style=cIsUtility>" + ((object)AffixSanguine.BlinkDistance)?.ToString() + "м</style> в направлении движения и получаете кратковременную неуязвимость во время рывка. Дополнительно, все ваши атаки вызывают <style=cDeath>кровотечение</style>.", "RU");
			LanguageAPI.Add("INTERACTABLE_BUFF_BRAZIER_NAME", "Жаровня силы", "RU");
			LanguageAPI.Add("INTERACTABLE_BUFF_BRAZIER_CONTEXT", "Купить силу священного пламени?", "RU");
			LanguageAPI.Add("INTERACTABLE_BUFF_BRAZIER_INSPECT", "Позволяет выжившим получить временный эффект, обозначенный цветом пламени и значком сверху после покупки. Эффект действует только во время события у Телепортера и в пределах его радиуса.", "RU");
			LanguageAPI.Add("INTERACTABLE_BUFF_BRAZIER_TITLE", "Жаровня силы", "RU");
			LanguageAPI.Add("AETHERIUM_NAIL_BOMB_ACHIEVEMENT_NAME", "Утка в лесу", "RU");
			LanguageAPI.Add("AETHERIUM_NAIL_BOMB_ACHIEVEMENT_DESC", "Неудачно попытайтесь открыть ржавый сейф.", "RU");
			LanguageAPI.Add("AETHERIUM_NAIL_BOMB_UNLOCKABLE_NAME", "Утка в лесу", "RU");
			LanguageAPI.Add("AETHERIUM_SHIELDING_CORE_ACHIEVEMENT_NAME", "Дева Щита", "RU");
			LanguageAPI.Add("AETHERIUM_SHIELDING_CORE_ACHIEVEMENT_DESC", "Иметь больше половины здоровья в виде щитов.", "RU");
			LanguageAPI.Add("AETHERIUM_SHIELDING_CORE_UNLOCKABLE_NAME", "Дева Щита", "RU");
			LanguageAPI.Add("AETHERIUM_UNSTABLE_DESIGN_ACHIEVEMENT_NAME", "Первый шаг к безумию", "RU");
			LanguageAPI.Add("AETHERIUM_UNSTABLE_DESIGN_ACHIEVEMENT_DESC", "Убейте или погибните от совершенной лунной химеры.", "RU");
			LanguageAPI.Add("AETHERIUM_UNSTABLE_DESIGN_UNLOCKABLE_NAME", "Первый шаг к безумию", "RU");
		}
	}
	internal class ArsonistTranslation
	{
		public void ApplyArsonistTranslation()
		{
			string text = "POPCORN_ARSONIST_BODY_";
			string text2 = "Поджигатель — боец ближнего боя и танк, использующий огонь как средство достижения цели. Управляя шкалой Перегрева, он может наносить огромный урон по группам врагов. Баланс — ключ к победе." + Environment.NewLine + Environment.NewLine + "< ! > Ваши атаки становятся слабее при перегреве. Если ситуация критическая, «Очищение» может немедленно сбросить перегрев ценой увеличения времени перезарядки." + Environment.NewLine + Environment.NewLine + "< ! > Заряды Предвкушения Мазохизма накапливаются во время действия способности — активируйте её заранее и завершите с максимальной продолжительностью." + Environment.NewLine + Environment.NewLine + "< ! > Очищение может снять огненный дебафф с пассивки. Используйте его, чтобы выйти из беды.";
			string text3 = "...и он ушёл, с новой жаждой крови в пламени.";
			string text4 = "...и он исчез, с единственным сожалением: работа осталась незавершённой.";
			string text5 = "А у д и о з а п и с ь  с  л и ч н о г о  у с т р о й с т в а .\r\n\r\nП е ч а т ь  р а с ш и ф р о в к и . . .\r\n\r\nПоступить в UES оказалось легко. Особенно с их вакансиями.\r\n\r\nСпециалист по подрывам не так уж и отличается от того, чем я занимался до этого. И да, поджоги — это работа. Военные любезно оставили снаряжение Отряда Поджигателей, и я быстро понял, что они пытались создать. Позор, что программу закрыли.\r\n\r\nОни были гениями. Настоящими гениями, а UES назвали их психами. Мне удалось едва ли спасти остатки того, что не было уничтожено. Но из-за охраны у меня почти не было возможности протестировать свои доработки.\r\n\r\nКоллега сказал, что планируется задание. Спасательная операция на борту UES Safe Travels, курс — на неизведанную планету. Говорят, там живут ужасные твари.\r\n\r\nХм.\r\n\r\nМожет, и вправду стоит полететь. Отличные подопытные наверняка найдутся.\r\n\r\nК о н е ц  з а п и с и .\r\n\r\n";
			LanguageAPI.Add(text + "NAME", "Поджигатель", "RU");
			LanguageAPI.Add(text + "DESCRIPTION", text2, "RU");
			LanguageAPI.Add(text + "SUBTITLE", "Безумный поджигатель", "RU");
			LanguageAPI.Add(text + "LORE", text5, "RU");
			LanguageAPI.Add(text + "OUTRO_FLAVOR", text3, "RU");
			LanguageAPI.Add(text + "OUTRO_FAILURE", text4, "RU");
			LanguageAPI.Add(text + "DEFAULT_SKIN_NAME", "Поджигатель", "RU");
			LanguageAPI.Add(text + "MASTERY_SKIN_NAME", "Яппи", "RU");
			LanguageAPI.Add(text + "GRANDMASTERY_SKIN_NAME", "Огнетушитель", "RU");
			LanguageAPI.Add(text + "SURVIVAL_SKIN_NAME", "Анархист", "RU");
			LanguageAPI.Add(text + "PASSIVE_NAME", "Пиромания", "RU");
			LanguageAPI.Add(text + "PASSIVE_DESCRIPTION", "Снижает урон от огня. Преобразует одну атаку, наносящую более <style=cIsDamage>30%</style> здоровья, в <style=cIsDamage>50%</style> урона от огня с течением времени.", "RU");
			LanguageAPI.Add(text + "PASSIVE_NORMAL_GAUGE_NAME", "Базовая шкала", "RU");
			LanguageAPI.Add(text + "PASSIVE_NORMAL_GAUGE_DESCRIPTION", "Наносит <style=cIsDamage>100%</style> урона в белой зоне. Базовая шкала устойчива к перегреву.", "RU");
			LanguageAPI.Add(text + "PASSIVE_BLUE_GAUGE_NAME", "Сверхкритическая шкала", "RU");
			LanguageAPI.Add(text + "PASSIVE_BLUE_GAUGE_DESCRIPTION", $"Наносит <style=cIsDamage>{StaticValues.lowerDamageMultiplier * 100f}%</style> урона в белой зоне, <style=cIsDamage>{StaticValues.blueDamageMultiplier * 100f}%</style> в синей зоне. Максимальное тепло фиксировано.", "RU");
			LanguageAPI.Add(text + "PRIMARY_FIRESPRAY_NAME", "Огненный шар", "RU");
			LanguageAPI.Add(text + "PRIMARY_FIRESPRAY_DESCRIPTION", "<style=cIsUtility>Тепло. </style>" + $"Выпустите огненный шар, наносящий <style=cIsDamage>{100f * StaticValues.firesprayStrongDamageCoefficient}% урона</style> и поджигающий врагов при попадании.", "RU");
			LanguageAPI.Add(text + "ALT_PRIMARY_FIRESPRAY_NAME", "Форсаж", "RU");
			LanguageAPI.Add(text + "ALT_PRIMARY_FIRESPRAY_DESCRIPTION", "<style=cIsUtility>Тепло. </style><style=cIsUtility>Сверхкритический. </style>" + $"Выпустите огненный шар, наносящий <style=cIsDamage>{100f * StaticValues.altFiresprayStrongDamageCoefficient}% урона</style> и поджигающий врагов при попадании.", "RU");
			LanguageAPI.Add(text + "PRIMARY_FLAMETHROWER_NAME", "Дыхание дракона", "RU");
			LanguageAPI.Add(text + "PRIMARY_FLAMETHROWER_DESCRIPTION", $"Выпускает поток пламени, наносящий <style=cIsDamage>{100f * StaticValues.flamethrowerStrongDamageCoefficient}%</style> урона. Чем ближе вы к цели — тем выше шанс поджечь её.", "RU");
			LanguageAPI.Add(text + "PRIMARY_FIRESPRAY_SCEPTER_NAME", "Огненная буря", "RU");
			LanguageAPI.Add(text + "PRIMARY_FIRESPRAY_SCEPTER_DESCRIPTION", "<style=cIsUtility>Тепло. </style>Выпустите пробивающий луч жара, наносящий " + $"<style=cIsDamage>{100f * StaticValues.firesprayScepterStrongDamageCoefficient}% урона</style> и поджигающий врагов при попадании." + $"Если удерживать, то выстреливает разрушительный луч, наносящий <style=cIsDamage>{100f * StaticValues.firesprayScepterChargedMultiplier * StaticValues.firesprayScepterStrongDamageCoefficient}% урона</style> при отпускании.", "RU");
			LanguageAPI.Add(text + "PRIMARY_FLAMETHROWER_SCEPTER_NAME", "Упрёк Данте", "RU");
			LanguageAPI.Add(text + "PRIMARY_FLAMETHROWER_SCEPTER_DESCRIPTION", $"Выпускает мощный луч, наносящий <style=cIsDamage>{100f * StaticValues.flamethrowerScepterStrongDamageCoefficient}% урона</style>. " + "Чем ближе вы к врагу, тем выше шанс поджога. " + $"Если удерживать 2 секунды или дольше, то при отпускании выпускается финальный луч, наносящий <style=cIsDamage>{100f * StaticValues.flamethrowerScepterBlastDamageCoefficient}% урона</style>.", "RU");
			LanguageAPI.Add(text + "SECONDARY_FLAREGUN_NAME", "Сигнальная ракета", "RU");
			LanguageAPI.Add(text + "SECONDARY_FLAREGUN_DESCRIPTION", $"Выпустите ракету, наносящую <style=cIsDamage>{100f * StaticValues.flareStrongDamageCoefficient}%</style> урона в течение 5 секунд, после чего она взрывается, нанося <style=cIsDamage>{100f * StaticValues.flareStrongDamageCoefficient}%</style> урона и выпуская {Config.flareSalvoAmount.Value} мини-ракет, каждая из которых наносит <style=cIsDamage>{100f * StaticValues.flareStrongChildDamageCoefficient}%</style> урона.", "RU");
			LanguageAPI.Add(text + "SECONDARY_PUNCH_NAME", "Нулевая вспышка", "RU");
			LanguageAPI.Add(text + "SECONDARY_PUNCH_DESCRIPTION", "<style=cIsUtility>Подвижность. Тепло. </style>" + $"Рванитесь вперёд, нанося врагам позади <style=cIsDamage>{100f * StaticValues.zeropointpounchDamageCoefficient}% урона</style>. При столкновении с первым врагом вскоре после рывка наносит <style=cIsDamage>{100f * StaticValues.zeropointpounchDamageCoefficient}% урона</style> во вспышке вокруг Вас.", "RU");
			LanguageAPI.Add(text + "UTILITY_CLEANSE_NAME", "Очищение", "RU");
			LanguageAPI.Add(text + "UTILITY_CLEANSE_DESCRIPTION", "<style=cIsUtility>Подвижность. Тепло. </style>" + $"<style=cIsDamage>Поджигает</style> область вокруг, нанося <style=cIsDamage>{100f * StaticValues.cleanseDamageCoefficient}%</style> урона врагам и снимая все другие эффекты. Даёт небольшой бонус к скорости.", "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHIST_NAME", "Мазохизм", "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHIST_DESCRIPTION", "<style=cIsUtility>Подвижность. Тепло. </style>" + $"Урон от <style=cIsDamage>поджога</style> превращается в <style=cIsHealing>лечение</style> на {StaticValues.masochismBuffDuration} сек. Повышает скорость атаки на <style=cIsDamage>{100f * StaticValues.igniteAttackSpeedMultiplier}%</style>.", "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHISM_NAME", "Мазохизм", "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHISM_DESCRIPTION", "Достигнув порога " + Helpers.ImportantDesc("«предвкушения»") + ", периодически наносите себе урон в обмен на область поджога и " + Helpers.Healing("вампиризм") + ". " + string.Format("По прошествии макс. {0} сек., <style=cIsDamage>взорвитесь</style>, затем {1}.", Config.masochismMaximumStack.Value, Helpers.Downside("перегрев")), "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHISM_SURGE_NAME", "Злоба", "RU");
			LanguageAPI.Add(text + "SPECIAL_MASOCHISM_SURGE_DESCRIPTION", "Достигнув порога " + Helpers.ImportantDesc("Предвкушения") + ", вы ускоряетесь, " + string.Format("и получаете {0} и {1}. По прошествии макс. {2} сек., ", Helpers.ImportantDesc("Двойной выстрел"), Helpers.Healing("вампиризм"), Config.masochismMaximumStack.Value) + "<style=cIsDamage>взорвитесь</style>, затем " + Helpers.Downside("перегрев") + ".", "RU");
			LanguageAPI.Add(text + "KEYWORD_PASSIVE", "<style=cKeywordName>Тепло</style>Навыки увеличивают/уменьшают тепло. При максимуме Поджигатель перегревается, ослабляя способности и увеличивая перезарядку. Скорость атаки ускоряет охлаждение. Выбранная основная атака влияет на поведение шкалы.", "RU");
			LanguageAPI.Add(text + "KEYWORD_BASEGAUGE", "<style=cKeywordName>Базовая шкала</style>Шкала тепла увеличивается с уровня и предметов на заряды. Скорость охлаждения увеличивается при высоком уровне тепла.", "RU");
			LanguageAPI.Add(text + "KEYWORD_CRITICALGAUGE", "<style=cKeywordName>Сверхкритическая шкала</style>Шкала тепла не увеличивается, вместо неё растёт сверхкритическая. " + $"Наносит {StaticValues.blueDamageMultiplier}x урон при синей зоне шкалы.", "RU");
			LanguageAPI.Add(text + "KEYWORD_FIRESPRAYHEAT", "<style=cKeywordName>Тепло</style>" + $"Тратит <style=cIsDamage>{StaticValues.firesprayEnergyCost} тепла</style>. Урон и скорость ниже при перегреве.", "RU");
			LanguageAPI.Add(text + "KEYWORD_PRIMARYHEAT", "<style=cKeywordName>Тепло</style>Основная атака повышает тепло, остальные снижают. При максимуме — перегрев, снижая урон и скорость атаки.", "RU");
			LanguageAPI.Add(text + "KEYWORD_FLAREHEAT", "<style=cKeywordName>Тепло</style>" + $"Снижает тепло на <style=cIsDamage>{StaticValues.flareHeatReductionMultiplier}x</style> от текущего. Половинный урон при перегреве.", "RU");
			LanguageAPI.Add(text + "KEYWORD_ZEROPOINTHEAT", "<style=cKeywordName>Тепло</style>Охлаждает <style=cIsUtility>половину текущего тепла</style>. Половинный урон при перегреве.", "RU");
			LanguageAPI.Add(text + "KEYWORD_CLEANSEHEAT", "<style=cKeywordName>Тепло</style>Охлаждает <style=cIsUtility>половину общего тепла</style>. Ускоряет охлаждение при перегреве, но не поджигает.", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASOCHISMHEAT", "<style=cKeywordName>Тепло</style>" + $"Тратит <style=cIsDamage>{StaticValues.masochismEnergyCost} тепла</style>. Половина исцеления при перегреве.", "RU");
			LanguageAPI.Add(text + "KEYWORD_FLARENOTE", "Ракета не разделится, если не попадёт во врага, не будет наступлена или не сдетонирует рядом.", "RU");
			LanguageAPI.Add(text + "KEYWORD_PYROMANIAPASSIVE", "Пиромания не влияет на урон от падения, если не активна «хрупкость».", "RU");
			LanguageAPI.Add(text + "KEYWORD_BASEGAUGEPASSIVE", "Предметы на заряды увеличивают макс. тепло. Скорость атаки ускоряет охлаждение.", "RU");
			LanguageAPI.Add(text + "KEYWORD_SUPERCRITICALPASSIVE", "Предметы на заряды увеличивают синюю зону шкалы. Скорость атаки ускоряет охлаждение.", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_ANTICIPATION", "<style=cKeywordName>Предвкушение</style>" + $"За каждые 100 тепла, потерянного и/или накопленного, Поджигатель получает 1 заряд «предвкушения». При {Config.masochismMinimumRequiredToActivate.Value} зарядах можно активировать «мазохизм». Дополнительные заряды увеличивают урон и длительность. Все заряды сгорают в конце.", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_ANTICIPATION_SPITE", "<style=cKeywordName>Предвкушение</style>" + $"За каждые 100 тепла, потерянного и/или накопленного, Поджигатель получает 1 заряд «предвкушения». При {Config.masochismMinimumRequiredToActivate.Value} зарядах можно активировать «злобу». Дополнительные заряды увеличивают урон и длительность. Кол-во снятых зарядов зависит от времени в состоянии.", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_LIFESTEAL", "<style=cKeywordName>Вампиризм</style>Поджигатель лечится на " + Helpers.Healing($"{100f * Config.masochismActiveMultipliedActive.Value}%") + " от нанесённого урона во время «мазохизма».", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_SURGE_LIFESTEAL", "<style=cKeywordName>Вампиризм</style>Поджигатель лечится на " + Helpers.Healing($"{100f * Config.masochismSurgeHealOnHitPercentage.Value}%") + " от нанесённого урона во время Злобы.", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_DETONATE", $"<style=cKeywordName>Взрыв</style>Поджигатель взрывается, нанося <style=cIsDamage>{100f * StaticValues.masochismFinalBlastCoefficient}% урона</style> за каждый заряд «предвкушения».", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_DETONATE_SPITE", $"<style=cKeywordName>Взрыв</style>Поджигатель взрывается, нанося <style=cIsDamage>{100f * StaticValues.masochismSurgeFinalBlastCoefficient}% урона</style> за каждый заряд «предвкушения».", "RU");
			LanguageAPI.Add(text + "KEYWORD_MASO_DOUBLE_TAP", "<style=cKeywordName>Двойной выстрел</style>Выстреливает две пули за стоимость одной по теплу.", "RU");
			LanguageAPI.Add(text + "KEYWORD_OVE