Decompiled source of UltrakULL Apodidae Remix v1.0.0
UltrakULL.dll
Decompiled 5 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using ArabicSupportUnity; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Discord; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Sandbox; using SettingsMenu.Components; using TMPro; using UltrakULL.Harmony_Patches; using UltrakULL.audio; using UltrakULL.json; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("UltrakULL")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("UltrakULL")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("a4a60eef-e5f3-4a77-b125-236fbf44cca4")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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; } } } internal enum IsolatedArabicLetters { Hamza = 65152, Alef = 65165, AlefHamza = 65155, WawHamza = 65157, AlefMaksoor = 65159, AlefMaksora = 64508, HamzaNabera = 65161, Ba = 65167, Ta = 65173, Tha2 = 65177, Jeem = 65181, H7aa = 65185, Khaa2 = 65189, Dal = 65193, Thal = 65195, Ra2 = 65197, Zeen = 65199, Seen = 65201, Sheen = 65205, S9a = 65209, Dha = 65213, T6a = 65217, T6ha = 65221, Ain = 65225, Gain = 65229, Fa = 65233, Gaf = 65237, Kaf = 65241, Lam = 65245, Meem = 65249, Noon = 65253, Ha = 65257, Waw = 65261, Ya = 65265, AlefMad = 65153, TaMarboota = 65171, PersianPe = 64342, PersianChe = 64378, PersianZe = 64394, PersianGaf = 64402, PersianGaf2 = 64398, PersianYeh = 64508 } internal enum GeneralArabicLetters { Hamza = 1569, Alef = 1575, AlefHamza = 1571, WawHamza = 1572, AlefMaksoor = 1573, AlefMagsora = 1609, HamzaNabera = 1574, Ba = 1576, Ta = 1578, Tha2 = 1579, Jeem = 1580, H7aa = 1581, Khaa2 = 1582, Dal = 1583, Thal = 1584, Ra2 = 1585, Zeen = 1586, Seen = 1587, Sheen = 1588, S9a = 1589, Dha = 1590, T6a = 1591, T6ha = 1592, Ain = 1593, Gain = 1594, Fa = 1601, Gaf = 1602, Kaf = 1603, Lam = 1604, Meem = 1605, Noon = 1606, Ha = 1607, Waw = 1608, Ya = 1610, AlefMad = 1570, TaMarboota = 1577, PersianPe = 1662, PersianChe = 1670, PersianZe = 1688, PersianGaf = 1711, PersianGaf2 = 1705, PersianYeh = 1740 } internal struct ArabicMapping { public int from; public int to; public ArabicMapping(int from, int to) { this.from = from; this.to = to; } } internal class ArabicTable { private static ArabicMapping[] mapList; private static ArabicTable arabicMapper; internal static ArabicTable ArabicMapper { get { if (arabicMapper == null) { arabicMapper = new ArabicTable(); } return arabicMapper; } } private ArabicTable() { mapList = new ArabicMapping[42] { new ArabicMapping(1569, 65152), new ArabicMapping(1575, 65165), new ArabicMapping(1571, 65155), new ArabicMapping(1572, 65157), new ArabicMapping(1573, 65159), new ArabicMapping(1609, 64508), new ArabicMapping(1574, 65161), new ArabicMapping(1576, 65167), new ArabicMapping(1578, 65173), new ArabicMapping(1579, 65177), new ArabicMapping(1580, 65181), new ArabicMapping(1581, 65185), new ArabicMapping(1582, 65189), new ArabicMapping(1583, 65193), new ArabicMapping(1584, 65195), new ArabicMapping(1585, 65197), new ArabicMapping(1586, 65199), new ArabicMapping(1587, 65201), new ArabicMapping(1588, 65205), new ArabicMapping(1589, 65209), new ArabicMapping(1590, 65213), new ArabicMapping(1591, 65217), new ArabicMapping(1592, 65221), new ArabicMapping(1593, 65225), new ArabicMapping(1594, 65229), new ArabicMapping(1601, 65233), new ArabicMapping(1602, 65237), new ArabicMapping(1603, 65241), new ArabicMapping(1604, 65245), new ArabicMapping(1605, 65249), new ArabicMapping(1606, 65253), new ArabicMapping(1607, 65257), new ArabicMapping(1608, 65261), new ArabicMapping(1610, 65265), new ArabicMapping(1570, 65153), new ArabicMapping(1577, 65171), new ArabicMapping(1662, 64342), new ArabicMapping(1670, 64378), new ArabicMapping(1688, 64394), new ArabicMapping(1711, 64402), new ArabicMapping(1705, 64398), new ArabicMapping(1740, 64508) }; } internal int Convert(int toBeConverted) { for (int i = 0; i < mapList.Length; i++) { ArabicMapping arabicMapping = mapList[i]; if (arabicMapping.from == toBeConverted) { return arabicMapping.to; } } return toBeConverted; } } internal class TashkeelLocation { public char tashkeel; public int position; public TashkeelLocation(char tashkeel, int position) { this.tashkeel = tashkeel; this.position = position; } } internal class ArabicFixerTool { internal static bool showTashkeel = true; internal static bool combineTashkeel = true; internal static bool useHinduNumbers = true; internal static StringBuilder internalStringBuilder = new StringBuilder(); internal static void RemoveTashkeel(ref string str, out List<TashkeelLocation> tashkeelLocation) { tashkeelLocation = new List<TashkeelLocation>(); int lastSplitIndex = 0; internalStringBuilder.Clear(); internalStringBuilder.EnsureCapacity(str.Length); int num = 0; for (int i = 0; i < str.Length; i++) { if (str[i] == '\u064b') { tashkeelLocation.Add(new TashkeelLocation('\u064b', i)); num++; IncrementSB(ref str, i); } else if (str[i] == '\u064c') { tashkeelLocation.Add(new TashkeelLocation('\u064c', i)); num++; IncrementSB(ref str, i); } else if (str[i] == '\u064d') { tashkeelLocation.Add(new TashkeelLocation('\u064d', i)); num++; IncrementSB(ref str, i); } else if (str[i] == '\u064e') { if (num > 0 && combineTashkeel && tashkeelLocation[num - 1].tashkeel == '\u0651') { tashkeelLocation[num - 1].tashkeel = 'ﱠ'; IncrementSB(ref str, i); } else { tashkeelLocation.Add(new TashkeelLocation('\u064e', i)); num++; IncrementSB(ref str, i); } } else if (str[i] == '\u064f') { if (num > 0 && combineTashkeel && tashkeelLocation[num - 1].tashkeel == '\u0651') { tashkeelLocation[num - 1].tashkeel = 'ﱡ'; IncrementSB(ref str, i); } else { tashkeelLocation.Add(new TashkeelLocation('\u064f', i)); num++; IncrementSB(ref str, i); } } else if (str[i] == '\u0650') { if (num > 0 && combineTashkeel && tashkeelLocation[num - 1].tashkeel == '\u0651') { tashkeelLocation[num - 1].tashkeel = 'ﱢ'; IncrementSB(ref str, i); } else { tashkeelLocation.Add(new TashkeelLocation('\u0650', i)); num++; IncrementSB(ref str, i); } } else if (str[i] == '\u0651') { if (num > 0 && combineTashkeel) { if (tashkeelLocation[num - 1].tashkeel == '\u064e') { tashkeelLocation[num - 1].tashkeel = 'ﱠ'; IncrementSB(ref str, i); continue; } if (tashkeelLocation[num - 1].tashkeel == '\u064f') { tashkeelLocation[num - 1].tashkeel = 'ﱡ'; IncrementSB(ref str, i); continue; } if (tashkeelLocation[num - 1].tashkeel == '\u0650') { tashkeelLocation[num - 1].tashkeel = 'ﱢ'; IncrementSB(ref str, i); continue; } } tashkeelLocation.Add(new TashkeelLocation('\u0651', i)); num++; IncrementSB(ref str, i); } else if (str[i] == '\u0652') { tashkeelLocation.Add(new TashkeelLocation('\u0652', i)); num++; IncrementSB(ref str, i); } else if (str[i] == '\u0653') { tashkeelLocation.Add(new TashkeelLocation('\u0653', i)); num++; IncrementSB(ref str, i); } else if (str[i] == 'ﱠ') { IncrementSB(ref str, i); } else if (str[i] == 'ﱡ') { IncrementSB(ref str, i); } else if (str[i] == 'ﱢ') { IncrementSB(ref str, i); } } if (lastSplitIndex != 0) { IncrementSB(ref str, str.Length); str = internalStringBuilder.ToString(); } void IncrementSB(ref string reference, int num2) { if (num2 - lastSplitIndex > 0) { internalStringBuilder.Append(reference, lastSplitIndex, num2 - lastSplitIndex); } lastSplitIndex = num2 + 1; } } internal static void ReturnTashkeel(ref char[] letters, List<TashkeelLocation> tashkeelLocation) { Array.Resize(ref letters, letters.Length + tashkeelLocation.Count); for (int i = 0; i < tashkeelLocation.Count; i++) { TashkeelLocation tashkeelLocation2 = tashkeelLocation[i]; for (int num = letters.Length - 1; num > tashkeelLocation2.position; num--) { letters[num] = letters[num - 1]; } letters[tashkeelLocation2.position] = tashkeelLocation2.tashkeel; } } internal static string FixLine(string str) { RemoveTashkeel(ref str, out var tashkeelLocation); char[] array = new char[str.Length]; char[] letters = str.ToCharArray(); for (int i = 0; i < array.Length; i++) { array[i] = (char)ArabicTable.ArabicMapper.Convert(str[i]); } for (int j = 0; j < array.Length; j++) { bool flag = false; if (array[j] == 'ﻝ' && j < array.Length - 1) { if (array[j + 1] == 'ﺇ') { array[j] = 'ﻷ'; letters[j + 1] = '\uffff'; flag = true; } else if (array[j + 1] == 'ﺍ') { array[j] = 'ﻹ'; letters[j + 1] = '\uffff'; flag = true; } else if (array[j + 1] == 'ﺃ') { array[j] = 'ﻵ'; letters[j + 1] = '\uffff'; flag = true; } else if (array[j + 1] == 'ﺁ') { array[j] = 'ﻳ'; letters[j + 1] = '\uffff'; flag = true; } } if (!IsIgnoredCharacter(array[j])) { if (IsMiddleLetter(array, j)) { letters[j] = (char)(array[j] + 3); } else if (IsFinishingLetter(array, j)) { letters[j] = (char)(array[j] + 1); } else if (IsLeadingLetter(array, j)) { letters[j] = (char)(array[j] + 2); } } if (flag) { j++; } letters[j] = (char)HandleInduNumber(array[j], letters[j]); } if (showTashkeel && tashkeelLocation.Count > 0) { ReturnTashkeel(ref letters, tashkeelLocation); } internalStringBuilder.Clear(); internalStringBuilder.EnsureCapacity(letters.Length); List<char> numberList = null; for (int num = letters.Length - 1; num >= 0; num--) { if (char.IsPunctuation(letters[num]) && num > 0 && num < letters.Length - 1 && (char.IsPunctuation(letters[num - 1]) || char.IsPunctuation(letters[num + 1]))) { if (letters[num] != '\uffff') { internalStringBuilder.Append(letters[num]); } } else if (letters[num] == ' ' && num > 0 && num < letters.Length - 1 && (char.IsLower(letters[num - 1]) || char.IsUpper(letters[num - 1]) || char.IsNumber(letters[num - 1])) && (char.IsLower(letters[num + 1]) || char.IsUpper(letters[num + 1]) || char.IsNumber(letters[num + 1]))) { AddNumber(letters[num]); } else if (char.IsNumber(letters[num]) || char.IsLower(letters[num]) || char.IsUpper(letters[num]) || char.IsSymbol(letters[num]) || char.IsPunctuation(letters[num])) { AddNumber(letters[num]); } else if ((letters[num] >= '\ud800' && letters[num] <= '\udbff') || (letters[num] >= '\udc00' && letters[num] <= '\udfff')) { AddNumber(letters[num]); } else { AppendNumbers(); if (letters[num] != '\uffff') { internalStringBuilder.Append(letters[num]); } } } AppendNumbers(); return internalStringBuilder.ToString(); void AddNumber(char value) { if (numberList == null) { numberList = new List<char>(); } numberList.Add(value); } void AppendNumbers() { if (numberList != null && numberList.Count > 0) { for (int k = 0; k < numberList.Count; k++) { internalStringBuilder.Append(numberList[numberList.Count - 1 - k]); } numberList.Clear(); } } } internal static ushort HandleInduNumber(ushort letterOrigin, ushort letterFinal) { return letterOrigin switch { 48 => 1632, 49 => 1633, 50 => 1634, 51 => 1635, 52 => 1636, 53 => 1637, 54 => 1638, 55 => 1639, 56 => 1640, 57 => 1641, _ => letterFinal, }; } internal static bool IsIgnoredCharacter(char ch) { bool flag = char.IsPunctuation(ch); bool flag2 = char.IsNumber(ch); bool flag3 = char.IsLower(ch); bool flag4 = char.IsUpper(ch); bool flag5 = char.IsSymbol(ch); bool flag6 = ch == 'ﭖ' || ch == 'ﭺ' || ch == 'ﮊ' || ch == 'ﮒ' || ch == 'ﮎ'; bool flag7 = ch <= '\ufeff' && ch >= 'ﹰ'; bool flag8 = flag7 || flag6 || ch == 'ﯼ'; return flag || flag2 || flag3 || flag4 || flag5 || !flag8 || ch == 'a' || ch == '>' || ch == '<' || ch == '؛'; } internal static bool IsLeadingLetter(char[] letters, int index) { bool flag = index == 0 || letters[index - 1] == ' ' || char.IsPunctuation(letters[index - 1]) || letters[index - 1] == 'ﺍ' || letters[index - 1] == 'ﺩ' || letters[index - 1] == 'ﺫ' || letters[index - 1] == 'ﺭ' || letters[index - 1] == 'ﺯ' || letters[index - 1] == 'ﮊ' || letters[index - 1] == 'ﻭ' || letters[index - 1] == 'ﺁ' || letters[index - 1] == 'ﺃ' || letters[index - 1] == 'ﺀ' || letters[index - 1] == 'ﺇ' || letters[index - 1] == 'ﺅ'; bool flag2 = letters[index] != ' ' && letters[index] != 'ﺩ' && letters[index] != 'ﺫ' && letters[index] != 'ﺭ' && letters[index] != 'ﺯ' && letters[index] != 'ﮊ' && letters[index] != 'ﺍ' && letters[index] != 'ﺃ' && letters[index] != 'ﺇ' && letters[index] != 'ﺁ' && letters[index] != 'ﺅ' && letters[index] != 'ﻭ' && letters[index] != 'ﺀ'; bool flag3 = index < letters.Length - 1 && letters[index + 1] != ' ' && letters[index + 1] != '\n' && letters[index + 1] != '\r' && !char.IsPunctuation(letters[index + 1]) && !char.IsNumber(letters[index + 1]) && !char.IsSymbol(letters[index + 1]) && !char.IsLower(letters[index + 1]) && !char.IsUpper(letters[index + 1]) && letters[index + 1] != 'ﺀ'; if (flag && flag2 && flag3) { return true; } return false; } internal static bool IsFinishingLetter(char[] letters, int index) { bool flag = index != 0; bool flag2 = index != 0 && letters[index - 1] != ' ' && letters[index - 1] != 'ﺩ' && letters[index - 1] != 'ﺫ' && letters[index - 1] != 'ﺭ' && letters[index - 1] != 'ﺯ' && letters[index - 1] != 'ﮊ' && letters[index - 1] != 'ﻭ' && letters[index - 1] != 'ﺍ' && letters[index - 1] != 'ﺁ' && letters[index - 1] != 'ﺃ' && letters[index - 1] != 'ﺇ' && letters[index - 1] != 'ﺅ' && letters[index - 1] != 'ﺀ' && !char.IsPunctuation(letters[index - 1]) && !char.IsSymbol(letters[index - 1]); bool flag3 = letters[index] != ' ' && letters[index] != 'ﺀ'; if (flag2 && flag3) { return true; } return false; } internal static bool IsMiddleLetter(char[] letters, int index) { bool flag = index != 0 && letters[index] != 'ﺍ' && letters[index] != 'ﺩ' && letters[index] != 'ﺫ' && letters[index] != 'ﺭ' && letters[index] != 'ﺯ' && letters[index] != 'ﮊ' && letters[index] != 'ﻭ' && letters[index] != 'ﺁ' && letters[index] != 'ﺃ' && letters[index] != 'ﺇ' && letters[index] != 'ﺅ' && letters[index] != 'ﺀ'; bool flag2 = index != 0 && letters[index - 1] != 'ﺍ' && letters[index - 1] != 'ﺩ' && letters[index - 1] != 'ﺫ' && letters[index - 1] != 'ﺭ' && letters[index - 1] != 'ﺯ' && letters[index - 1] != 'ﮊ' && letters[index - 1] != 'ﻭ' && letters[index - 1] != 'ﺁ' && letters[index - 1] != 'ﺃ' && letters[index - 1] != 'ﺇ' && letters[index - 1] != 'ﺅ' && letters[index - 1] != 'ﺀ' && !char.IsPunctuation(letters[index - 1]) && letters[index - 1] != '>' && letters[index - 1] != '<' && letters[index - 1] != ' ' && letters[index - 1] != '*'; bool flag3 = index < letters.Length - 1 && letters[index + 1] != ' ' && letters[index + 1] != '\r' && letters[index + 1] != 'ﺀ' && !char.IsNumber(letters[index + 1]) && !char.IsSymbol(letters[index + 1]) && !char.IsPunctuation(letters[index + 1]); if (flag3 && flag2 && flag) { try { if (char.IsPunctuation(letters[index + 1])) { return false; } return true; } catch { return false; } } return false; } } namespace UltrakULL { public static class CommonFunctions { private static readonly Dictionary<string, string> LocalizedInputs = new Dictionary<string, string> { { "space", LanguageManager.CurrentLanguage.inputStrings.input_space }, { "enter", LanguageManager.CurrentLanguage.inputStrings.input_enter }, { "tab", LanguageManager.CurrentLanguage.inputStrings.input_tab }, { "escape", LanguageManager.CurrentLanguage.inputStrings.input_esc }, { "leftshift", LanguageManager.CurrentLanguage.inputStrings.input_leftShift }, { "rightshift", LanguageManager.CurrentLanguage.inputStrings.input_rightShift }, { "leftcontrol", LanguageManager.CurrentLanguage.inputStrings.input_leftControl }, { "leftctrl", LanguageManager.CurrentLanguage.inputStrings.input_leftCtrl }, { "rightcontrol", LanguageManager.CurrentLanguage.inputStrings.input_rightControl }, { "rightctrl", LanguageManager.CurrentLanguage.inputStrings.input_rightCtrl }, { "leftalt", LanguageManager.CurrentLanguage.inputStrings.input_leftAlt }, { "rightalt", LanguageManager.CurrentLanguage.inputStrings.input_rightAlt }, { "leftmeta", LanguageManager.CurrentLanguage.inputStrings.input_leftMeta }, { "rightmeta", LanguageManager.CurrentLanguage.inputStrings.input_rightMeta }, { "leftbracket", LanguageManager.CurrentLanguage.inputStrings.input_leftBracket }, { "rightbracket", LanguageManager.CurrentLanguage.inputStrings.input_rightBracket }, { "lmb", LanguageManager.CurrentLanguage.inputStrings.input_LMB }, { "rmb", LanguageManager.CurrentLanguage.inputStrings.input_RMB }, { "mmb", LanguageManager.CurrentLanguage.inputStrings.input_MMB }, { "uparrow", LanguageManager.CurrentLanguage.inputStrings.input_arrowUp }, { "downarrow", LanguageManager.CurrentLanguage.inputStrings.input_arrowDown }, { "leftarrow", LanguageManager.CurrentLanguage.inputStrings.input_arrowLeft }, { "rightarrow", LanguageManager.CurrentLanguage.inputStrings.input_arrowRight }, { "forward", LanguageManager.CurrentLanguage.inputStrings.input_forward }, { "back", LanguageManager.CurrentLanguage.inputStrings.input_back }, { "comma", LanguageManager.CurrentLanguage.inputStrings.input_comma }, { "capslock", LanguageManager.CurrentLanguage.inputStrings.input_capsLock }, { "slash", LanguageManager.CurrentLanguage.inputStrings.input_slash }, { "backslash", LanguageManager.CurrentLanguage.inputStrings.input_backslash }, { "backspace", LanguageManager.CurrentLanguage.inputStrings.input_backspace }, { "equals", LanguageManager.CurrentLanguage.inputStrings.input_equals }, { "minus", LanguageManager.CurrentLanguage.inputStrings.input_minus }, { "numlock", LanguageManager.CurrentLanguage.inputStrings.input_numLock }, { "delete", LanguageManager.CurrentLanguage.inputStrings.input_delete }, { "period", LanguageManager.CurrentLanguage.inputStrings.input_period }, { "semicolon", LanguageManager.CurrentLanguage.inputStrings.input_semicolon }, { "quote", LanguageManager.CurrentLanguage.inputStrings.input_quote }, { "insert", LanguageManager.CurrentLanguage.inputStrings.input_insert }, { "pageup", LanguageManager.CurrentLanguage.inputStrings.input_pageUp }, { "pagedown", LanguageManager.CurrentLanguage.inputStrings.input_pageDown }, { "start", LanguageManager.CurrentLanguage.inputStrings.input_start }, { "end", LanguageManager.CurrentLanguage.inputStrings.input_end }, { "scrolllock", LanguageManager.CurrentLanguage.inputStrings.input_scrollLock }, { "pause", LanguageManager.CurrentLanguage.inputStrings.input_pause }, { "nobinding", LanguageManager.CurrentLanguage.inputStrings.input_noBinding } }; public static ColorBlock UkButtonColors; public static string PreviousHudMessage; private static readonly Dictionary<string, GameObject> rootObjectCache; private static readonly Dictionary<(GameObject, string), GameObject> childCache; public static string GetLocalizedInput(string input) { if (string.IsNullOrEmpty(input)) { return input; } if (input.Length == 1 && char.IsLetter(input[0])) { return input; } string text = input.Replace(" ", "").ToLowerInvariant(); InputStrings inputStrings = LanguageManager.CurrentLanguage.inputStrings; string value; switch (text) { case "numpadperiod": value = inputStrings.input_numpadPeriod; break; case "numpaddivide": value = inputStrings.input_numpadDivide; break; case "numpadmultiply": value = inputStrings.input_numpadMultiply; break; case "numpadminus": value = inputStrings.input_numpadMinus; break; case "numpadenter": value = inputStrings.input_numpadEnter; break; case "numpadplus": value = inputStrings.input_numpadPlus; break; default: if (text.StartsWith("numpad")) { value = (string.IsNullOrEmpty(inputStrings.input_numpad) ? null : (inputStrings.input_numpad + text.Substring(6))); } else { LocalizedInputs.TryGetValue(text, out value); } break; } return string.IsNullOrEmpty(value) ? input : value; } public static bool isUsingEnglish() { return LanguageManager.CurrentLanguage.metadata.langDisplayName == "English"; } public static string MakeVertical(string input) { return string.IsNullOrEmpty(input) ? input : string.Join("\n", input); } public static IEnumerator WaitforSeconds(float seconds) { yield return (object)new WaitForSeconds(seconds); } public static void HandleError(Exception e, string missingID = "") { Logging.Error(e.ToString()); } public static void ClearObjectCaches(Scene scene, LoadSceneMode mode) { rootObjectCache.Clear(); childCache.Clear(); } public static GameObject GetInactiveRootObject(string objectName) { //IL_0039: 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) if (rootObjectCache.TryGetValue(objectName, out var value)) { if ((Object)(object)value != (Object)null) { return value; } rootObjectCache.Remove(objectName); } List<GameObject> list = new List<GameObject>(); Scene activeScene = SceneManager.GetActiveScene(); ((Scene)(ref activeScene)).GetRootGameObjects(list); foreach (GameObject item in list) { if ((Object)(object)item != (Object)null && ((Object)item).name == objectName) { rootObjectCache[objectName] = item; return item; } } return null; } public static string GetCurrentSceneName() { return SceneHelper.CurrentScene; } public static GameObject CreateButton(string buttonText = "Text", string buttonName = "Button") { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Expected O, but got Unknown //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) ColorBlock val = default(ColorBlock); ((ColorBlock)(ref val)).normalColor = new Color(0f, 0f, 0f, 0.512f); ((ColorBlock)(ref val)).highlightedColor = new Color(1f, 1f, 1f, 0.502f); ((ColorBlock)(ref val)).pressedColor = new Color(1f, 0f, 0f, 1f); ((ColorBlock)(ref val)).selectedColor = new Color(0f, 0f, 0f, 0.512f); ((ColorBlock)(ref val)).disabledColor = new Color(0.7843f, 0.7843f, 0.7843f, 0.502f); ((ColorBlock)(ref val)).colorMultiplier = 1f; ((ColorBlock)(ref val)).fadeDuration = 0.1f; ColorBlock colors = val; GameObject val2 = new GameObject(); ((Object)val2).name = buttonName; val2.AddComponent<RectTransform>(); val2.AddComponent<CanvasRenderer>(); val2.AddComponent<Image>(); val2.AddComponent<Button>(); val2.GetComponent<RectTransform>().sizeDelta = new Vector2(200f, 50f); val2.GetComponent<RectTransform>().anchorMax = new Vector2(1f, 1f); val2.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0f); val2.GetComponent<Image>().type = (Type)1; ((Selectable)val2.GetComponent<Button>()).targetGraphic = (Graphic)(object)val2.GetComponent<Image>(); GameObject val3 = CreateText(); ((Selectable)val2.GetComponent<Button>()).colors = colors; ((Object)val3).name = "Text"; ((Transform)val3.GetComponent<RectTransform>()).SetParent((Transform)(object)val2.GetComponent<RectTransform>()); val3.GetComponent<RectTransform>().anchorMax = new Vector2(1f, 1f); val3.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0f); val3.GetComponent<RectTransform>().sizeDelta = Vector2.zero; val3.GetComponent<Text>().text = buttonText; val3.GetComponent<Text>().fontSize = 32; val3.GetComponent<Text>().alignment = (TextAnchor)4; ((Graphic)val3.GetComponent<Text>()).color = Color.white; return val2; } public static GameObject CreateText() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(); ((Object)val).name = "Text"; val.AddComponent<RectTransform>(); val.AddComponent<CanvasRenderer>(); val.GetComponent<RectTransform>().sizeDelta = new Vector2(200f, 50f); val.GetComponent<RectTransform>().anchorMax = new Vector2(1f, 1f); val.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0f); val.AddComponent<Text>(); val.GetComponent<Text>().text = "Text"; val.GetComponent<Text>().fontSize = 32; val.GetComponent<Text>().alignment = (TextAnchor)4; ((Graphic)val.GetComponent<Text>()).color = Color.black; return val; } public static void PatchResultsScreen(string name, string challenge) { GameObject parentObject = GameObject.Find("Player"); GameObject parentObject2 = FindDescendant(parentObject, "Main Camera", "HUD Camera", "HUD", "FinishCanvas", "Panel"); GameObject parentObject3 = FindDescendant(parentObject2, "Title"); TextMeshProUGUI textMeshProUGUI = GetTextMeshProUGUI(FindDescendant(parentObject3, "Text")); ((TMP_Text)textMeshProUGUI).text = name; LevelNameFinder component = ((Component)textMeshProUGUI).GetComponent<LevelNameFinder>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } TextMeshProUGUI textMeshProUGUI2 = GetTextMeshProUGUI(FindDescendant(parentObject2, "ff", "Text")); ((TMP_Text)textMeshProUGUI2).text = LanguageManager.CurrentLanguage.misc.stats_time; TextMeshProUGUI textMeshProUGUI3 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Kills - Info", "Text")); ((TMP_Text)textMeshProUGUI3).text = LanguageManager.CurrentLanguage.misc.stats_kills; TextMeshProUGUI textMeshProUGUI4 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Style - Info", "Text")); ((TMP_Text)textMeshProUGUI4).text = LanguageManager.CurrentLanguage.misc.stats_style; TextMeshProUGUI textMeshProUGUI5 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Secrets - Title", "Text")); ((TMP_Text)textMeshProUGUI5).text = LanguageManager.CurrentLanguage.misc.stats_secrets; TextMeshProUGUI textMeshProUGUI6 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Challenge - Title", "Text")); ((TMP_Text)textMeshProUGUI6).text = LanguageManager.CurrentLanguage.misc.stats_challenge; TextMeshProUGUI textMeshProUGUI7 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Challenge", "ChallengeText")); ((TMP_Text)textMeshProUGUI7).text = challenge; TextMeshProUGUI textMeshProUGUI8 = GetTextMeshProUGUI(FindDescendant(parentObject2, "Total Points", "Text (1)")); ((TMP_Text)textMeshProUGUI8).text = LanguageManager.CurrentLanguage.cyberGrind.cybergrind_total + ":"; } public static GameObject FindDescendant(GameObject parentObject, params string[] childPath) { if ((Object)(object)parentObject == (Object)null || childPath == null || childPath.Length == 0) { return null; } GameObject val = parentObject; foreach (string childToFind in childPath) { val = GetGameObjectChild(val, childToFind); if ((Object)(object)val == (Object)null) { return null; } } return val; } public static GameObject GetGameObjectChild(GameObject parentObject, string childToFind) { if ((Object)(object)parentObject == (Object)null) { return null; } (GameObject, string) key = (parentObject, childToFind); if (childCache.TryGetValue(key, out var value)) { if ((Object)(object)value != (Object)null) { return value; } childCache.Remove(key); } Transform val = parentObject.transform.Find(childToFind); GameObject val2 = (((Object)(object)val != (Object)null) ? ((Component)val).gameObject : null); childCache[key] = val2; return val2; } public static Text GetTextfromGameObject(GameObject objectToUse) { return ((Object)(object)objectToUse == (Object)null) ? null : objectToUse.GetComponent<Text>(); } public static TextMeshProUGUI GetTextMeshProUGUI(GameObject objectToUse) { return ((Object)(object)objectToUse == (Object)null) ? null : objectToUse.GetComponent<TextMeshProUGUI>(); } public static IEnumerable<CodeInstruction> IL(params (OpCode, object)[] instructions) { return ((IEnumerable<(OpCode, object)>)instructions).Select((Func<(OpCode, object), CodeInstruction>)(((OpCode, object) i) => new CodeInstruction(i.Item1, i.Item2))).ToList(); } public static GameObject GetObject(string path) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) string text = null; string rootPath; if (!path.Contains('/')) { rootPath = path; } else { string[] array = path.Split(new char[1] { '/' }, 2); rootPath = array[0]; text = array[1]; } List<GameObject> list = new List<GameObject>(); GameObject val = null; Scene activeScene = SceneManager.GetActiveScene(); ((Scene)(ref activeScene)).GetRootGameObjects(list); foreach (GameObject item in list.Where((GameObject child) => ((Object)child).name == rootPath)) { val = item; } if ((Object)(object)val == (Object)null) { return null; } return (text == null) ? val : ((Component)val.transform.Find(text)).gameObject; } static CommonFunctions() { //IL_04cb: Unknown result type (might be due to invalid IL or missing references) //IL_04e7: Unknown result type (might be due to invalid IL or missing references) //IL_0508: Unknown result type (might be due to invalid IL or missing references) //IL_0529: Unknown result type (might be due to invalid IL or missing references) //IL_054a: Unknown result type (might be due to invalid IL or missing references) //IL_056b: Unknown result type (might be due to invalid IL or missing references) //IL_0590: Unknown result type (might be due to invalid IL or missing references) //IL_0591: Unknown result type (might be due to invalid IL or missing references) ColorBlock ukButtonColors = default(ColorBlock); ((ColorBlock)(ref ukButtonColors)).normalColor = new Color(0f, 0f, 0f, 0.512f); ((ColorBlock)(ref ukButtonColors)).highlightedColor = new Color(1f, 1f, 1f, 0.502f); ((ColorBlock)(ref ukButtonColors)).pressedColor = new Color(1f, 0f, 0f, 1f); ((ColorBlock)(ref ukButtonColors)).selectedColor = new Color(0f, 0f, 0f, 0.512f); ((ColorBlock)(ref ukButtonColors)).disabledColor = new Color(0.7843f, 0.7843f, 0.7843f, 0.502f); ((ColorBlock)(ref ukButtonColors)).colorMultiplier = 1f; ((ColorBlock)(ref ukButtonColors)).fadeDuration = 0.1f; UkButtonColors = ukButtonColors; rootObjectCache = new Dictionary<string, GameObject>(); childCache = new Dictionary<(GameObject, string), GameObject>(); } } public static class Core { public static bool wasLanguageReset = false; private static readonly HttpClient Client = new HttpClient(); public static void PatchFrontEnd(GameObject frontEnd) { MainMenu.Patch(frontEnd); Options options = new Options(ref frontEnd); } public static void PatchPauseMenu(ref GameObject canvasObj) { try { GameObject parentObject = CommonFunctions.FindDescendant(canvasObj, "PauseMenu"); TextMeshProUGUI textMeshProUGUI = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Text")); ((TMP_Text)textMeshProUGUI).text = "-- " + LanguageManager.CurrentLanguage.pauseMenu.pause_title + " --"; TextMeshProUGUI textMeshProUGUI2 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Resume", "Text")); ((TMP_Text)textMeshProUGUI2).text = LanguageManager.CurrentLanguage.pauseMenu.pause_resume; TextMeshProUGUI textMeshProUGUI3 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Restart Checkpoint", "Text")); ((TMP_Text)textMeshProUGUI3).text = LanguageManager.CurrentLanguage.pauseMenu.pause_respawn; if (CommonFunctions.GetCurrentSceneName().Contains("Intermission")) { ((TMP_Text)textMeshProUGUI3).text = LanguageManager.CurrentLanguage.pauseMenu.pause_skip; } TextMeshProUGUI textMeshProUGUI4 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Restart Mission", "Text")); ((TMP_Text)textMeshProUGUI4).text = LanguageManager.CurrentLanguage.pauseMenu.pause_restart; TextMeshProUGUI textMeshProUGUI5 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Options", "Text")); ((TMP_Text)textMeshProUGUI5).text = LanguageManager.CurrentLanguage.pauseMenu.pause_options; TextMeshProUGUI textMeshProUGUI6 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Quit Mission", "Text")); ((TMP_Text)textMeshProUGUI6).text = LanguageManager.CurrentLanguage.pauseMenu.pause_quit; GameObject parentObject2 = CommonFunctions.FindDescendant(canvasObj, "PauseMenuDialogs"); GameObject parentObject3 = CommonFunctions.FindDescendant(parentObject2, "Quit Confirm", "Panel"); TextMeshProUGUI textMeshProUGUI7 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject3, "Text (2)")); ((TMP_Text)textMeshProUGUI7).text = LanguageManager.CurrentLanguage.pauseMenu.pause_quitConfirm; TextMeshProUGUI textMeshProUGUI8 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject3, "Text (1)")); ((TMP_Text)textMeshProUGUI8).text = LanguageManager.CurrentLanguage.pauseMenu.pause_disableWindow; TextMeshProUGUI textMeshProUGUI9 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject3, "Confirm", "Text")); ((TMP_Text)textMeshProUGUI9).text = LanguageManager.CurrentLanguage.pauseMenu.pause_quitConfirmYes; TextMeshProUGUI textMeshProUGUI10 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject3, "Cancel", "Text")); ((TMP_Text)textMeshProUGUI10).text = LanguageManager.CurrentLanguage.pauseMenu.pause_quitConfirmNo; GameObject parentObject4 = CommonFunctions.FindDescendant(parentObject2, "Restart Confirm", "Panel"); TextMeshProUGUI textMeshProUGUI11 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject4, "Text")); ((TMP_Text)textMeshProUGUI11).text = LanguageManager.CurrentLanguage.pauseMenu.pause_restartConfirm; TextMeshProUGUI textMeshProUGUI12 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject4, "Text (1)")); ((TMP_Text)textMeshProUGUI12).text = LanguageManager.CurrentLanguage.pauseMenu.pause_disableWindow; TextMeshProUGUI textMeshProUGUI13 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject4, "Confirm", "Text")); ((TMP_Text)textMeshProUGUI13).text = LanguageManager.CurrentLanguage.pauseMenu.pause_restartConfirmYes; TextMeshProUGUI textMeshProUGUI14 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject4, "Cancel", "Text")); ((TMP_Text)textMeshProUGUI14).text = LanguageManager.CurrentLanguage.pauseMenu.pause_restartConfirmNo; } catch (Exception ex) { Logging.Error("Failed to patch pause menu."); Logging.Error(ex.ToString()); } } public static void HandleSceneSwitch(Scene scene, ref GameObject canvas) { string currentSceneName = CommonFunctions.GetCurrentSceneName(); if (currentSceneName == "Intro" || currentSceneName == "Bootstrap") { return; } GameObject canvasObj = CommonFunctions.GetInactiveRootObject("Canvas"); if (!Object.op_Implicit((Object)(object)canvasObj)) { Logging.Fatal("UNABLE TO FIND CANVAS IN CURRENT SCENE"); return; } string text = currentSceneName; string text2 = text; if (text2 == "Intro") { return; } if (text2 == "Main Menu") { if (wasLanguageReset) { wasLanguageReset = false; MonoSingleton<HudMessageReceiver>.Instance.SendHudMessage("<color=orange>The currently set language file could not be loaded.\nLanguage has been reset to English to avoid problems.</color>", "", "", 0, false, false, true); } PatchFrontEnd(canvasObj); return; } if (CommonFunctions.isUsingEnglish()) { Logging.Warn("Current language is English, not patching."); return; } Logging.Message("Regular scene"); Logging.Message("Attempting to patch base elements"); try { PatchPauseMenu(ref canvasObj); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } try { Cheats.PatchCheatConsentPanel(ref canvasObj); } catch (Exception ex2) { Console.WriteLine(ex2.ToString()); } try { Sandbox.PatchAlterMenu(); } catch (Exception ex3) { Console.WriteLine(ex3.ToString()); } try { HUDMessages.PatchDeathScreen(ref canvasObj); } catch (Exception ex4) { Console.WriteLine(ex4.ToString()); } try { LevelStatWindow.PatchStats(ref canvasObj); } catch (Exception ex5) { Console.WriteLine(ex5.ToString()); } try { HUDMessages.PatchMisc(ref canvasObj); } catch (Exception ex6) { Console.WriteLine(ex6.ToString()); } try { Options options = new Options(ref canvasObj); } catch (Exception ex7) { Console.WriteLine(ex7.ToString()); } Logging.Message("Base elements patched"); if (currentSceneName.Contains("Tutorial")) { Logging.Message("Tutorial"); } else if (currentSceneName.Contains("-S")) { Logging.Message("Secret"); SecretLevels secretLevels = new SecretLevels(ref canvasObj); } if (currentSceneName.Contains("0-")) { Logging.Message("Prelude"); Prelude prelude = new Prelude(ref canvasObj); } else if (currentSceneName.Contains("1-") || currentSceneName.Contains("2-") || currentSceneName.Contains("3-")) { Logging.Message("Act 1"); Act1.PatchAct1(ref canvasObj); } else if (currentSceneName.Contains("4-") || currentSceneName.Contains("5-") || currentSceneName.Contains("6-")) { Logging.Message("Act 2"); Act2.PatchAct2(ref canvasObj); } else if (currentSceneName.Contains("7-") || currentSceneName.Contains("8-") || currentSceneName.Contains("9-")) { Logging.Message("Act 3"); if (LanguageManager.CurrentLanguage.act3 != null) { Act3.PatchAct3(ref canvasObj); } else { Logging.Warn("Category is not found in the language file!"); } } else if (currentSceneName.Contains("P-")) { Logging.Message("Prime"); PrimeSanctum primeSanctum = new PrimeSanctum(); } else if (currentSceneName == "uk_construct") { Logging.Message("Sandbox"); Sandbox sandbox = new Sandbox(ref canvasObj); } else if (currentSceneName == "Endless") { Logging.Message("CyberGrind"); CyberGrind.PatchCg(); } else if (currentSceneName.Contains("Intermission") || currentSceneName.Contains("EarlyAccessEnd")) { Logging.Message("Intermission"); Intermission intermission = new Intermission(ref canvasObj); } else if (currentSceneName == "CreditsMuseum2") { Logging.Message("DevMuseum"); DevMuseum devMuseum = new DevMuseum(); } } public static async void ApplyPostInitFixes(GameObject canvasObj) { await Task.Delay(250); if (CommonFunctions.GetCurrentSceneName() == "Main Menu") { TextMeshProUGUI openLangFolderText = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(canvasObj, "OptionsMenu", "Language Page", "Scroll Rect (1)", "Contents", "OpenLangFolder", "Slot Text")); if ((Object)(object)openLangFolderText != (Object)null) { ((TMP_Text)openLangFolderText).text = "<color=#03fc07>Open language folder</color>"; } } } } public static class FontManager { public static Sprite[] CustomRankImages; public static Sprite ArabicUltrakillLogo; public static bool TMPFontReady; public static bool UseFontFallback; public static TMP_FontAsset MeseumFontAsset; public static TMP_FontAsset TwinFont; private static TMP_FontAsset mainFallback; private static TMP_FontAsset museumFallback; private static TMP_FontAsset terminalFallback; private static TMP_FontAsset secretFallback; private static readonly List<(TMP_FontAsset font, TMP_FontAsset fallback)> appliedFallbacks = new List<(TMP_FontAsset, TMP_FontAsset)>(); private static readonly List<TMP_FontAsset> createdFonts = new List<TMP_FontAsset>(); private static readonly Dictionary<string, TMP_FontAsset> alignedCache = new Dictionary<string, TMP_FontAsset>(); private static bool sceneHookRegistered; public static void LoadFonts() { Logging.Message("Loading font resource bundle..."); AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(MainPatch.ModFolder, "fontpack.bundle")); AssetBundle val2 = AssetBundle.LoadFromFile(Path.Combine(MainPatch.ModFolder, "basegameasset.bundle")); if ((Object)(object)val == (Object)null) { Logging.Error("Failed to load fontPack.bundle"); return; } MeseumFontAsset = val2.LoadAsset<TMP_FontAsset>("GFSGaraldus SDF"); mainFallback = val.LoadAsset<TMP_FontAsset>("MainFont"); museumFallback = val.LoadAsset<TMP_FontAsset>("MuseumFont"); terminalFallback = val.LoadAsset<TMP_FontAsset>("TerminalFont"); secretFallback = val.LoadAsset<TMP_FontAsset>("SecretFont"); TMPFontReady = (Object)(object)mainFallback != (Object)null; if (!TMPFontReady) { Logging.Error("fontPack.bundle is missing the 'MainFont' TMP_FontAsset"); } } public static void ApplyLanguageFallback() { if (!TMPFontReady) { return; } ClearAppliedFallbacks(); if (CommonFunctions.isUsingEnglish()) { return; } Metadata metadata = LanguageManager.CurrentLanguage?.metadata; if (metadata == null) { return; } UseFontFallback = metadata.fonts?.UseFallback ?? false; if (!((Object)(object)mainFallback == (Object)null)) { if (!sceneHookRegistered) { SceneManager.sceneLoaded += OnSceneLoaded; sceneHookRegistered = true; } RegisterFallbacksForLoadedFonts(); } } private static void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if ((Object)(object)mainFallback != (Object)null) { RegisterFallbacksForLoadedFonts(); } } private static void RegisterFallbacksForLoadedFonts() { if ((Object)(object)mainFallback == (Object)null) { return; } TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>(); foreach (TMP_FontAsset val in array) { if ((Object)(object)val == (Object)null) { continue; } string text = ((Object)val).name?.ToLowerInvariant(); if (!string.IsNullOrEmpty(text) && !text.Contains("_alignedto_") && !createdFonts.Contains(val) && !((Object)(object)val == (Object)(object)mainFallback) && !((Object)(object)val == (Object)(object)museumFallback) && !((Object)(object)val == (Object)(object)terminalFallback) && !((Object)(object)val == (Object)(object)secretFallback)) { TMP_FontAsset val2 = null; val2 = (text.Contains("tahoma") ? terminalFallback : (text.Contains("bittypix") ? secretFallback : ((text.Contains("garaldus") || text.Contains("garamond") || text.Contains("museum")) ? museumFallback : ((!text.Contains("vcr-osd-replayed")) ? mainFallback : mainFallback)))); if (text.Contains("vcr-osd-replayed")) { TwinFont = val; } AddFallback(val, val2); } } } public static TMP_FontAsset GetTwinFont(string sourceFontName) { if (!string.IsNullOrEmpty(sourceFontName)) { string text = sourceFontName.ToLowerInvariant(); if (text.Contains("garaldus") || text.Contains("garamond") || text.Contains("museum")) { return ((Object)(object)MeseumFontAsset != (Object)null) ? MeseumFontAsset : TwinFont; } } return TwinFont; } private static void AddFallback(TMP_FontAsset primary, TMP_FontAsset fallback) { if (!((Object)(object)primary == (Object)null) && !((Object)(object)fallback == (Object)null) && !((Object)(object)primary == (Object)(object)fallback)) { if (primary.fallbackFontAssetTable == null) { List<TMP_FontAsset> list = (primary.fallbackFontAssetTable = new List<TMP_FontAsset>()); } if (!primary.fallbackFontAssetTable.Contains(fallback)) { primary.fallbackFontAssetTable.Add(fallback); appliedFallbacks.Add((primary, fallback)); } } } private static void ClearAppliedFallbacks() { foreach (var (val, item) in appliedFallbacks) { if (val != null) { val.fallbackFontAssetTable?.Remove(item); } } appliedFallbacks.Clear(); alignedCache.Clear(); foreach (TMP_FontAsset createdFont in createdFonts) { if ((Object)(object)createdFont != (Object)null) { Object.Destroy((Object)(object)createdFont); } } createdFonts.Clear(); } } public static class LevelStatWindow { public static void PatchStats(ref GameObject canvasObj) { GameObject parentObject = CommonFunctions.FindDescendant(canvasObj, "Level Stats Controller", "Level Stats (1)"); TextMeshProUGUI textMeshProUGUI = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Title")); ((TMP_Text)textMeshProUGUI).text = LevelNames.GetDiscordLevelName(CommonFunctions.GetCurrentSceneName()); TextMeshProUGUI textMeshProUGUI2 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Time Title")); ((TMP_Text)textMeshProUGUI2).text = LanguageManager.CurrentLanguage.misc.levelstats_time; TextMeshProUGUI textMeshProUGUI3 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Kills Title")); ((TMP_Text)textMeshProUGUI3).text = LanguageManager.CurrentLanguage.misc.levelstats_kills; TextMeshProUGUI textMeshProUGUI4 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Style Title")); ((TMP_Text)textMeshProUGUI4).text = LanguageManager.CurrentLanguage.misc.levelstats_style; TextMeshProUGUI textMeshProUGUI5 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Secrets Title")); ((TMP_Text)textMeshProUGUI5).text = LanguageManager.CurrentLanguage.misc.levelstats_secrets; TextMeshProUGUI textMeshProUGUI6 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Challenge Title")); ((TMP_Text)textMeshProUGUI6).text = LanguageManager.CurrentLanguage.misc.levelstats_challenge; TextMeshProUGUI textMeshProUGUI7 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Assists Title")); ((TMP_Text)textMeshProUGUI7).text = LanguageManager.CurrentLanguage.misc.levelstats_majorAssists; if (CommonFunctions.GetCurrentSceneName() == "Level 4-S") { TextMeshProUGUI textMeshProUGUI8 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject, "Crates Counter")); ((TMP_Text)textMeshProUGUI8).text = LanguageManager.CurrentLanguage.misc.levelstats_boxes; } } } public static class Logging { public static ManualLogSource UllLogger = Logger.CreateLogSource("ULL LOGGING"); public static void Debug(string text) { UllLogger.LogDebug((object)text); } public static void Message(string text) { UllLogger.LogMessage((object)text); } public static void Warn(string text) { UllLogger.LogWarning((object)text); } public static void Error(string text) { UllLogger.LogError((object)text); } public static void Fatal(string text) { UllLogger.LogFatal((object)text); } public static void Info(string text) { UllLogger.LogInfo((object)text); } } [BepInPlugin("clearwater.ultrakill.ultrakull", "clearwater.ultrakull.ultrakULL", "1.3.0")] public class MainPatch : BaseUnityPlugin { private const string Guid = "clearwater.ultrakill.ultrakull"; private const string InternalName = "clearwater.ultrakull.ultrakULL"; private const string InternalVersion = "1.3.0"; public static MainPatch Instance; public bool ready; public static string ModFolder => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); public MainPatch() { Instance = this; } public static string GetVersion() { return "1.3.0"; } public void OnApplicationQuit() { LanguageManager.DumpLastLanguage(); } public void DisableMod() { ready = false; } public void onSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) if (!ready || LanguageManager.CurrentLanguage == null) { Logging.Error("UltrakULL has been deactivated to prevent crashing. Check the console for any errors!"); return; } GameObject canvas = CommonFunctions.GetInactiveRootObject("Canvas"); Core.HandleSceneSwitch(scene, ref canvas); if (CommonFunctions.GetCurrentSceneName() != "Bootstrap" || CommonFunctions.GetCurrentSceneName() != "Intro") { PostInitPatches(canvas); } } public async void PostInitPatches(GameObject canvasObj) { await Task.Delay(250); Core.ApplyPostInitFixes(canvasObj); } private void Awake() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown Debug.unityLogger.filterLogType = (LogType)4; Logging.Warn("UltrakULL Loading... | Version v.1.3.0"); try { Logging.Warn("--- Loading external fonts ---"); FontManager.LoadFonts(); Logging.Warn("--- Initializing language manager ---"); LanguageManager.InitializeManager("1.3.0"); Logging.Warn("--- Patching vanilla game functions ---"); Harmony val = new Harmony("clearwater.ultrakull.ultrakULL"); val.PatchAll(); Logging.Warn(" --- All done. Enjoy! ---"); SceneManager.sceneLoaded += CommonFunctions.ClearObjectCaches; SceneManager.sceneLoaded += onSceneLoaded; SceneManager.sceneLoaded += SubtitledAudioSourcesReplacer.OnSceneLoaded; ready = true; } catch (Exception ex) { Logging.Fatal("An error occured while initialising!"); Logging.Fatal(ex.ToString()); ready = false; } } } public class NeedDebugMode : Attribute { } public class SubtitledSourcesConfig { [JsonProperty("scenes")] public Dictionary<string, List<SubtitledObjectReference>> Scenes; } public class SubtitledObjectReference { [JsonProperty("objects")] public List<string> Objects; [JsonProperty("audio")] public string AudioPath; [JsonProperty("lines")] public List<Line> Lines; public SubtitleData ToSubtitleData() { //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_003c: Expected O, but got Unknown return new SubtitleData { lines = ((IEnumerable<Line>)Lines).Select((Func<Line, SubtitleDataLine>)((Line line) => new SubtitleDataLine { subtitle = ColorIfNecessary(LanguageManager.CurrentLanguage.subtitles.GetField(line.Reference), line.Color), time = line.Delay })).ToArray() }; } private static string ColorIfNecessary(string line, string color) { if (color == null) { return line; } return "<color=#" + color + ">" + line + "</color>"; } } public class Line { [JsonProperty("line")] public string Reference; [JsonProperty("delay")] public float Delay; [JsonProperty("color")] public string Color; } [DisallowMultipleComponent] public class TMPTwin : MonoBehaviour { private enum TwinKind { Normal, Fishing, IntermissionChild, ShadowParent } private Text source; private TextMeshProUGUI twin; private TwinKind kind; private string lastText; private bool detached; private float originalAlpha; private void Awake() { source = ((Component)this).GetComponent<Text>(); if ((Object)(object)source == (Object)null) { Object.Destroy((Object)(object)this); return; } originalAlpha = (((Object)(object)((Graphic)source).canvasRenderer != (Object)null) ? ((Graphic)source).canvasRenderer.GetAlpha() : 1f); kind = Classify(source); if (kind == TwinKind.ShadowParent) { HideSource(); } else { BuildTwin(); } } private void OnEnable() { if (detached) { return; } if (kind == TwinKind.ShadowParent) { HideSource(); } else if (!((Object)(object)twin == (Object)null)) { HideSource(); if (!((Component)twin).gameObject.activeSelf) { ((Component)twin).gameObject.SetActive(true); } MarkRebuild(); } } private void OnDisable() { if (!detached && !((Object)(object)twin == (Object)null) && ((Component)twin).gameObject.activeSelf) { ((Component)twin).gameObject.SetActive(false); } } private void OnDestroy() { if ((Object)(object)twin != (Object)null) { Object.Destroy((Object)(object)((Component)twin).gameObject); } } public void Detach() { detached = true; if ((Object)(object)twin != (Object)null) { Object.Destroy((Object)(object)((Component)twin).gameObject); } twin = null; ShowSource(); } private void LateUpdate() { if (!detached && !((Object)(object)twin == (Object)null) && !((Object)(object)source == (Object)null) && source.text != lastText) { Sync(); lastText = source.text; } } private void BuildTwin() { twin = TextMirror.CreateSibling(source); if (!((Object)(object)twin == (Object)null)) { Sync(); if (kind == TwinKind.IntermissionChild) { TextMirror.AddIntermissionShadow(twin); } HideSource(); ((Component)twin).gameObject.SetActive(((Behaviour)source).isActiveAndEnabled); lastText = source.text; } } private void Sync() { if (kind == TwinKind.Fishing) { TextMirror.ApplyFishingTMP(source, twin); } else { TextMirror.CopyRectTransform(((Graphic)source).rectTransform, ((TMP_Text)twin).rectTransform); TextMirror.CopyTextProperties(source, twin); ((TMP_Text)twin).ForceMeshUpdate(false, false); MarkRebuild(); } TextMirror.SyncEffects(source, twin); } private void HideSource() { if ((Object)(object)source != (Object)null && (Object)(object)((Graphic)source).canvasRenderer != (Object)null) { ((Graphic)source).canvasRenderer.SetAlpha(0f); } } private void ShowSource() { if ((Object)(object)source != (Object)null && (Object)(object)((Graphic)source).canvasRenderer != (Object)null) { ((Graphic)source).canvasRenderer.SetAlpha(originalAlpha); } } private void MarkRebuild() { if ((Object)(object)twin != (Object)null && (Object)(object)((TMP_Text)twin).rectTransform != (Object)null) { LayoutRebuilder.MarkLayoutForRebuild(((TMP_Text)twin).rectTransform); } } private static TwinKind Classify(Text source) { if (IsIntermissionShadowParent(source)) { return TwinKind.ShadowParent; } if (IsIntermissionShadowChild(source)) { return TwinKind.IntermissionChild; } if (IsFishingResultText(source)) { return TwinKind.Fishing; } return TwinKind.Normal; } private static bool IsFishingResultText(Text source) { return (Object)(object)source != (Object)null && (((Object)source).name == "Fish Caught Label" || ((Object)source).name == "Fish Size Text"); } private static bool IsIntermissionShadowParent(Text source) { return (Object)(object)source != (Object)null && InIntermission() && AncestorNamesMatch(((Component)source).transform, "Text", "Panel (1)", "Panel", "PowerUpVignette", "Canvas"); } private static bool IsIntermissionShadowChild(Text source) { return (Object)(object)source != (Object)null && InIntermission() && AncestorNamesMatch(((Component)source).transform, "Text (1)", "Text", "Panel (1)", "Panel", "PowerUpVignette", "Canvas"); } private static bool InIntermission() { string currentSceneName = CommonFunctions.GetCurrentSceneName(); return currentSceneName == "Intermission1" || currentSceneName == "Intermission2"; } private static bool AncestorNamesMatch(Transform t, params string[] names) { foreach (string text in names) { if ((Object)(object)t == (Object)null || ((Object)t).name != text) { return false; } t = t.parent; } return true; } } public static class BossStrings { public static string GetBossName(string originalBossName) { Logging.Warn(originalBossName); return EnemyBios.GetName(originalBossName); } } public static class Cheats { public static void PatchCheatConsentPanel(ref GameObject canvasObj) { //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown GameObject parentObject = CommonFunctions.FindDescendant(canvasObj, "Cheat Menu"); GameObject parentObject2 = CommonFunctions.FindDescendant(parentObject, "Cheats Consent"); GameObject val = CommonFunctions.FindDescendant(parentObject2, "Text"); TextMeshProUGUI textMeshProUGUI = CommonFunctions.GetTextMeshProUGUI(val); ((TMP_Text)textMeshProUGUI).text = LanguageManager.CurrentLanguage.cheats.cheats_disclaimer1 + "\n\n" + LanguageManager.CurrentLanguage.cheats.cheats_disclaimer2; TextMeshProUGUI textMeshProUGUI2 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject2, "Yes", "Text")); ((TMP_Text)textMeshProUGUI2).text = LanguageManager.CurrentLanguage.cheats.cheats_disclaimerYes; ((TMP_Text)textMeshProUGUI2).fontSize = 22f; TextMeshProUGUI textMeshProUGUI3 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject2, "No", "Text")); ((TMP_Text)textMeshProUGUI3).text = LanguageManager.CurrentLanguage.cheats.cheats_disclaimerNo; GameObject parentObject3 = CommonFunctions.FindDescendant(parentObject, "Cheats Manager"); TextMeshProUGUI textMeshProUGUI4 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject3, "Title")); ((TMP_Text)textMeshProUGUI4).text = LanguageManager.CurrentLanguage.cheats.cheats_panelTitle; Component[] components = val.GetComponents(typeof(Component)); Behaviour val2 = (Behaviour)components[2]; val2.enabled = false; GameObject parentObject4 = CommonFunctions.FindDescendant(canvasObj, "Cheat Menu", "Cheats Overlay", "Cheats Enabled"); TextMeshProUGUI textMeshProUGUI5 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(parentObject4, "Title")); ((TMP_Text)textMeshProUGUI5).text = LanguageManager.CurrentLanguage.cheats.cheats_cheatsEnabled; GameObject val3 = CommonFunctions.FindDescendant(parentObject4, "Details Tip"); Component[] components2 = val3.GetComponents(typeof(Component)); Component[] array = components2; foreach (Component val4 in array) { if (((object)val4).GetType().Name == "TextOverride") { Object.Destroy((Object)(object)val4); } } TextMeshProUGUI textMeshProUGUI6 = CommonFunctions.GetTextMeshProUGUI(val3); ((TMP_Text)textMeshProUGUI6).text = LanguageManager.CurrentLanguage.cheats.cheats_cheatsOpenButtons; TextMeshProUGUI textMeshProUGUI7 = CommonFunctions.GetTextMeshProUGUI(CommonFunctions.FindDescendant(canvasObj, "Cheat Menu", "Cheats Teleport", "Title")); ((TMP_Text)textMeshProUGUI7).text = LanguageManager.CurrentLanguage.cheats.cheats_teleport; } public static string GetCheatStatus(string cheatStatus) { if (cheatStatus == null) { return null; } try { return cheatStatus switch { "STAY ACTIVE" => LanguageManager.CurrentLanguage.cheats.cheats_stayActive, "DISABLE ON RELOAD" => LanguageManager.CurrentLanguage.cheats.cheats_disableOnReload, "SAVE" => LanguageManager.CurrentLanguage.cheats.cheats_dupesSave, "NEW SAVE" => LanguageManager.CurrentLanguage.cheats.cheats_dupesNewSave, "LOAD LATEST SAVE" => LanguageManager.CurrentLanguage.cheats.cheats_loadLatestSave, "EQUIP" => LanguageManager.CurrentLanguage.cheats.cheats_equip, "REMOVE" => LanguageManager.CurrentLanguage.cheats.cheats_remove, "OPEN" => LanguageManager.CurrentLanguage.cheats.cheats_open, "Kill All" => LanguageManager.CurrentLanguage.cheats.cheats_killAll, "STATIC" => LanguageManager.CurrentLanguage.cheats.cheats_static, "DYNAMIC" => LanguageManager.CurrentLanguage.cheats.cheats_dynamic, "CLEAR" => LanguageManager.CurrentLanguage.cheats.cheats_clear, "REBUILD" => LanguageManager.CurrentLanguage.cheats.cheats_rebuild, "REBUILDING..." => LanguageManager.CurrentLanguage.cheats.cheats_rebuilding, _ => null, }; } catch (Exception e) { CommonFunctions.HandleError(e, cheatStatus); return ""; } } public static string GetCheatName(string cheatIdentifier) { try { return cheatIdentifier switch { "ultrakill.keep-enabled" => LanguageManager.CurrentLanguage.cheats.cheats_keepEnabled, "ultrakill.spawner-arm" => LanguageManager.CurrentLanguage.cheats.cheats_spawnerArm, "ultrakill.teleport-menu" => LanguageManager.CurrentLanguage.cheats.cheats_teleportMenu, "ultrakill.full-bright" => LanguageManager.CurrentLanguage.cheats.cheats_fullBright, "ultrakill.invincibility" => LanguageManager.CurrentLanguage.cheats.cheats_invincibility, "ultrakill.noclip" => LanguageManager.CurrentLanguage.cheats.cheats_noclip, "ultrakill.flight" => LanguageManager.CurrentLanguage.cheats.cheats_flight, "ultrakill.infinite-wall-jumps" => LanguageManager.CurrentLanguage.cheats.cheats_infiniteWallJumps, "ultrakill.no-weapon-cooldown" => LanguageManager.CurrentLanguage.cheats.cheats_noWeaponCooldown, "ultrakill.infinite-power-ups" => LanguageManager.CurrentLanguage.cheats.cheats_infinitePowerUps, "ultrakill.blind-enemies" => LanguageManager.CurrentLanguage.cheats.cheats_blindEnemies, "ultrakill.enemy-hate-enemy" => LanguageManager.CurrentLanguage.cheats.cheats_enemiesHateEnemies, "ultrakill.enemy-ignore-player" => LanguageManager.CurrentLanguage.cheats.cheats_enemiesIgnorePlayer, "ultrakill.disable-enemy-spawns" => LanguageManager.CurrentLanguage.cheats.cheats_disableEnemySpawns, "ultrakill.invincible-enemies" => LanguageManager.CurrentLanguage.cheats.cheats_invincibleEnemies, "ultrakill.kill-all-enemies" => LanguageManager.CurrentLanguage.cheats.cheats_killAllEnemies, "ultrakill.sandbox.quick-save" => LanguageManager.CurrentLanguage.cheats.cheats_quickSave, "ultrakill.sandbox.quick-load" => LanguageManager.CurrentLanguage.cheats.cheats_quickLoad, "ultrakill.sandbox.save-menu" => LanguageManager.CurrentLanguage.cheats.cheats_saveMenu, "ultrakill.sandbox.clear" => LanguageManager.CurrentLanguage.cheats.cheats_clearMap, "ultrakill.sandbox.rebuild-nav" => LanguageManager.CurrentLanguage.cheats.cheats_rebuildNav, "ultrakill.sandbox.snapping" => LanguageManager.CurrentLanguage.cheats.cheats_snapping, "ultrakill.sandbox.physics" => LanguageManager.CurrentLanguage.cheats.cheats_physics, "ultrakill.clash-mode" => LanguageManager.CurrentLanguage.cheats.cheats_crashMode, "ultrakill.hide-weapons" => LanguageManager.CurrentLanguage.cheats.cheats_hideWeapons, "ultrakill.hide-ui" => LanguageManager.CurrentLanguage.cheats.cheats_hideUi, "ultrakill.ghost-drone-mode" => LanguageManager.CurrentLanguage.cheats.cheats_ghostDroneMode, _ => cheatIdentifier, }; } catch (Exception e) { CommonFunctions.HandleError(e, cheatIdentifier); return ""; } } } public static class EnemyBios { private static bool doubleBoss; private static bool IsNullOrEmpty(string str) { return string.IsNullOrEmpty(str); } private static string GetEnemyNameWithFallback(string translatedName, string originalName) { if (IsNullOrEmpty(translatedName)) { Logging.Warn("Translation for enemy name is null or empty, using original: " + originalName); return originalName; } return translatedName; } private static string GetEnemyBioWithFallback(string bioPart1, string originalDescription, string enemyName) { if (IsNullOrEmpty(bioPart1)) { Logging.Warn("Translation for enemy bio is null or empty, using original: " + enemyName); return originalDescription ?? enemyName; } return bioPart1; } private static string GetEnemyStrategyWithFallback(string strategyPart1, string originalStrategy, string enemyName) { if (IsNullOrEmpty(strategyPart1)) { Logging.Warn("Translation for enemy strategy is null or empty, using original: " + enemyName); return originalStrategy ?? enemyName; } return strategyPart1; } public static string GetName(string originalName) { Logging.Warn(originalName); if (originalName.ToUpper().Contains("RADIANT")) { if (originalName.ToUpper().Contains("SWORDSMACHINE")) { return LanguageManager.CurrentLanguage.enemyNames.enemyname_radiant_swordsmachine; } if (originalName.ToUpper().Contains("CERBERUS")) { return LanguageManager.CurrentLanguage.enemyNames.enemyname_radiant_cerberus; } if (originalName.ToUpper().Contains("HIDEOUS MASS")) { return LanguageManager.CurrentLanguage.enemyNames.enemyname_radiant_hideousMass; } return "Untranslated RADIANT enemy name: " + originalName; } switch (originalName.ToUpper()) { case "SWORDSMACHINE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_swordsmachine; case "SWORDSMACHINE DEFAULT": return LanguageManager.CurrentLanguage.enemyNames.enemyname_swordsmachine; case "SWORDSMACHINE \"AGONY\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_swordsmachineAgony; case "SWORDSMACHINE \"TUNDRA\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_swordsmachineTundra; case "INSURRECTIONIST \"ANGRY\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_insurrectionistAngry; case "INSURRECTIONIST \"RUDE\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_insurrectionistRude; case "INSURRECTIONIST DEFAULT": case "INSURRECTIONIST": case "SISYPHEAN INSURRECTIONIST": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_insurrectionist; case "FILTH": return LanguageManager.CurrentLanguage.enemyNames.enemyname_filth; case "STRAY": return LanguageManager.CurrentLanguage.enemyNames.enemyname_stray; case "SCHISM": return LanguageManager.CurrentLanguage.enemyNames.enemyname_schism; case "SOLDIER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_soldier; case "MINOS": case "THE CORPSE OF KING MINOS": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_corpseOfKingMinos; case "STALKER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_stalker; case "VERY CANCEROUS RODENT": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_veryCancerousRodent; case "CANCEROUS RODENT": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_cancerousRodent; case "FERRYMAN": return LanguageManager.CurrentLanguage.enemyNames.enemyname_ferryman; case "FERRYMAN \"RUDRAKSHA\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_ferrymanRudraksha; case "FERRYMAN \"AGONIS\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_ferrymanAgonis; case "DRONE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_drone; case "STREETCLEANER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_streetCleaner; case "V2 (2ND)": return LanguageManager.CurrentLanguage.enemyNames.enemyname_v2Second; case "V2SECOND": case "V2": return LanguageManager.CurrentLanguage.enemyNames.enemyname_v2; case "TURRET": case "SENTRY": return LanguageManager.CurrentLanguage.enemyNames.enemyname_sentry; case "GUTTERMAN": return LanguageManager.CurrentLanguage.enemyNames.enemyname_gutterman; case "GUTTERTANK": return LanguageManager.CurrentLanguage.enemyNames.enemyname_guttertank; case "MINDFLAYER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_mindFlayer; case "CENTAUR": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_earthmover; case "1000-THR DEFENCE SYSTEM": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_earthmoverDefence; case "EARTHMOVER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_earthmover; case "MALICIOUSFACE": case "MALICIOUS FACE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_malFace; case "MYSTERIOUS DRUID KNIGHT (& OWL)": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_mandalore; case "IDOL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_idol; case "LEVIATHAN": return LanguageManager.CurrentLanguage.enemyNames.enemyname_leviathan; case "CERBERUS, GUARDIAN OF HELL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_cerberus; case "STATUE": case "CERBERUS": return LanguageManager.CurrentLanguage.enemyNames.enemyname_cerberus; case "HIDEOUS MASS": case "HIDEOUSMASS": return LanguageManager.CurrentLanguage.enemyNames.enemyname_hideousMass; case "MANNEQUIN": return LanguageManager.CurrentLanguage.enemyNames.enemyname_mannequin; case "MINOTAUR": case "<S>MINOTAUR": case "<s>MINOTAUR": return "<s>" + LanguageManager.CurrentLanguage.enemyNames.enemyname_minotaur + "</s>"; case "GABRIEL, JUDGE OF HELL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_gabriel; case "GABRIEL, APOSTATE OF HATE": case "GABRIEL, THE APOSTATE OF HATE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_gabrielSecond; case "VIRTUE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_virtue; case "SOMETHING WICKED": return LanguageManager.CurrentLanguage.enemyNames.enemyname_somethingWicked; case "???": return LanguageManager.CurrentLanguage.enemyNames.enemyname_puppet; case "FLESH PRISON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_fleshPrison; case "MINOSPRIME": case "MINOS PRIME": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_minosPrime; case "FLESH PANOPTICON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_fleshPanopticon; case "SISYPHUSPRIME": case "SISYPHUS PRIME": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_sisyphusPrime; case "BIG JOHNINATOR": case "BIGJOHNATOR": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_bigJohninator; case "1000-THR \"EARTHMOVER\"": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_earthmover; case "1000-THR DEFENSE SYSTEM": return LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_earthmoverDefence; case "EARTHMOVER MORTAR": return LanguageManager.CurrentLanguage.enemyNames.enemyname_earthmoverMortar; case "EARTHMOVER ROCKET LAUNCHER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_earthmoverRocketLauncher; case "EARTHMOVER TOWER": return LanguageManager.CurrentLanguage.enemyNames.enemyname_earthmoverTower; case "GERYON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_geryon; case "PROVIDENCE": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_providence, originalName); case "DEATHCATCHER": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_deathcatcher, originalName); case "MIRROR REAPER": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_mirrorReaper, originalName); case "POWER": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_power, originalName); case "POWER MANADEL": case "POWER \"MANADEL\"": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_powerManadel, originalName); case "POWER \"LEHAHIAH\"": case "POWER LEHAHIAH": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_powerLehahiah, originalName); case "POWER CHAUAKIAH": case "POWER \"CHAUAKIAH\"": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_powerChauakiah, originalName); case "GERYON, WATCHER OF THE SKIES": return GetEnemyNameWithFallback(LanguageManager.CurrentLanguage.enemyNames.enemyname_boss_geryon, originalName); default: Logging.Warn("Untranslated enemy name: " + originalName); return originalName; } } public static string GetType(string originaltype) { switch (originaltype.ToUpper()) { case "LESSER HUSK": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_lesserHusk; case "GREATER HUSK": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_greaterHusk; case "SUPREME HUSK": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_supremeHusk; case "LESSER DEMON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_lesserDemon; case "GREATER DEMON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_greaterDemon; case "SUPREME DEMON": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_supremeDemon; case "LESSER MACHINE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_lesserMachine; case "GREATER MACHINE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_greaterMachine; case "SUPREME MACHINE": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_supremeMachine; case "LESSER ANGEL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_lesserAngel; case "GREATER ANGEL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_greaterAngel; case "SUPREME ANGEL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_supremeAngel; case "???": return "???"; case "PRIME SOUL": return LanguageManager.CurrentLanguage.enemyNames.enemyname_type_primeSoul; default: Logging.Warn("Unknown enemy type"); return originaltype; } } public static string GetDescription(string originalenemy, string originalDescription = null) { switch (originalenemy.ToUpper()) { case "FILTH": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_4; case "STRAY": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_stray_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stray_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stray_3; case "SCHISM": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_schism_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_schism_2; case "SOLDIER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_3; case "IDOL": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_4; case "THE CORPSE OF KING MINOS": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_4; case "STALKER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_5; case "INSURRECTIONIST": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_5 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_6; case "FERRYMAN": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_5 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_6; case "SWORDSMACHINE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_3; case "DRONE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_3; case "STREETCLEANER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_streetcleaner_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_streetcleaner_2; case "V2": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_5; case "MINDFLAYER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_5; case "V2 (2ND)": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_4; case "SENTRY": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_4; case "GUTTERMAN": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_4; case "GUTTERTANK": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_5 + " " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_6 + " " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_7; case "EARTHMOVER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_5 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_6; case "MALICIOUS FACE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_maliciousFace_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_maliciousFace_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_maliciousFace_3; case "CERBERUS": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_cerberus_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_cerberus_2; case "HIDEOUS MASS": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_2; case "LEVIATHAN": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_4; case "MANNEQUIN": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_4 + "\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_5; case "MINOTAUR": case "<S>MINOTAUR": case "<s>MINOTAUR": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_1 + "\n\n\n...\n\n\n...\n\n\n...\n\n\n<s><color=red>" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_4 + "</color></s>"; case "GABRIEL, JUDGE OF HELL": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabriel_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabriel_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabriel_3; case "GABRIEL, APOSTATE OF HATE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_4; case "VIRTUE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_5; case "SOMETHING WICKED": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_4; case "FLESH PRISON": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPrison_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPrison_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPrison_3; case "MINOS PRIME": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_5 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_6 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_7 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_8; case "FLESH PANOPTICON": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPanopticon_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPanopticon_2; case "SISYPHUS PRIME": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_4 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_5 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_6 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_7 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_8; case "PROVIDENCE": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_3; case "POWER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_4; case "GERYON": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_geryon_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_geryon_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_geryon_3 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_geryon_4; case "MIRROR REAPER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_mirrorReaper_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mirrorReaper_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mirrorReaper_3; case "DEATHCATCHER": return LanguageManager.CurrentLanguage.enemyBios.enemyBios_deathcatcher_1 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_deathcatcher_2 + "\n\n\n" + LanguageManager.CurrentLanguage.enemyBios.enemyBios_deathcatcher_3; default: Logging.Warn("UNKNOWN ENEMY BIO: " + originalenemy); return originalDescription ?? originalenemy; } } public static string GetStrategy(string originalenemy, string originalStrategy = null) { switch (originalenemy.ToUpper()) { case "FILTH": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_filth_strategy2; case "STRAY": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stray_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stray_strategy2; case "SCHISM": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_schism_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_schism_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_schism_strategy3; case "SOLDIER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_soldier_strategy3; case "FERRYMAN": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_ferryman_strategy4; case "SENTRY": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sentry_strategy4; case "IDOL": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_idol_strategy4; case "THE CORPSE OF KING MINOS": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_corpseOfKingMinos_strategy3; case "LEVIATHAN": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_leviathan_strategy3; case "STALKER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_stalker_strategy4; case "INSURRECTIONIST": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_insurrectionist_strategy4; case "SWORDSMACHINE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_swordsmachine_strategy3; case "DRONE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_drone_strategy4; case "STREETCLEANER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_streetcleaner_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_streetcleaner_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_streetcleaner_strategy3; case "V2": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2_strategy4; case "MINDFLAYER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mindflayer_strategy3; case "V2 (2ND)": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_v2Second_strategy3; case "GUTTERMAN": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gutterman_strategy4; case "GUTTERTANK": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_guttertank_strategy2; case "EARTHMOVER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_earthmover_strategy2; case "MALICIOUS FACE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_maliciousFace_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_maliciousFace_strategy2; case "CERBERUS": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_cerberus_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_cerberus_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_cerberus_strategy3; case "HIDEOUS MASS": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_strategy3 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_hideousMass_strategy4; case "MANNEQUIN": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_mannequin_strategy3; case "MINOTAUR": case "<S>MINOTAUR": case "<s>MINOTAUR": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minotaur_strategy2; case "GABRIEL, JUDGE OF HELL": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabriel_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabriel_strategy2; case "GABRIEL, APOSTATE OF HATE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_gabrielSecond_strategy3; case "VIRTUE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_virtue_strategy2; case "SOMETHING WICKED": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_somethingWicked_strategy2; case "FLESH PRISON": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPrison_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPrison_strategy2; case "MINOS PRIME": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_minosPrime_strategy2; case "FLESH PANOPTICON": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPanopticon_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_fleshPanopticon_strategy2; case "SISYPHUS PRIME": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_sisyphusPrime_strategy2; case "PROVIDENCE": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_providence_strategy3; case "POWER": return "- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_strategy1 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_strategy2 + "\n\n\n- " + LanguageManager.CurrentLanguage.enemyBios.enemyBios_power_strategy3 + "\n\n\n- " + Lan