using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text.Json.Serialization; using GDWeave; using GDWeave.Godot; using GDWeave.Godot.Variants; using GDWeave.Modding; using Serilog; using WFRus.modifies; using WFRus.modifies.globals; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] [assembly: AssemblyCompany("WFRus")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0.0")] [assembly: AssemblyProduct("WFRus")] [assembly: AssemblyTitle("WFRus")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace WFRus { public class Config { [JsonInclude] public string mainmenuLogoPath = Directory.GetCurrentDirectory() + "/GDWeave/mods/WFRus/mainmenuLogo.png"; [JsonInclude] public string splashLamePath = Directory.GetCurrentDirectory() + "/GDWeave/mods/WFRus/splashLame.png"; [JsonInclude] public string splashGodotPath = Directory.GetCurrentDirectory() + "/GDWeave/mods/WFRus/splashGodot.png"; } public static class Helpers { public static IEnumerable SetFont(string node, uint indents = 0u) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown IEnumerable source = Array.Empty(); source = source.Append(new Token((TokenType)87, (uint?)null)); source = source.Append((Token)new IdentifierToken(node)); source = source.Append(new Token((TokenType)84, (uint?)null)); source = source.Append((Token)new IdentifierToken("get")); source = source.Append(new Token((TokenType)80, (uint?)null)); source = source.Append((Token)new ConstantToken((Variant)new StringVariant("custom_fonts/font"))); source = source.Append(new Token((TokenType)81, (uint?)null)); source = source.Append(new Token((TokenType)84, (uint?)null)); source = source.Append((Token)new IdentifierToken("set")); source = source.Append(new Token((TokenType)80, (uint?)null)); source = source.Append((Token)new ConstantToken((Variant)new StringVariant("font_data"))); source = source.Append(new Token((TokenType)82, (uint?)null)); source = source.Append(new Token((TokenType)5, (uint?)76u)); source = source.Append(new Token((TokenType)80, (uint?)null)); source = source.Append((Token)new ConstantToken((Variant)new StringVariant("res://mods/WFRus/Cyrillic/accidCyr.ttf"))); source = source.Append(new Token((TokenType)81, (uint?)null)); source = source.Append(new Token((TokenType)81, (uint?)null)); return source.Append(new Token((TokenType)89, (uint?)indents)); } public static IEnumerable SetText(string node, string param, string str, uint indents = 0u) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown IEnumerable source = Array.Empty(); source = source.Append(new Token((TokenType)87, (uint?)null)); source = source.Append((Token)new IdentifierToken(node)); source = source.Append(new Token((TokenType)84, (uint?)null)); source = source.Append((Token)new IdentifierToken(param)); source = source.Append(new Token((TokenType)23, (uint?)null)); source = source.Append((Token)new ConstantToken((Variant)new StringVariant(str))); return source.Append(new Token((TokenType)89, (uint?)indents)); } public static IEnumerable LoadExtImage(string node, string path) { IEnumerable first = Array.Empty(); first = first.Concat(ScriptTokenizer.Tokenize("var img" + node + " = Image.new()", 1u)); first = first.Concat(ScriptTokenizer.Tokenize($"var result{node} = img{node}.load(\"{path}\")", 1u)); first = first.Concat(ScriptTokenizer.Tokenize("if result" + node + " == OK:", 1u)); first = first.Concat(ScriptTokenizer.Tokenize("var texture" + node + " = ImageTexture.new()", 2u)); first = first.Concat(ScriptTokenizer.Tokenize($"texture{node}.create_from_image(img{node})", 2u)); first = first.Concat(ScriptTokenizer.Tokenize("texture" + node + ".flags = 0", 2u)); return first.Concat(ScriptTokenizer.Tokenize("$" + node + ".texture = texture" + node, 2u)); } } public class WFRusMod : IMod, IDisposable { public Config Config; public ILogger Logger; public WFRusMod(IModInterface modInterface) { Config = modInterface.ReadConfig(); Logger = modInterface.Logger; modInterface.RegisterScriptMod((IScriptMod)(object)new Voice()); modInterface.RegisterScriptMod((IScriptMod)(object)new PlayerVoice()); modInterface.RegisterScriptMod((IScriptMod)(object)new MainMenu(this)); modInterface.RegisterScriptMod((IScriptMod)(object)new SpeechBubble()); Logger.Information("[WFRusCS] C# Mod initialized!"); } public void Dispose() { } } } namespace WFRus.modifies { public class LevelBubble : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Entities/Player/SpeechBubble/level_bubble.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[2] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "time"; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { IEnumerable tkns = Array.Empty(); tkns = tkns.Concat(ScriptTokenizer.Tokenize("func _ready():", 0u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("\t$RichTextLabel.visible_characters = 20", 1u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("\t$RichTextLabel.bbcode_text = \"[center][wave amp=80.0 freq=5.0 connected=1]НОВЫЙ УРОВЕНЬ!\" ", 1u)); foreach (Token item in tkns) { yield return item; } } else { yield return token; } } } } public class MainMenu(WFRusMod mod) : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Menus/Main Menu/main_menu.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[2] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_ready"; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { yield return token; IEnumerable tkns = Array.Empty(); mod.Logger.Information("Trying to load mainmenu logo from " + mod.Config.mainmenuLogoPath); tkns = tkns.Concat(ScriptTokenizer.Tokenize("TextPrint(\"[WFRusCS>GD] Injected into main_menu.gd!\")", 1u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("if PlayerData.player_options.altfont == 0:", 1u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("ResourceLoad(\"res://Assets/Themes/main.tres\").default_font = ResourceLoad(\"res://mods/WFRus/Cyrillic/cyrillic.tres\")", 2u)); foreach (Token item in tkns) { yield return item; } yield return new Token((TokenType)89, (uint?)1u); } else { yield return token; } } } } public class OptionsMenu : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Singletons/OptionsMenu/options_menu.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[5] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_update_options"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "altfont"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "default_font"; }, (Token t) => (int)t.Type == 23, (Token t) => (int)t.Type == 63 }, false, true); TokenWaiter waiter2 = new TokenWaiter((Func)((Token t) => false), false); List.Enumerator enmr = tokens.ToList().GetEnumerator(); bool hasNext = enmr.MoveNext(); while (hasNext) { Token token = enmr.Current; hasNext = enmr.MoveNext(); if (waiter.Check(token)) { Console.WriteLine("[WFRusCS] Injecting options menu (preload -> load)"); Console.WriteLine(tokens.ToList().IndexOf(token)); yield return new Token((TokenType)5, (uint?)76u); waiter2 = new TokenWaiter((Func)((Token t) => t is ConstantToken), false); } else if (waiter2.Check(token)) { Console.WriteLine("[WFRusCS] Injecting options menu (main_font.tres -> cyrillic.tres)"); Console.WriteLine(tokens.ToList().IndexOf(token)); yield return (Token)new ConstantToken((Variant)new StringVariant("res://mods/WFRus/Cyrillic/cyrillic.tres")); waiter2 = new TokenWaiter((Func)((Token t) => false), false); } else { yield return token; } } } } public class PlayerVoice : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Entities/Player/player.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[3] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_sync_talk"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "blacklist"; }, (Token t) => (int)t.Type == 77 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { List ruChars = (from c in "абвгдеёжзийклмнопрстуфхцчшщьыэюя".ToList() select c.ToString()).ToList(); foreach (string ch in ruChars) { yield return new Token((TokenType)82, (uint?)null); yield return (Token)new ConstantToken((Variant)new StringVariant(ch)); } yield return token; } else { yield return token; } } } } public class SpeechBubble : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Entities/Player/SpeechBubble/speech_bubble.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[2] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_ready"; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { yield return token; IEnumerable tkns = Helpers.SetFont("RichTextLabel"); foreach (Token item in tkns) { yield return item; } yield return new Token((TokenType)89, (uint?)1u); } else { yield return token; } } } } public class SplashScreen(WFRusMod mod) : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Menus/Splash/splash.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[2] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_ready"; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { yield return new Token((TokenType)89, (uint?)1u); IEnumerable tkns = Array.Empty(); tkns = tkns.Concat(Helpers.LoadExtImage("lame", mod.Config.splashLamePath)); tkns = tkns.Concat(Helpers.LoadExtImage("god", mod.Config.splashGodotPath)); foreach (Token item in tkns) { yield return item; } yield return new Token((TokenType)89, (uint?)1u); } else { yield return token; } } } } } namespace WFRus.modifies.globals { public class GlobalsAddMaps : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Singletons/globals.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[2] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "loot_tables"; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { yield return token; IEnumerable tkns = Array.Empty(); Dictionary titleNameDict = new Dictionary { ["Scout"] = "Скаут", ["Second Class Scout"] = "Второклассный скаут", ["First Class Scout"] = "Первоклассный скаут", ["Star Scout"] = "Звёздный скаут", ["Life Scout"] = "Скаут по жизни", ["Eagle Scout"] = "Старший скаут", ["Survival Expert"] = "Эксперт по выживанию", ["Pack Leader"] = "Лидер стаи", ["Headmaster"] = "Директор", ["Tenderfoot"] = "Новичок", ["Voyager"] = "Путешественник", ["Ace"] = "Ас", ["Admiral"] = "Адмирал", ["Ancient"] = "Древний", ["Bi"] = "Би", ["Bipedal Animal Drawer"] = "Двуногая тумбочка-животное", ["cadaver dog"] = "собака-кадавр", ["NiceCandy"] = "NiceCandy", ["Catfisher"] = "Ловец сомов", ["Cozy"] = "Комфортный", ["Creature"] = "Существо", ["Critter"] = "Тварь", ["Cryptid"] = "Криптоид", ["Dude"] = "Чувак", ["Elite"] = "Элита", [":3"] = ":3", ["Fish-Pilled"] = "Рыбинист", ["Freaky"] = "Фрик", ["Gay"] = "Гей", ["The Title Only For People Who Caught The Super Duper Rare Golden Bass"] = "Звание только для тех, кто поймал супер пупер редкого золотого окуня", ["The Title Only For People Who Caught The Super Duper Rare Golden Ray"] = "Звание только для тех, кто поймал супер пупер редкого золотого ската", ["Goober"] = "Дурашка", ["Good Boy"] = "Хороший мальчик", ["Good Girl"] = "Хорошая девочка", ["77 | 3328 FISSILE"] = "77 | 3328 FISSILE", ["Igloo or Hot Dog"] = "Иглу или хот-дог", ["Normal and Regular"] = "Нормальный и обычный", ["Is Cool"] = "Очень крутой", ["King"] = "Король", ["Kitten"] = "Котик", ["Koi Boy"] = "Кой-бой", ["fake lamedev"] = "фейк lamedev", ["lamedev"] = "lamedev", ["Lesbian"] = "Лесбиянка", ["Little Lad"] = "Микрочел", ["Majestic"] = "Царь во дворца", ["Musky"] = "Мускусный", ["Night Crawler"] = "Стрингер", ["nitrous oxide"] = "закусь азотом", ["Non-Binary"] = "Небинарный", ["Pan"] = "Кастрюля", ["Pretty"] = "Милый", ["Problematic"] = "Проблемный", ["Pup"] = "Щенок", ["Puppy"] = "Пёсик", ["Queer"] = "Квир", ["Shark Bait"] = "Наживка для акул", ["shithead"] = "ублюдок", ["Silly Guy"] = "Дурачок", ["Soggy Doggy"] = "До нитки", ["Special"] = "Особый", ["Webfishing Special Forces"] = "Спецотряд интернет-рыбалки", ["Stinker Dinker"] = "Вонючка", ["\"straight\""] = "\"натурал\"", ["Strongest Warrior"] = "Сильнейший воин", ["Stupid Idiot Baby"] = "Тупой ребёнок-идиот", ["Trans"] = "Транс", ["Yapper"] = "Болтун", ["ZedDog"] = "ZedDog" }; tkns = tkns.Concat(assignDictionary("titlenamedict", titleNameDict)); tkns = tkns.Append(new Token((TokenType)89, (uint?)null)); Dictionary titleDescDict = new Dictionary { ["Welcome to Camp!"] = "Добро пожаловать в лагерь!", ["Getting the ropes!"] = "Уже понимаешь, как всё завязано!", ["Making a name for yourself!"] = "Зарабатываешь репутацию!", ["Shining!"] = "Блестишь!", ["Climbing the ladder!"] = "Взбираешься по лестнице!", ["The best of the best!"] = "Лучший из лучших!", ["You know it all!"] = "Всё знаешь!", ["Lead by example!"] = "Веди примером!", ["Keeping everyone else in line!"] = "Держишь всех в строю!", ["Getting around!"] = "Бегаешь туда-сюда!", ["Top of the world."] = "Вершина мира.", ["Ace!"] = "Ас!", ["admirable"] = "восхитительно", ["Eons old!"] = "Стар, как мир!", ["Bi!"] = "Би!", ["RAHHHH"] = "РАХХХХ", ["worlds smartest mutt"] = "умнейшая дворняга", ["the nicests candy"] = "the nicests candy", ["kinda like a cat but if it was fishing"] = "типа ловец снов но ловец сомов", ["Nice and warm!"] = "Уютно и тепло.", ["Raaaahh!"] = "Раааахх!", ["just scampering around, you"] = "тупо слоняешься без дела, ты", ["Mysterious!"] = "Загадочно!", ["Duuuuude..."] = "Чуваааак...", ["Intense!"] = "Мощно!", [":3"] = ":3", ["based and fish-pilled"] = "базированный рыбинист", ["what if webfishing was freaky"] = "вот бы была иге по интернет рыбалке", ["Gay!"] = "Гей!", ["Woah!"] = "Воу!", ["Goob!"] = "Гуп!", ["Who'sa good boy!"] = "Кто хороший мальчик!", ["Who'sa good girl!"] = "Кто хорошая девочка!", ["Hazardous..."] = "Радиокартивно...", ["wad of meat"] = "пачка мяса", ["we know, zach."] = "мы в курсе, зак.", ["The coolest."] = "Крутейший.", ["Royalty!"] = "Царственно!", ["Mew!"] = "Мяу!", ["koiboi"] = "коибои", ["due to a bug, this exists now."] = "произошёл какой-то баг, и появилось это звание", ["if youre not west and you see this. you're evil."] = "если вы не уэст и видите это. вы злодей.", ["Lesbian!"] = "Лесбиянка!", ["Lil guy!"] = "Мини-челик!", ["Graceful!"] = "Грациозно!", ["Smelly!"] = "Вонь какая!", ["Wormy!"] = "Джилленхол?", ["very funny"] = "очень смешно", ["Non-Binary!"] = "Небинарный!", ["Pan!"] = "Кастрюля!", ["The prettiest!"] = "Милейше!", ["Yikes, dude."] = "Мда, чел.", ["Yeah."] = "Ага.", ["Pup!"] = "Щенок!", ["How peculiar."] = "Как интересно.", ["Shark Bait!"] = "Наживка для акул!", ["Pronounced, Shitheed."] = "Кто, интересно, выберет такое звание?", ["just a silly lil guy,,,"] = "всего лишь маленький дурашка", ["Sloppy!"] = "Подскользнёшься!", ["Very special :)"] = "Очень особый :)", ["The W.S.F."] = "С.И.Р.", ["The stinkiest!"] = "Максимальный вонючка!", ["mhm"] = "угу", ["The mightiest!"] = "Величайший!", ["we get it box."] = "это же для друзей разраба, да?", ["Trans!"] = "Транс!", ["Yap yap yap!"] = "Бла бла бла!", ["zeddy doggy"] = "zeddy doggy" }; tkns = tkns.Concat(assignDictionary("titledescdict", titleDescDict)); tkns = tkns.Append(new Token((TokenType)89, (uint?)null)); foreach (Token item in tkns) { yield return item; } } else { yield return token; } } } private IEnumerable assignDictionary(string identifier, Dictionary dict) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown IEnumerable source = Array.Empty(); source = source.Append(new Token((TokenType)59, (uint?)null)); source = source.Append((Token)new IdentifierToken(identifier)); source = source.Append(new Token((TokenType)23, (uint?)null)); source = source.Append(new Token((TokenType)78, (uint?)null)); source = source.Concat(parseDictionary(dict)); return source.Append(new Token((TokenType)79, (uint?)null)); } private IEnumerable parseDictionary(Dictionary dict) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown IEnumerable enumerable = Array.Empty(); Dictionary.Enumerator enumerator = dict.GetEnumerator(); bool flag = enumerator.MoveNext(); while (flag) { enumerator.Current.Deconstruct(out var key, out var value); string text = key; string text2 = value; flag = enumerator.MoveNext(); enumerable = enumerable.Append((Token)new ConstantToken((Variant)new StringVariant(text))); enumerable = enumerable.Append(new Token((TokenType)86, (uint?)null)); enumerable = enumerable.Append((Token)new ConstantToken((Variant)new StringVariant(text2))); if (flag) { enumerable = enumerable.Append(new Token((TokenType)82, (uint?)null)); } } return enumerable; } } public class GlobalsUseMaps : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Singletons/globals.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[4] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_add_resource"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "new"; }, delegate(Token t) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 int result; if (t != null && (int)t.Type == 5) { uint? associatedData = t.AssociatedData; if (associatedData.HasValue) { result = ((associatedData == 76) ? 1 : 0); goto IL_002a; } } result = 0; goto IL_002a; IL_002a: return (byte)result != 0; }, (Token t) => (int)t.Type == 89 }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { IEnumerable tkns = Array.Empty(); tkns = tkns.Concat(ScriptTokenizer.Tokenize("if file_name.rfind(\"title_\") != -1:", 1u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("if new[\"file\"].title in titlenamedict:", 2u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("var titlename = titlenamedict[new[\"file\"].title]", 3u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("new[\"file\"].title = titlename", 3u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("new[\"file\"].name = \"Звание «\" + titlename + \"»\" ", 3u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("new[\"file\"].desc = titledescdict[new[\"file\"].desc]", 3u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("elif new[\"file\"].name == \"No Title\":", 2u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("new[\"file\"].name = \"Нет звания\" ", 3u)); tkns = tkns.Concat(ScriptTokenizer.Tokenize("new[\"file\"].desc = \"Без звания!\" ", 3u)); foreach (Token item in tkns) { yield return item; } yield return new Token((TokenType)89, (uint?)1u); } else { yield return token; } } } } public class Voice : IScriptMod { public bool ShouldRun(string path) { return path == "res://Scenes/Singletons/globals.gdc"; } public IEnumerable Modify(string path, IEnumerable tokens) { MultiTokenWaiter waiter = new MultiTokenWaiter(new Func[5] { delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "_generate_voice_bank"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "voice_bank"; }, delegate(Token t) { IdentifierToken val = (IdentifierToken)(object)((t is IdentifierToken) ? t : null); return val != null && val.Name == "path"; }, (Token t) => (int)t.Type == 23, (Token t) => t is ConstantToken }, false, true); foreach (Token token in tokens) { if (waiter.Check(token)) { yield return (Token)new ConstantToken((Variant)new StringVariant("res://mods/WFRus/RuVoice/")); } else { yield return token; } } } } }