Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of RealerStageTweaker v1.0.6
RealerStageTweaker.dll
Decompiled a year agousing 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.Security; using System.Security.Permissions; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HG; using HG.Reflection; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using On.RoR2; using On.RoR2.UI.MainMenu; using R2API; using R2API.AddressReferencedAssets; using RoR2; using RoR2.ExpansionManagement; using RoR2.Networking; using RoR2.UI; using RoR2.UI.MainMenu; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets.ResourceLocators; using UnityEngine.Events; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceProviders; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RealerStageTweaker")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3a29d78d9ed2a5b52f25cc499fd46b6ee7259483")] [assembly: AssemblyProduct("RealerStageTweaker")] [assembly: AssemblyTitle("RealerStageTweaker")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace RealerStageTweaker { public class Apply { public static string[] CategoryMutations = new string[5] { "Standard", "Family", "VoidInvasion", "", "Void Infestation" }; public static Dictionary<string, ConditionalPoolEntry> Families = new Dictionary<string, ConditionalPoolEntry>(); public static void Monster(ClassicStageInfo csi, Dictionary<string, float> monsters, Dictionary<string, float> monstersLoop) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_0454: Unknown result type (might be due to invalid IL or missing references) //IL_05a8: Unknown result type (might be due to invalid IL or missing references) //IL_05d6: Unknown result type (might be due to invalid IL or missing references) //IL_05d8: Unknown result type (might be due to invalid IL or missing references) //IL_0638: Unknown result type (might be due to invalid IL or missing references) //IL_0858: Unknown result type (might be due to invalid IL or missing references) //IL_085a: Unknown result type (might be due to invalid IL or missing references) //IL_073d: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); List<string> list2 = new List<string>(); List<string> list3 = new List<string>(); Main.Log.LogInfo((object)"Patching Monsters"); Category val = GetCategory(csi.monsterDccsPool); if (val == null) { val = new Category { categoryWeight = 1f, name = "Standard", alwaysIncluded = Array.Empty<PoolEntry>(), includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(), includedIfNoConditionsMet = Array.Empty<PoolEntry>() }; } PoolEntry val2 = GetEntry(csi.monsterDccsPool); if (val2 == null) { val2 = new PoolEntry { dccs = ScriptableObject.CreateInstance<DirectorCardCategorySelection>(), weight = 1f }; } ConditionalPoolEntry val3 = (ConditionalPoolEntry)(object)((val2 is ConditionalPoolEntry) ? val2 : null); if (val3 != null) { val3.requiredExpansions = Array.Empty<ExpansionDef>(); } Category obj = val; List<PoolEntry> list4 = new List<PoolEntry>(); list4.AddRange(val.alwaysIncluded.Where((PoolEntry x) => x.dccs is FamilyDirectorCardCategorySelection)); list4.Add(val2); obj.alwaysIncluded = list4.ToArray(); val.includedIfConditionsMet = val.includedIfConditionsMet.Where((ConditionalPoolEntry x) => ((PoolEntry)x).dccs is FamilyDirectorCardCategorySelection).ToArray(); val.includedIfNoConditionsMet = val.includedIfNoConditionsMet.Where((PoolEntry x) => x.dccs is FamilyDirectorCardCategorySelection).ToArray(); for (int i = 0; i < val2.dccs.categories.Length; i++) { Category val4 = val2.dccs.categories[i]; List<DirectorCard> list5 = new List<DirectorCard>(); DirectorCard[] cards = val4.cards; foreach (DirectorCard val5 in cards) { SpawnCard spawnCard = val5.spawnCard; string text = ((spawnCard == null) ? null : ((Object)spawnCard).name?.Replace(",", "")); if (string.IsNullOrWhiteSpace(text)) { Main.Log.LogWarning((object)("invalid spawncard at " + ((object)val5)?.ToString() + "!")); continue; } bool flag = false; float value = 0f; if (monstersLoop.TryGetValue(text, out value)) { flag = true; } else if (!monsters.TryGetValue(text, out value) || value <= 0f) { list.Add(text); continue; } bool flag2 = false; bool flag3 = val5.minimumStageCompletions == 0; if (flag3 != flag) { flag2 = true; } val5.minimumStageCompletions = (flag ? 5 : 0); if ((float)val5.selectionWeight != value) { flag2 = true; val5.selectionWeight = (int)value; } if (flag2) { list2.Add(text); } list5.Add(val5); monsters.Remove(text); monstersLoop.Remove(text); } string[] array = monstersLoop.Keys.ToArray(); foreach (string text2 in array) { if (!SavedConfig.Category.ContainsKey(text2)) { monsters.Remove(text2); monstersLoop.Remove(text2); } else if (SavedConfig.Category[text2] == val4.name) { if (!Main.Enemies.ContainsKey(text2)) { Main.Log.LogWarning((object)("Enemy failed to load: " + text2 + ", skipping")); monsters.Remove(text2); monstersLoop.Remove(text2); } else { list5.Add(MakeDirectorCard(text2, (SpawnCard)(object)Main.Enemies[text2], monstersLoop[text2], isLoop: true)); list3.Add(text2); monsters.Remove(text2); monstersLoop.Remove(text2); } } } string[] array2 = monsters.Keys.ToArray(); foreach (string text3 in array2) { if (!SavedConfig.Category.ContainsKey(text3)) { monsters.Remove(text3); monstersLoop.Remove(text3); } else if (SavedConfig.Category[text3] == val4.name) { if (!Main.Enemies.ContainsKey(text3)) { Main.Log.LogWarning((object)("Enemy failed to load: " + text3 + ", skipping")); monsters.Remove(text3); monstersLoop.Remove(text3); } else { list5.Add(MakeDirectorCard(text3, (SpawnCard)(object)Main.Enemies[text3], monsters[text3], isLoop: false)); list3.Add(text3); monsters.Remove(text3); monstersLoop.Remove(text3); } } } val2.dccs.categories[i].cards = list5.ToArray(); } while (monstersLoop.Count > 0 || monsters.Count > 0) { string key = ((monstersLoop.Count == 0) ? monsters.First() : monstersLoop.First()).Key; if (!SavedConfig.Category.ContainsKey(key)) { monsters.Remove(key); monstersLoop.Remove(key); continue; } string text4 = SavedConfig.Category[key]; Category val6 = default(Category); val6.name = text4; val6.selectionWeight = SavedConfig.CategoryWeight[text4]; val6.cards = Array.Empty<DirectorCard>(); Category val7 = val6; List<DirectorCard> list6 = new List<DirectorCard>(); string[] array3 = monstersLoop.Keys.ToArray(); foreach (string text5 in array3) { if (!SavedConfig.Category.ContainsKey(text5)) { monsters.Remove(text5); monstersLoop.Remove(text5); } else if (SavedConfig.Category[text5] == val7.name) { if (!Main.Enemies.ContainsKey(text5)) { Main.Log.LogWarning((object)("Enemy failed to load: " + text5 + ", skipping")); monsters.Remove(text5); monstersLoop.Remove(text5); } else { list6.Add(MakeDirectorCard(text5, (SpawnCard)(object)Main.Enemies[text5], monstersLoop[text5], isLoop: true)); list3.Add(text5); monsters.Remove(text5); monstersLoop.Remove(text5); } } } string[] array4 = monsters.Keys.ToArray(); foreach (string text6 in array4) { if (!SavedConfig.Category.ContainsKey(text6)) { monsters.Remove(text6); monstersLoop.Remove(text6); } else if (SavedConfig.Category[text6] == val7.name) { if (!Main.Enemies.ContainsKey(text6)) { Main.Log.LogWarning((object)("Enemy failed to load: " + text6 + ", skipping")); monsters.Remove(text6); monstersLoop.Remove(text6); } else { list6.Add(MakeDirectorCard(text6, (SpawnCard)(object)Main.Enemies[text6], monsters[text6], isLoop: false)); list3.Add(text6); monsters.Remove(text6); monstersLoop.Remove(text6); } } } val7.cards = list6.ToArray(); DirectorCardCategorySelection dccs = val2.dccs; Category[] categories = val2.dccs.categories; int num = 0; Category[] array5 = (Category[])(object)new Category[1 + categories.Length]; ReadOnlySpan<Category> readOnlySpan = new ReadOnlySpan<Category>(categories); readOnlySpan.CopyTo(new Span<Category>(array5).Slice(num, readOnlySpan.Length)); num += readOnlySpan.Length; array5[num] = val7; num++; dccs.categories = array5; } Main.Log.LogInfo((object)$"Added {list3.Count} ({Setup.JoinAndOrderBy(list3)}), Changed {list2.Count} ({Setup.JoinAndOrderBy(list2)}), Removed {list.Count} ({Setup.JoinAndOrderBy(list)}) monsters"); } public static void Family(ClassicStageInfo csi, List<string> families) { //IL_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Expected O, but got Unknown //IL_046a: Unknown result type (might be due to invalid IL or missing references) //IL_046f: Unknown result type (might be due to invalid IL or missing references) //IL_0477: Unknown result type (might be due to invalid IL or missing references) //IL_0482: Unknown result type (might be due to invalid IL or missing references) //IL_048f: Expected O, but got Unknown List<string> list = new List<string>(); List<string> list2 = new List<string>(); Main.Log.LogInfo((object)"Patching Families"); Category val = null; int num = 0; Category[] poolCategories = csi.monsterDccsPool.poolCategories; foreach (Category val2 in poolCategories) { Category val3 = val2; if (val3.alwaysIncluded == null) { val3.alwaysIncluded = Array.Empty<PoolEntry>(); } val3 = val2; if (val3.includedIfConditionsMet == null) { val3.includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(); } val3 = val2; if (val3.includedIfNoConditionsMet == null) { val3.includedIfNoConditionsMet = Array.Empty<PoolEntry>(); } if (val2.name == "Families" || val2.name == "Family") { val = val2; num = int.MaxValue; } bool flag = val2.includedIfConditionsMet.Any(Setup.HasDLC); PoolEntry[] families2 = GetFamilies(val2); if (families2.Length > num) { val = val2; num = families2.Length; } IEnumerable<PoolEntry> contains = families2.Where((PoolEntry x) => families.Contains(((FamilyDirectorCardCategorySelection)x.dccs).selectionChatString.Replace(",", ""))); list.AddRange(families2.Select((PoolEntry x) => ((FamilyDirectorCardCategorySelection)x.dccs).selectionChatString.Replace(",", "")).Except(contains.Select((PoolEntry x) => ((FamilyDirectorCardCategorySelection)x.dccs).selectionChatString.Replace(",", "")))); List<PoolEntry> list3 = new List<PoolEntry>(); list3.AddRange(val2.alwaysIncluded.Where((PoolEntry x) => !(x.dccs is FamilyDirectorCardCategorySelection) || contains.Contains(x))); val2.alwaysIncluded = list3.ToArray(); List<ConditionalPoolEntry> list4 = new List<ConditionalPoolEntry>(); list4.AddRange(val2.includedIfConditionsMet.Where((ConditionalPoolEntry x) => !(((PoolEntry)x).dccs is FamilyDirectorCardCategorySelection) || contains.Contains((PoolEntry)(object)x))); val2.includedIfConditionsMet = list4.ToArray(); List<PoolEntry> list5 = new List<PoolEntry>(); list5.AddRange(val2.includedIfNoConditionsMet.Where((PoolEntry x) => !(x.dccs is FamilyDirectorCardCategorySelection) || contains.Contains(x))); val2.includedIfNoConditionsMet = list5.ToArray(); families.RemoveAll(contains.Select((PoolEntry x) => ((FamilyDirectorCardCategorySelection)x.dccs).selectionChatString.Replace(",", "")).Contains<string>); } if (val == null) { val = new Category { categoryWeight = ClassicStageInfo.monsterFamilyChance, name = "Family", alwaysIncluded = Array.Empty<PoolEntry>(), includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(), includedIfNoConditionsMet = Array.Empty<PoolEntry>() }; DccsPool monsterDccsPool = csi.monsterDccsPool; Category[] poolCategories2 = csi.monsterDccsPool.poolCategories; int num2 = 0; Category[] array = (Category[])(object)new Category[1 + poolCategories2.Length]; ReadOnlySpan<Category> readOnlySpan = new ReadOnlySpan<Category>(poolCategories2); readOnlySpan.CopyTo(new Span<Category>(array).Slice(num2, readOnlySpan.Length)); num2 += readOnlySpan.Length; array[num2] = val; num2++; monsterDccsPool.poolCategories = array; } List<ConditionalPoolEntry> list6 = new List<ConditionalPoolEntry>(); foreach (string family in families) { if (Families.TryGetValue(family, out var value)) { list6.Add(value); continue; } if (!SavedConfig.Families.ContainsKey(family)) { Main.Log.LogWarning((object)("family not found: " + family + ", skipping")); continue; } FamilyDirectorCardCategorySelection val4 = ScriptableObject.CreateInstance<FamilyDirectorCardCategorySelection>(); ((Object)val4).name = "dccs" + Setup.ToTitleCase(family); val4.selectionChatString = family; val4.minimumStageCompletion = 0; val4.maximumStageCompletion = int.MaxValue; ((DirectorCardCategorySelection)val4).categories = SavedConfig.Families[family].Where((string x) => SavedConfig.Category.ContainsKey(x) && SavedConfig.CategoryWeight.ContainsKey(SavedConfig.Category[x]) && Main.Enemies.ContainsKey(x)).Select(delegate(string x) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) Category result = default(Category); result.name = SavedConfig.Category[x]; result.selectionWeight = SavedConfig.CategoryWeight[SavedConfig.Category[x]]; result.cards = (DirectorCard[])(object)new DirectorCard[1] { MakeDirectorCard(x, (SpawnCard)(object)Main.Enemies[x], 1f, isLoop: false) }; return result; }).ToArray(); ConditionalPoolEntry val5 = new ConditionalPoolEntry { dccs = (DirectorCardCategorySelection)(object)val4, requiredExpansions = Array.Empty<ExpansionDef>(), weight = 1f }; Families.Add(family, val5); list6.Add(val5); } Category val6 = val; ConditionalPoolEntry[] includedIfConditionsMet = val.includedIfConditionsMet; List<ConditionalPoolEntry> list7 = list6; int num3 = 0; ConditionalPoolEntry[] array2 = (ConditionalPoolEntry[])(object)new ConditionalPoolEntry[includedIfConditionsMet.Length + list7.Count]; ReadOnlySpan<ConditionalPoolEntry> readOnlySpan2 = new ReadOnlySpan<ConditionalPoolEntry>(includedIfConditionsMet); readOnlySpan2.CopyTo(new Span<ConditionalPoolEntry>(array2).Slice(num3, readOnlySpan2.Length)); num3 += readOnlySpan2.Length; foreach (ConditionalPoolEntry item in list7) { array2[num3] = item; num3++; } val6.includedIfConditionsMet = array2; Main.Log.LogInfo((object)$"Added {families.Count} ({Setup.JoinAndOrderBy(families)}), Removed {list.Count} ({Setup.JoinAndOrderBy(list)}) family events"); } public static PoolEntry[] GetFamilies(Category category) { bool flag = category.includedIfConditionsMet.Any(Setup.HasDLC); List<PoolEntry> list = new List<PoolEntry>(); list.AddRange(category.alwaysIncluded.Where((PoolEntry x) => x.dccs is FamilyDirectorCardCategorySelection)); PoolEntry[] source; if (!flag) { source = category.includedIfNoConditionsMet; } else { PoolEntry[] includedIfConditionsMet = (PoolEntry[])(object)category.includedIfConditionsMet; source = includedIfConditionsMet; } list.AddRange(source.Where((PoolEntry x) => x.dccs is FamilyDirectorCardCategorySelection)); return list.ToArray(); } public static void Interactable(ClassicStageInfo csi, Dictionary<string, float> interactables) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_03c2: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0521: Unknown result type (might be due to invalid IL or missing references) //IL_0523: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); List<string> list2 = new List<string>(); List<string> list3 = new List<string>(); Main.Log.LogInfo((object)"Patching Interactables"); Category val = GetCategory(csi.interactableDccsPool); if (val == null) { val = new Category { categoryWeight = 1f, name = "Standard", alwaysIncluded = Array.Empty<PoolEntry>(), includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(), includedIfNoConditionsMet = Array.Empty<PoolEntry>() }; } PoolEntry val2 = GetEntry(csi.interactableDccsPool); if (val2 == null) { val2 = new PoolEntry { dccs = ScriptableObject.CreateInstance<DirectorCardCategorySelection>(), weight = 1f }; } ConditionalPoolEntry val3 = (ConditionalPoolEntry)(object)((val2 is ConditionalPoolEntry) ? val2 : null); if (val3 != null) { val3.requiredExpansions = Array.Empty<ExpansionDef>(); } val.alwaysIncluded = (PoolEntry[])(object)new PoolEntry[1] { val2 }; val.includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(); val.includedIfNoConditionsMet = Array.Empty<PoolEntry>(); for (int i = 0; i < val2.dccs.categories.Length; i++) { Category val4 = val2.dccs.categories[i]; List<DirectorCard> list4 = new List<DirectorCard>(); DirectorCard[] cards = val4.cards; foreach (DirectorCard val5 in cards) { SpawnCard spawnCard = val5.spawnCard; string text = ((spawnCard == null) ? null : ((Object)spawnCard).name?.Replace(",", "")); if (string.IsNullOrWhiteSpace(text)) { Main.Log.LogWarning((object)("invalid spawncard at " + ((object)val5)?.ToString() + "!")); } else { if (text == "iscShockDrone") { continue; } float value = 0f; if (!interactables.TryGetValue(text, out value) || value <= 0f) { list.Add(text); continue; } if ((float)val5.selectionWeight != value) { list2.Add(text); val5.selectionWeight = (int)value; } list4.Add(val5); interactables.Remove(text); } } string[] array = interactables.Keys.ToArray(); foreach (string text2 in array) { if (!SavedConfig.Category.ContainsKey(text2)) { interactables.Remove(text2); } else if (SavedConfig.Category[text2] == val4.name) { if (!Main.Interactables.ContainsKey(text2)) { Main.Log.LogWarning((object)("Interactable failed to load: " + text2 + ", skipping")); interactables.Remove(text2); } else { list4.Add(MakeDirectorCard(text2, (SpawnCard)(object)Main.Interactables[text2], interactables[text2], isLoop: false)); list3.Add(text2); interactables.Remove(text2); } } } val2.dccs.categories[i].cards = list4.ToArray(); } while (interactables.Count > 0) { string key = interactables.First().Key; if (!SavedConfig.Category.ContainsKey(key)) { interactables.Remove(key); continue; } string text3 = SavedConfig.Category[key]; Category val6 = default(Category); val6.name = text3; val6.selectionWeight = SavedConfig.CategoryWeight[text3]; val6.cards = Array.Empty<DirectorCard>(); Category val7 = val6; List<DirectorCard> list5 = new List<DirectorCard>(); string[] array2 = interactables.Keys.ToArray(); foreach (string text4 in array2) { if (!SavedConfig.Category.ContainsKey(text4)) { interactables.Remove(text4); } else if (SavedConfig.Category[text4] == val7.name) { if (!Main.Interactables.ContainsKey(text4)) { Main.Log.LogWarning((object)("Interactable failed to load: " + text4 + ", skipping")); interactables.Remove(text4); } else { list5.Add(MakeDirectorCard(text4, (SpawnCard)(object)Main.Interactables[text4], interactables[text4], isLoop: false)); list3.Add(text4); interactables.Remove(text4); } } } val7.cards = list5.ToArray(); DirectorCardCategorySelection dccs = val2.dccs; Category[] categories = val2.dccs.categories; int num = 0; Category[] array3 = (Category[])(object)new Category[1 + categories.Length]; ReadOnlySpan<Category> readOnlySpan = new ReadOnlySpan<Category>(categories); readOnlySpan.CopyTo(new Span<Category>(array3).Slice(num, readOnlySpan.Length)); num += readOnlySpan.Length; array3[num] = val7; num++; dccs.categories = array3; } Main.Log.LogInfo((object)$"Added {list3.Count} ({Setup.JoinAndOrderBy(list3)}), Changed {list2.Count} ({Setup.JoinAndOrderBy(list2)}), Removed {list.Count} ({Setup.JoinAndOrderBy(list)}) interactables"); } public static void _Finalize(ClassicStageInfo self) { Category[] poolCategories = self.monsterDccsPool.poolCategories; foreach (Category val in poolCategories) { if (!CategoryMutations.Contains(val.name)) { continue; } PoolEntry[] alwaysIncluded = val.alwaysIncluded; foreach (PoolEntry val2 in alwaysIncluded) { val2.dccs.categories = val2.dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val.alwaysIncluded = val.alwaysIncluded.Where((PoolEntry x) => x.weight > 0f && x.dccs.categories.Length != 0).ToArray(); ConditionalPoolEntry[] includedIfConditionsMet = val.includedIfConditionsMet; foreach (ConditionalPoolEntry val3 in includedIfConditionsMet) { ((PoolEntry)val3).dccs.categories = ((PoolEntry)val3).dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val.includedIfConditionsMet = val.includedIfConditionsMet.Where((ConditionalPoolEntry x) => ((PoolEntry)x).weight > 0f && ((PoolEntry)x).dccs.categories.Length != 0).ToArray(); PoolEntry[] includedIfNoConditionsMet = val.includedIfNoConditionsMet; foreach (PoolEntry val4 in includedIfNoConditionsMet) { val4.dccs.categories = val4.dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val.includedIfNoConditionsMet = val.includedIfNoConditionsMet.Where((PoolEntry x) => x.weight > 0f && x.dccs.categories.Length != 0).ToArray(); } self.monsterDccsPool.poolCategories = self.monsterDccsPool.poolCategories.Where((Category x) => x.categoryWeight > 0f && x.alwaysIncluded.Length + x.includedIfConditionsMet.Length + x.includedIfNoConditionsMet.Length > 0).ToArray(); Category[] poolCategories2 = self.interactableDccsPool.poolCategories; foreach (Category val5 in poolCategories2) { if (!CategoryMutations.Contains(val5.name)) { continue; } PoolEntry[] alwaysIncluded2 = val5.alwaysIncluded; foreach (PoolEntry val6 in alwaysIncluded2) { val6.dccs.categories = val6.dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val5.alwaysIncluded = val5.alwaysIncluded.Where((PoolEntry x) => x.weight > 0f && x.dccs.categories.Length != 0).ToArray(); ConditionalPoolEntry[] includedIfConditionsMet2 = val5.includedIfConditionsMet; foreach (ConditionalPoolEntry val7 in includedIfConditionsMet2) { ((PoolEntry)val7).dccs.categories = ((PoolEntry)val7).dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val5.includedIfConditionsMet = val5.includedIfConditionsMet.Where((ConditionalPoolEntry x) => ((PoolEntry)x).weight > 0f && ((PoolEntry)x).dccs.categories.Length != 0).ToArray(); PoolEntry[] includedIfNoConditionsMet2 = val5.includedIfNoConditionsMet; foreach (PoolEntry val8 in includedIfNoConditionsMet2) { val8.dccs.categories = val8.dccs.categories.Where((Category x) => x.selectionWeight > 0f && x.cards.Count() > 0).ToArray(); } val5.includedIfNoConditionsMet = val5.includedIfNoConditionsMet.Where((PoolEntry x) => x.weight > 0f && x.dccs.categories.Length != 0).ToArray(); } self.interactableDccsPool.poolCategories = self.interactableDccsPool.poolCategories.Where((Category x) => x.categoryWeight > 0f && x.alwaysIncluded.Length + x.includedIfConditionsMet.Length + x.includedIfNoConditionsMet.Length > 0).ToArray(); if (self.monsterDccsPool.poolCategories.Length == 0) { Main.Log.LogWarning((object)"Monster pool is empty! did you empty the entire list??"); } if (self.interactableDccsPool.poolCategories.Length == 0) { Main.Log.LogWarning((object)"Interactable pool is empty! did you empty the entire list??"); } Main.Log.LogInfo((object)"Patch Completed!"); } public static DirectorCard MakeDirectorCard(string name, SpawnCard sc, float weight, bool isLoop) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown return new DirectorCard { spawnCard = sc, selectionWeight = (int)weight, minimumStageCompletions = (isLoop ? 5 : 0), spawnDistance = (MonsterSpawnDistance)SavedConfig.SpawnDistance[name], preventOverhead = SavedConfig.PreventOverhead[name] }; } public static PoolEntry GetEntry(DccsPool dp) { return GetEntry(dp, Setup.GetMainDCCS(dp)); } public static PoolEntry GetEntry(DccsPool dp, DirectorCardCategorySelection dccs) { if ((Object)(object)dccs == (Object)null) { return null; } Category[] poolCategories = dp.poolCategories; foreach (Category val in poolCategories) { if (!CategoryMutations.Contains(val.name)) { continue; } PoolEntry[] alwaysIncluded = val.alwaysIncluded; foreach (PoolEntry val2 in alwaysIncluded) { if ((Object)(object)val2.dccs == (Object)(object)dccs) { return val2; } } ConditionalPoolEntry[] includedIfConditionsMet = val.includedIfConditionsMet; foreach (ConditionalPoolEntry val3 in includedIfConditionsMet) { if ((Object)(object)((PoolEntry)val3).dccs == (Object)(object)dccs) { return (PoolEntry)(object)val3; } } PoolEntry[] includedIfNoConditionsMet = val.includedIfNoConditionsMet; foreach (PoolEntry val4 in includedIfNoConditionsMet) { if ((Object)(object)val4.dccs == (Object)(object)dccs) { return val4; } } } return null; } public static Category GetCategory(DccsPool dp) { return GetCategory(dp, Setup.GetMainDCCS(dp)); } public static Category GetCategory(DccsPool dp, PoolEntry entry) { Category[] poolCategories = dp.poolCategories; foreach (Category val in poolCategories) { if (CategoryMutations.Contains(val.name) && (val.alwaysIncluded.Contains(entry) || ((IEnumerable<PoolEntry>)(object)val.includedIfConditionsMet).Contains(entry) || val.includedIfNoConditionsMet.Contains(entry))) { return val; } } return null; } public static Category GetCategory(DccsPool dp, DirectorCardCategorySelection dccs) { if ((Object)(object)dccs == (Object)null) { return null; } Category[] poolCategories = dp.poolCategories; foreach (Category val in poolCategories) { if (CategoryMutations.Contains(val.name) && (val.alwaysIncluded.Any((PoolEntry x) => (Object)(object)x.dccs == (Object)(object)dccs) || val.includedIfConditionsMet.Any((ConditionalPoolEntry x) => (Object)(object)((PoolEntry)x).dccs == (Object)(object)dccs) || val.includedIfNoConditionsMet.Any((PoolEntry x) => (Object)(object)x.dccs == (Object)(object)dccs))) { return val; } } return null; } public static bool TryFirst<T>(IEnumerable<T> arr, Func<T, bool> fn, out T ret) { ret = default(T); foreach (T item in arr) { if (fn(item)) { ret = item; return true; } } return false; } } [BepInPlugin("zzz.prodzpod.RealerStageTweaker", "RealerStageTweaker", "1.0.6")] public class Main : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action <>9__14_0; public static hook_IsChoiceActive <>9__14_1; public static hook_OnEnter <>9__14_2; public static Action <>9__14_3; public static hook_RebuildCards <>9__14_4; public static Func<string, bool> <>9__14_6; public static Func<string, SceneDef> <>9__14_7; public static Func<GameObject, bool> <>9__16_3; public static Func<Category, bool> <>9__16_4; internal void <Awake>b__14_0() { input = GameObject.Find("MPEventSystem Player0").GetComponent<MPInput>(); } internal bool <Awake>b__14_1(orig_IsChoiceActive orig, RuleBook self, RuleChoiceDef choice) { return true; } internal void <Awake>b__14_2(orig_OnEnter orig, BaseMainMenuScreen self, MainMenuController mainMenuController) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, mainMenuController); Time.timeScale = 0f; MPEventSystem eventSystem = input.eventSystem; int cursorOpenerCount = eventSystem.cursorOpenerCount; eventSystem.cursorOpenerCount = cursorOpenerCount + 1; MPEventSystem eventSystem2 = input.eventSystem; cursorOpenerCount = eventSystem2.cursorOpenerForGamepadCount; eventSystem2.cursorOpenerForGamepadCount = cursorOpenerCount + 1; box = SimpleDialogBox.Create((MPEventSystem)null); box.headerToken = new TokenParamsPair("Scanning Stages", Array.Empty<object>()); box.descriptionToken = new TokenParamsPair("Thank you for using Realer Stage Tweaker!\nCollecting stage and enemy data, please wait...", Array.Empty<object>()); AddressReferencedAsset.LoadReferencesAsync(); } internal void <Awake>b__14_3() { SavedConfig.GetConfigs(); } internal void <Awake>b__14_4(orig_RebuildCards orig, ClassicStageInfo self, DirectorCardCategorySelection a, DirectorCardCategorySelection b) { float monsterCredit = SavedConfig.GetMonsterCredit(SceneCatalog.currentSceneDef); if (monsterCredit != -1f && (float)self.sceneDirectorMonsterCredits != monsterCredit) { Log.LogInfo((object)"Patching Monster Credits"); self.sceneDirectorMonsterCredits = (int)monsterCredit; } float interactableCredit = SavedConfig.GetInteractableCredit(SceneCatalog.currentSceneDef); if (interactableCredit != -1f && (float)self.sceneDirectorInteractibleCredits != interactableCredit) { Log.LogInfo((object)"Patching Interactable Credits"); self.sceneDirectorInteractibleCredits = (int)interactableCredit; } Dictionary<string, float> monster = SavedConfig.GetMonster(SceneCatalog.currentSceneDef); Dictionary<string, float> monsterLoop = SavedConfig.GetMonsterLoop(SceneCatalog.currentSceneDef); if (monster != null && monsterLoop != null) { Apply.Monster(self, monster, monsterLoop); } List<string> family = SavedConfig.GetFamily(SceneCatalog.currentSceneDef); if (family != null) { Apply.Family(self, family); } Dictionary<string, float> interactable = SavedConfig.GetInteractable(SceneCatalog.currentSceneDef); if (interactable != null) { Apply.Interactable(self, interactable); } Apply._Finalize(self); orig.Invoke(self, a, b); } internal bool <Awake>b__14_6(string x) { return !string.IsNullOrWhiteSpace(x); } internal SceneDef <Awake>b__14_7(string x) { return SceneCatalog.GetSceneDefFromSceneName(x.Trim()); } internal bool <GenerateConfigs>b__16_3(GameObject x) { ClassicStageInfo val = default(ClassicStageInfo); return x.TryGetComponent<ClassicStageInfo>(ref val); } internal bool <GenerateConfigs>b__16_4(Category x) { return x.name == MonsterPoolCategories.Standard; } } public const string PluginGUID = "prodzpod.RealerStageTweaker"; public const string PluginAuthor = "prodzpod"; public const string PluginName = "RealerStageTweaker"; public const string PluginVersion = "1.0.6"; public static ManualLogSource Log; public static PluginInfo pluginInfo; public static ConfigFile Config; public static MPInput input; public static MPButton button; public static SimpleDialogBox box; public static ConfigEntry<bool> ResetConfig; public static ConfigEntry<bool> ResetConfig2; public static Dictionary<string, CharacterSpawnCard> Enemies = new Dictionary<string, CharacterSpawnCard>(); public static Dictionary<string, InteractableSpawnCard> Interactables = new Dictionary<string, InteractableSpawnCard>(); public void Awake() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Expected O, but got Unknown //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Expected O, but got Unknown //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown pluginInfo = ((BaseUnityPlugin)this).Info; Log = ((BaseUnityPlugin)this).Logger; Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.RealerStageTweaker.cfg"), true); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { input = GameObject.Find("MPEventSystem Player0").GetComponent<MPInput>(); }); ResetConfig = Config.Bind<bool>("!! General", "Refresh Config", true, "fetches all monster and interactable cards. requires restart."); ResetConfig2 = Config.Bind<bool>("!! General", "Reset Config", true, "resets the config."); ConfigEntry<string> BlacklistStage1 = Config.Bind<string>("!! General", "Blacklist for Stage 1", "lakesnight, villagenight, habitatfall", "list of stages that should not appear on stage 1. compatibility with the original StageTweaker."); if (ResetConfig.Value) { object obj = <>c.<>9__14_1; if (obj == null) { hook_IsChoiceActive val = (orig_IsChoiceActive orig, RuleBook self, RuleChoiceDef choice) => true; <>c.<>9__14_1 = val; obj = (object)val; } RuleBook.IsChoiceActive += (hook_IsChoiceActive)obj; object obj2 = <>c.<>9__14_2; if (obj2 == null) { hook_OnEnter val2 = delegate(orig_OnEnter orig, BaseMainMenuScreen self, MainMenuController mainMenuController) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, mainMenuController); Time.timeScale = 0f; MPEventSystem eventSystem = input.eventSystem; int cursorOpenerCount = eventSystem.cursorOpenerCount; eventSystem.cursorOpenerCount = cursorOpenerCount + 1; MPEventSystem eventSystem2 = input.eventSystem; cursorOpenerCount = eventSystem2.cursorOpenerForGamepadCount; eventSystem2.cursorOpenerForGamepadCount = cursorOpenerCount + 1; box = SimpleDialogBox.Create((MPEventSystem)null); box.headerToken = new TokenParamsPair("Scanning Stages", Array.Empty<object>()); box.descriptionToken = new TokenParamsPair("Thank you for using Realer Stage Tweaker!\nCollecting stage and enemy data, please wait...", Array.Empty<object>()); AddressReferencedAsset.LoadReferencesAsync(); }; <>c.<>9__14_2 = val2; obj2 = (object)val2; } BaseMainMenuScreen.OnEnter += (hook_OnEnter)obj2; return; } SavedConfig.Load(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { SavedConfig.GetConfigs(); }); object obj3 = <>c.<>9__14_4; if (obj3 == null) { hook_RebuildCards val3 = delegate(orig_RebuildCards orig, ClassicStageInfo self, DirectorCardCategorySelection a, DirectorCardCategorySelection b) { float monsterCredit = SavedConfig.GetMonsterCredit(SceneCatalog.currentSceneDef); if (monsterCredit != -1f && (float)self.sceneDirectorMonsterCredits != monsterCredit) { Log.LogInfo((object)"Patching Monster Credits"); self.sceneDirectorMonsterCredits = (int)monsterCredit; } float interactableCredit = SavedConfig.GetInteractableCredit(SceneCatalog.currentSceneDef); if (interactableCredit != -1f && (float)self.sceneDirectorInteractibleCredits != interactableCredit) { Log.LogInfo((object)"Patching Interactable Credits"); self.sceneDirectorInteractibleCredits = (int)interactableCredit; } Dictionary<string, float> monster = SavedConfig.GetMonster(SceneCatalog.currentSceneDef); Dictionary<string, float> monsterLoop = SavedConfig.GetMonsterLoop(SceneCatalog.currentSceneDef); if (monster != null && monsterLoop != null) { Apply.Monster(self, monster, monsterLoop); } List<string> family = SavedConfig.GetFamily(SceneCatalog.currentSceneDef); if (family != null) { Apply.Family(self, family); } Dictionary<string, float> interactable = SavedConfig.GetInteractable(SceneCatalog.currentSceneDef); if (interactable != null) { Apply.Interactable(self, interactable); } Apply._Finalize(self); orig.Invoke(self, a, b); }; <>c.<>9__14_4 = val3; obj3 = (object)val3; } ClassicStageInfo.RebuildCards += (hook_RebuildCards)obj3; Run.Start += (hook_Start)delegate(orig_Start orig, Run self) { IEnumerable<SceneDef> list = from x in BlacklistStage1.Value.Split(',') where !string.IsNullOrWhiteSpace(x) select SceneCatalog.GetSceneDefFromSceneName(x.Trim()); SceneEntry[] sceneEntries = self.startingSceneGroup._sceneEntries; self.startingSceneGroup._sceneEntries = sceneEntries.Where((SceneEntry x) => !list.Contains(x.sceneDef)).ToArray(); orig.Invoke(self); self.startingSceneGroup._sceneEntries = sceneEntries; }; } [SystemInitializer(new Type[] { })] public static void SystemInitializer() { if (ResetConfig.Value) { AddressReferencedAsset.OnAddressReferencedAssetsLoaded += GenerateConfigs; } } public static void GenerateConfigs() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) if (ResetConfig.Value) { Log.LogInfo((object)"Deleting Existing Config"); } DirectorAPI.InitCustomMixEnemyArtifactDccs(); Enumerator<SceneDef> enumerator = SceneCatalog.allStageSceneDefs.GetEnumerator(); try { while (enumerator.MoveNext()) { SceneDef def2 = enumerator.Current; AssetReferenceScene sceneAddress = def2.sceneAddress; string text = ((sceneAddress != null) ? ((AssetReference)sceneAddress).AssetGUID : null); if (!string.IsNullOrEmpty(text)) { if (NetworkManagerSystem.IsAddressablesKeyValid(text, typeof(SceneInstance))) { AsyncOperationHandle<SceneInstance> val = Addressables.LoadSceneAsync((object)text, (LoadSceneMode)1, true, 100); val.Completed += delegate { loadScene(def2); }; } } else { AsyncOperation val2 = SceneManager.LoadSceneAsync(def2.cachedName, (LoadSceneMode)1); val2.completed += delegate { loadScene(def2); }; } } } finally { ((IDisposable)enumerator).Dispose(); } static void loadScene(SceneDef def) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown //IL_006e: Expected O, but got Unknown //IL_0073: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Expected O, but got Unknown //IL_01e9: Unknown result type (might be due to invalid IL or missing references) Scene sceneByName = SceneManager.GetSceneByName(def.cachedName); ClassicStageInfo val4 = default(ClassicStageInfo); ClassicStageInfo val3 = (ClassicStageInfo.instance = ((Scene)(ref sceneByName)).GetRootGameObjects().First((GameObject x) => x.TryGetComponent<ClassicStageInfo>(ref val4)).GetComponent<ClassicStageInfo>()); DirectorAPI.SetHooks(); StageInfo stageInfo = DirectorAPI.GetStageInfo(val3); Run.instance = new Run { networkRuleBookComponent = new NetworkRuleBook { ruleBook = new RuleBook() } }; RunArtifactManager.instance = new RunArtifactManager { _enabledArtifacts = Array.Empty<bool>(), run = Run.instance }; if (Object.op_Implicit((Object)(object)val3)) { if (!Object.op_Implicit((Object)(object)val3.monsterDccsPool) && Object.op_Implicit((Object)(object)val3.monsterCategories)) { DirectorAPI.PortToNewMonsterSystem(val3); } if (!Object.op_Implicit((Object)(object)val3.interactableDccsPool) && Object.op_Implicit((Object)(object)val3.interactableCategories)) { DirectorAPI.PortToNewInteractableSystem(val3); } if (Object.op_Implicit((Object)(object)val3.monsterDccsPool) && !val3.monsterDccsPool.poolCategories.Any((Category x) => x.name == MonsterPoolCategories.Standard)) { if (val3.monsterDccsPool.poolCategories.Length == 0) { val3.monsterDccsPool.poolCategories = (Category[])(object)new Category[1] { new Category { name = MonsterPoolCategories.Standard, categoryWeight = 1f, alwaysIncluded = Array.Empty<PoolEntry>(), includedIfConditionsMet = Array.Empty<ConditionalPoolEntry>(), includedIfNoConditionsMet = Array.Empty<PoolEntry>() } }; } else { val3.monsterDccsPool.poolCategories[0].name = MonsterPoolCategories.Standard; } } if (Object.op_Implicit((Object)(object)val3.monsterDccsPool)) { DirectorAPI.ApplyMonsterChanges(val3, stageInfo); } if (Object.op_Implicit((Object)(object)val3.interactableDccsPool)) { DirectorAPI.ApplyInteractableChanges(val3, stageInfo); } } Setup.Init(def, val3); SceneManager.UnloadSceneAsync(def.cachedName); } } } [BepInPlugin("___.prodzpod.RealerStageTweaker", "RealerStageTweaker", "1.0.6")] public class Pre : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_ctor <>9__1_0; internal void <Awake>b__1_0(orig_ctor orig, SpawnCard self) { orig.Invoke(self); ToSearch.Add(self); } } public static List<SpawnCard> ToSearch = new List<SpawnCard>(); public void Awake() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__1_0; if (obj == null) { hook_ctor val = delegate(orig_ctor orig, SpawnCard self) { orig.Invoke(self); ToSearch.Add(self); }; <>c.<>9__1_0 = val; obj = (object)val; } SpawnCard.ctor += (hook_ctor)obj; } } public class SavedConfig { public struct _SavedConfig { public Dictionary<string, string> Defaults; public Dictionary<string, List<string>> Families; public Dictionary<string, string> Category; public Dictionary<string, float> Credit; public Dictionary<string, float> SceneCredit; public Dictionary<string, float> CategoryWeight; public Dictionary<string, int> SpawnDistance; public Dictionary<string, bool> PreventOverhead; public string EnemyList; public string FamilyList; public string InteractableList; } public static Dictionary<string, string> Defaults = new Dictionary<string, string>(); public static Dictionary<string, List<string>> Families = new Dictionary<string, List<string>>(); public static Dictionary<string, string> Category = new Dictionary<string, string>(); public static Dictionary<string, float> Credit = new Dictionary<string, float>(); public static Dictionary<string, float> SceneCredit = new Dictionary<string, float>(); public static Dictionary<string, float> CategoryWeight = new Dictionary<string, float>(); public static Dictionary<string, int> SpawnDistance = new Dictionary<string, int>(); public static Dictionary<string, bool> PreventOverhead = new Dictionary<string, bool>(); public static Dictionary<SceneDef, ConfigEntry<float>> ConfigMonsterCredit = new Dictionary<SceneDef, ConfigEntry<float>>(); public static Dictionary<SceneDef, ConfigEntry<float>> ConfigInteractableCredit = new Dictionary<SceneDef, ConfigEntry<float>>(); public static Dictionary<SceneDef, ConfigEntry<string>> ConfigMonsters = new Dictionary<SceneDef, ConfigEntry<string>>(); public static Dictionary<SceneDef, ConfigEntry<string>> ConfigMonstersLoop = new Dictionary<SceneDef, ConfigEntry<string>>(); public static Dictionary<SceneDef, ConfigEntry<string>> ConfigFamilies = new Dictionary<SceneDef, ConfigEntry<string>>(); public static Dictionary<SceneDef, ConfigEntry<string>> ConfigInteractables = new Dictionary<SceneDef, ConfigEntry<string>>(); public static void AddDefault(SceneDef def, string name, string val, string desc) { string key = def.cachedName + "." + name; Defaults[key] = val; ConfigEntry<string> val2 = Main.Config.Bind<string>(Setup.GetStageName(def), name, val, desc); if (Main.ResetConfig2.Value) { val2.Value = (string)((ConfigEntryBase)val2).DefaultValue; } } public static void Save(string enemyList, string familyList, string interactableList) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected O, but got Unknown //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Expected O, but got Unknown //IL_0160: Expected O, but got Unknown Main.Log.LogInfo((object)"Saving Persistent Configs"); string path = Path.Combine(Paths.ConfigPath, "RealerStageTweakerPersistent.json"); JObject val = new JObject(); ((JContainer)val).Add((object)new JProperty("Defaults", (object)JObject.Parse(JsonConvert.SerializeObject((object)Defaults)))); ((JContainer)val).Add((object)new JProperty("Families", (object)JObject.Parse(JsonConvert.SerializeObject((object)Families)))); ((JContainer)val).Add((object)new JProperty("Category", (object)JObject.Parse(JsonConvert.SerializeObject((object)Category)))); ((JContainer)val).Add((object)new JProperty("Credit", (object)JObject.Parse(JsonConvert.SerializeObject((object)Credit)))); ((JContainer)val).Add((object)new JProperty("SceneCredit", (object)JObject.Parse(JsonConvert.SerializeObject((object)SceneCredit)))); ((JContainer)val).Add((object)new JProperty("CategoryWeight", (object)JObject.Parse(JsonConvert.SerializeObject((object)CategoryWeight)))); ((JContainer)val).Add((object)new JProperty("SpawnDistance", (object)JObject.Parse(JsonConvert.SerializeObject((object)SpawnDistance)))); ((JContainer)val).Add((object)new JProperty("PreventOverhead", (object)JObject.Parse(JsonConvert.SerializeObject((object)PreventOverhead)))); ((JContainer)val).Add((object)new JProperty("EnemyList", (object)enemyList)); ((JContainer)val).Add((object)new JProperty("FamilyList", (object)familyList)); ((JContainer)val).Add((object)new JProperty("InteractableList", (object)interactableList)); File.WriteAllText(path, ((object)val).ToString()); Main.Log.LogInfo((object)"Saved Persistent Configs"); } public static void Load() { Main.Log.LogInfo((object)"Loading Persistent Configs"); _SavedConfig savedConfig = JsonConvert.DeserializeObject<_SavedConfig>(File.ReadAllText(Path.Combine(Paths.ConfigPath, "RealerStageTweakerPersistent.json"))); Defaults = savedConfig.Defaults; Families = savedConfig.Families; Category = savedConfig.Category; Credit = savedConfig.Credit; SceneCredit = savedConfig.SceneCredit; CategoryWeight = savedConfig.CategoryWeight; SpawnDistance = savedConfig.SpawnDistance; PreventOverhead = savedConfig.PreventOverhead; Main.Config.Bind<string>("!! General", "List of Enemies", savedConfig.EnemyList, "for convenience, changing this field does not do anything"); Main.Config.Bind<string>("!! General", "List of Family Events", savedConfig.FamilyList, "for convenience, changing this field does not do anything"); Main.Config.Bind<string>("!! General", "List of Interactables", savedConfig.InteractableList, "for convenience, changing this field does not do anything"); Sync("cscColossusGrassy", "cscColossusDefault"); Main.Log.LogInfo((object)"Loaded Persistent Configs"); } public static void Sync(string from, string to) { if (Category.TryGetValue(from, out var value)) { Category[to] = value; } if (Credit.TryGetValue(from, out var value2)) { Credit[to] = value2; } if (SceneCredit.TryGetValue(from, out var value3)) { SceneCredit[to] = value3; } if (CategoryWeight.TryGetValue(from, out var value4)) { CategoryWeight[to] = value4; } if (SpawnDistance.TryGetValue(from, out var value5)) { SpawnDistance[to] = value5; } if (PreventOverhead.TryGetValue(from, out var value6)) { PreventOverhead[to] = value6; } } public static void GetConfigs() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: Unknown result type (might be due to invalid IL or missing references) Enumerator<SceneDef> enumerator = SceneCatalog.allStageSceneDefs.GetEnumerator(); try { while (enumerator.MoveNext()) { SceneDef current = enumerator.Current; string stageName = Setup.GetStageName(current); if (SceneCredit.TryGetValue(current.cachedName + ".monster", out var value)) { ConfigMonsterCredit.Add(current, Main.Config.Bind<float>(stageName, "Monster Credits", value, "Amount of monster credits this stage has at the beginning.")); } if (SceneCredit.TryGetValue(current.cachedName + ".interactable", out var value2)) { ConfigInteractableCredit.Add(current, Main.Config.Bind<float>(stageName, "Interactable Credits", value2, "Amount of interactable credits this stage has at the beginning.")); } if (Defaults.TryGetValue(current.cachedName + ".Monsters", out var value3)) { ConfigMonsters.Add(current, Main.Config.Bind<string>(stageName, "Monsters", value3, "Format: NAME=WEIGHT, separated by commas.")); } if (Defaults.TryGetValue(current.cachedName + ".Monsters Post Loop", out var value4)) { ConfigMonstersLoop.Add(current, Main.Config.Bind<string>(stageName, "Monsters Post Loop", value4, "monsters that can ONLY be spawned post loop. Format: NAME=WEIGHT, separated by commas.")); } if (Defaults.TryGetValue(current.cachedName + ".Family Events", out var value5)) { ConfigFamilies.Add(current, Main.Config.Bind<string>(stageName, "Family Events", value5, "list of possible family events. Separated by commas.")); } if (Defaults.TryGetValue(current.cachedName + ".Interactables", out var value6)) { ConfigInteractables.Add(current, Main.Config.Bind<string>(stageName, "Interactables", value6, "list of shrines, chests and other interactables to spawn. Format: NAME=WEIGHT, separated by commas.")); } } } finally { ((IDisposable)enumerator).Dispose(); } foreach (SpawnCard item in Pre.ToSearch) { CharacterSpawnCard val = (CharacterSpawnCard)(object)((item is CharacterSpawnCard) ? item : null); if (val != null && !Main.Enemies.ContainsKey(((Object)val).name.Replace(",", ""))) { Main.Enemies.Add(((Object)val).name.Replace(",", ""), val); } InteractableSpawnCard val2 = (InteractableSpawnCard)(object)((item is InteractableSpawnCard) ? item : null); if (val2 != null && !Main.Interactables.ContainsKey(((Object)val2).name.Replace(",", ""))) { Main.Interactables.Add(((Object)val2).name.Replace(",", ""), val2); } } foreach (IResourceLocator resourceLocator in Addressables.ResourceLocators) { foreach (object key3 in resourceLocator.Keys) { if (!key3.ToString().Contains("/csc")) { continue; } AsyncOperationHandle<CharacterSpawnCard> val3 = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)key3.ToString()); val3.Completed += delegate(AsyncOperationHandle<CharacterSpawnCard> res) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)res.Status == 1) { CharacterSpawnCard result2 = res.Result; if (Object.op_Implicit((Object)(object)result2)) { string key2 = ((Object)result2).name.Replace(",", ""); if (!Main.Enemies.ContainsKey(key2)) { Main.Enemies.Add(key2, result2); } } } }; } } foreach (IResourceLocator resourceLocator2 in Addressables.ResourceLocators) { foreach (object key4 in resourceLocator2.Keys) { if (!key4.ToString().Contains("/isc")) { continue; } AsyncOperationHandle<InteractableSpawnCard> val4 = Addressables.LoadAssetAsync<InteractableSpawnCard>((object)key4.ToString()); val4.Completed += delegate(AsyncOperationHandle<InteractableSpawnCard> res) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 if ((int)res.Status == 1) { InteractableSpawnCard result = res.Result; if (Object.op_Implicit((Object)(object)result)) { string key = ((Object)result).name.Replace(",", ""); if (!Main.Interactables.ContainsKey(key)) { Main.Interactables.Add(key, result); } } } }; } } Main.Log.LogInfo((object)$"Loaded {Main.Enemies.Count} Enemy Spawncards (+ all basegame cards)"); Main.Log.LogInfo((object)GeneralExtensions.Join<string>(Main.Enemies.Select((KeyValuePair<string, CharacterSpawnCard> x) => x.Key), (Func<string, string>)null, ", ")); Main.Log.LogInfo((object)$"Loaded {Main.Interactables.Count} Interactable Spawncards (+ all basegame cards)"); Main.Log.LogInfo((object)GeneralExtensions.Join<string>(Main.Interactables.Select((KeyValuePair<string, InteractableSpawnCard> x) => x.Key), (Func<string, string>)null, ", ")); } public static float GetMonsterCredit(SceneDef def) { if (ConfigMonsterCredit.TryGetValue(def, out var value)) { return value.Value; } Main.Log.LogWarning((object)"this scene does not have persistent info! regenerate your config..."); return -1f; } public static float GetInteractableCredit(SceneDef def) { if (ConfigInteractableCredit.TryGetValue(def, out var value)) { return value.Value; } Main.Log.LogWarning((object)"this scene does not have persistent info! regenerate your config..."); return -1f; } public static Dictionary<string, float> GetMonster(SceneDef def) { if (!ConfigMonsters.TryGetValue(def, out var value)) { return null; } return new Dictionary<string, float>(value.Value.Split(',').Where(delegate(string x) { if (string.IsNullOrWhiteSpace(x)) { return false; } if (x.Split('=').Length != 2) { Main.Log.LogWarning((object)("Config is malformed! " + x)); return false; } return true; }).Select(delegate(string x) { string[] array = x.Split('='); return new KeyValuePair<string, float>(array[0].Trim(), float.Parse(array[1])); })); } public static Dictionary<string, float> GetMonsterLoop(SceneDef def) { if (!ConfigMonstersLoop.TryGetValue(def, out var value)) { return null; } return new Dictionary<string, float>(value.Value.Split(',').Where(delegate(string x) { if (string.IsNullOrWhiteSpace(x)) { return false; } if (x.Split('=').Length != 2) { Main.Log.LogWarning((object)("Config is malformed! " + x)); return false; } return true; }).Select(delegate(string x) { string[] array = x.Split('='); return new KeyValuePair<string, float>(array[0].Trim(), float.Parse(array[1])); })); } public static List<string> GetFamily(SceneDef def) { if (!ConfigFamilies.TryGetValue(def, out var value)) { return null; } return (from x in value.Value.Split(',') where !string.IsNullOrWhiteSpace(x) select x.Trim()).ToList(); } public static Dictionary<string, float> GetInteractable(SceneDef def) { if (!ConfigInteractables.TryGetValue(def, out var value)) { return null; } return new Dictionary<string, float>(value.Value.Split(',').Where(delegate(string x) { if (string.IsNullOrWhiteSpace(x)) { return false; } if (x.Split('=').Length != 2) { Main.Log.LogWarning((object)("Config is malformed! " + x)); return false; } return true; }).Select(delegate(string x) { string[] array = x.Split('='); return new KeyValuePair<string, float>(array[0].Trim(), float.Parse(array[1])); })); } } public class Setup { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<KeyValuePair<CharacterSpawnCard, float>, string> <>9__4_0; public static Func<KeyValuePair<CharacterSpawnCard, float>, string> <>9__4_1; public static Func<KeyValuePair<CharacterSpawnCard, float>, string> <>9__4_2; public static Func<KeyValuePair<CharacterSpawnCard, float>, string> <>9__4_3; public static Func<FamilyDirectorCardCategorySelection, string> <>9__4_4; public static Func<FamilyDirectorCardCategorySelection, string> <>9__4_5; public static Func<KeyValuePair<InteractableSpawnCard, float>, string> <>9__4_6; public static Func<KeyValuePair<InteractableSpawnCard, float>, string> <>9__4_7; public static Func<KeyValuePair<string, string>, string> <>9__5_0; public static Func<KeyValuePair<string, string>, string> <>9__5_1; public static Func<KeyValuePair<string, string>, string> <>9__5_2; public static Func<KeyValuePair<string, string>, string> <>9__5_3; public static Func<KeyValuePair<string, string>, string> <>9__5_4; public static Func<KeyValuePair<string, string>, string> <>9__5_5; public static Func<KeyValuePair<string, string>, string> <>9__5_6; public static Func<KeyValuePair<string, string>, string> <>9__5_7; public static Func<KeyValuePair<string, string>, string> <>9__5_8; public static UnityAction <>9__6_0; public static Func<string, string> <>9__7_0; public static Func<string, string> <>9__7_1; public static Comparison<ConditionalPoolEntry> <>9__16_0; public static Func<ExpansionDef, bool> <>9__18_0; public static Func<ExpansionDef, bool> <>9__18_1; public static Func<ExpansionDef, bool> <>9__19_0; internal string <Init>b__4_0(KeyValuePair<CharacterSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", "") + "=" + x.Value; } internal string <Init>b__4_1(KeyValuePair<CharacterSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", ""); } internal string <Init>b__4_2(KeyValuePair<CharacterSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", "") + "=" + x.Value; } internal string <Init>b__4_3(KeyValuePair<CharacterSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", ""); } internal string <Init>b__4_4(FamilyDirectorCardCategorySelection x) { return x.selectionChatString.Replace(",", ""); } internal string <Init>b__4_5(FamilyDirectorCardCategorySelection x) { return x.selectionChatString.Replace(",", ""); } internal string <Init>b__4_6(KeyValuePair<InteractableSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", "") + "=" + x.Value; } internal string <Init>b__4_7(KeyValuePair<InteractableSpawnCard, float> x) { return ((Object)x.Key).name.Replace(",", ""); } internal string <Finalize_>b__5_0(KeyValuePair<string, string> x) { return x.Key + "=" + x.Value; } internal string <Finalize_>b__5_1(KeyValuePair<string, string> x) { return x.Value; } internal string <Finalize_>b__5_2(KeyValuePair<string, string> x) { return x.Key; } internal string <Finalize_>b__5_3(KeyValuePair<string, string> x) { return x.Key + "=" + x.Value; } internal string <Finalize_>b__5_4(KeyValuePair<string, string> x) { return x.Value; } internal string <Finalize_>b__5_5(KeyValuePair<string, string> x) { return x.Key; } internal string <Finalize_>b__5_6(KeyValuePair<string, string> x) { return x.Key + "=" + x.Value; } internal string <Finalize_>b__5_7(KeyValuePair<string, string> x) { return x.Value; } internal string <Finalize_>b__5_8(KeyValuePair<string, string> x) { return x.Key; } internal void <DisplayEndMessage>b__6_0() { ((Component)GameObject.Find("MainMenu").GetComponent<MainMenuController>().titleMenuScreen).GetComponent<TitleMenuController>().consoleFunctions.SubmitCmd("quit"); } internal string <JoinAndOrderBy>b__7_0(string x) { return x; } internal string <JoinAndOrderBy>b__7_1(string x) { return x; } internal int <GetMainDCCS>b__16_0(ConditionalPoolEntry a, ConditionalPoolEntry b) { return DLCList(b).CompareTo(DLCList(a)); } internal bool <DLCList>b__18_0(ExpansionDef x) { return ((Object)x).name == "DLC1"; } internal bool <DLCList>b__18_1(ExpansionDef x) { return ((Object)x).name == "DLC2"; } internal bool <HasDLC>b__19_0(ExpansionDef x) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Invalid comparison between Unknown and I4 if (((Object)x).name == "DLC1") { return (int)SceneCatalog.FindSceneIndex("snowyforest") != -1; } if (((Object)x).name == "DLC2") { return (int)SceneCatalog.FindSceneIndex("habitat") != -1; } Main.Log.LogWarning((object)("unchecked DLC found: " + ((Object)x).name + "! let prod know of this.")); return false; } } public static Dictionary<string, string> totalMonsters = new Dictionary<string, string>(); public static Dictionary<string, string> totalFamilies = new Dictionary<string, string>(); public static Dictionary<string, string> totalInteractables = new Dictionary<string, string>(); public static int processedScenes = 0; public static int ID = 0; public static Dictionary<object, int> IDToKey = new Dictionary<object, int>(); public static void Init(SceneDef def, ClassicStageInfo csi) { //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_0380: Unknown result type (might be due to invalid IL or missing references) //IL_0383: Unknown result type (might be due to invalid IL or missing references) //IL_043d: Unknown result type (might be due to invalid IL or missing references) //IL_0442: Unknown result type (might be due to invalid IL or missing references) //IL_0446: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Expected I4, but got Unknown //IL_04b4: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0509: Unknown result type (might be due to invalid IL or missing references) //IL_0513: Expected I4, but got Unknown //IL_0542: Unknown result type (might be due to invalid IL or missing references) //IL_055c: Unknown result type (might be due to invalid IL or missing references) //IL_0563: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)csi == (Object)null) { Finalize_(); return; } SavedConfig.SceneCredit[def.cachedName + ".monster"] = csi.sceneDirectorMonsterCredits; ConfigEntry<float> val = Main.Config.Bind<float>(GetStageName(def), "Monster Credits", (float)csi.sceneDirectorMonsterCredits, "Amount of monster credits this stage has at the beginning."); if (Main.ResetConfig2.Value) { val.Value = (float)((ConfigEntryBase)val).DefaultValue; } SavedConfig.SceneCredit[def.cachedName + ".interactable"] = csi.sceneDirectorMonsterCredits; ConfigEntry<float> val2 = Main.Config.Bind<float>(GetStageName(def), "Interactable Credits", (float)csi.sceneDirectorInteractibleCredits, "Amount of interactable credits this stage has at the beginning."); if (Main.ResetConfig2.Value) { val2.Value = (float)((ConfigEntryBase)val2).DefaultValue; } if (def.cachedName == "voidraid") { Finalize_(); return; } Dictionary<CharacterSpawnCard, float> dictionary = new Dictionary<CharacterSpawnCard, float>(); Dictionary<CharacterSpawnCard, float> dictionary2 = new Dictionary<CharacterSpawnCard, float>(); List<FamilyDirectorCardCategorySelection> list = new List<FamilyDirectorCardCategorySelection>(); Dictionary<InteractableSpawnCard, float> dictionary3 = new Dictionary<InteractableSpawnCard, float>(); DirectorCardCategorySelection mainDCCS = GetMainDCCS(csi.monsterDccsPool); if ((Object)(object)mainDCCS != (Object)null) { Category[] categories = mainDCCS.categories; foreach (Category val3 in categories) { DirectorCard[] cards = val3.cards; foreach (DirectorCard val4 in cards) { SpawnCard spawnCard = val4.spawnCard; CharacterSpawnCard val5 = (CharacterSpawnCard)(object)((spawnCard is CharacterSpawnCard) ? spawnCard : null); if (!((Object)(object)val5 == (Object)null)) { string key = ((Object)val5).name.Replace(",", ""); if (!SavedConfig.Category.ContainsKey(key)) { SavedConfig.Category.Add(key, val3.name); } if (!SavedConfig.Credit.ContainsKey(key)) { SavedConfig.Credit.Add(key, val4.cost); } if (!SavedConfig.SpawnDistance.ContainsKey(key)) { SavedConfig.SpawnDistance.Add(key, (int)val4.spawnDistance); } if (!SavedConfig.PreventOverhead.ContainsKey(key)) { SavedConfig.PreventOverhead.Add(key, val4.preventOverhead); } if (!SavedConfig.CategoryWeight.ContainsKey(val3.name)) { SavedConfig.CategoryWeight.Add(val3.name, val3.selectionWeight); } Dictionary<CharacterSpawnCard, float> dictionary4 = ((val4.minimumStageCompletions < def.stageOrder) ? dictionary : dictionary2); if (dictionary4.ContainsKey(val5)) { dictionary4[val5] += val4.selectionWeight; } else { dictionary4.Add(val5, val4.selectionWeight); } } } } } FamilyDirectorCardCategorySelection[] familyDCCS = GetFamilyDCCS(csi.monsterDccsPool); FamilyDirectorCardCategorySelection[] array = familyDCCS; foreach (FamilyDirectorCardCategorySelection val6 in array) { string text = val6.selectionChatString.Replace(",", ""); if (!SavedConfig.Families.ContainsKey(val6.selectionChatString)) { List<string> list2 = new List<string>(); Category[] categories2 = ((DirectorCardCategorySelection)val6).categories; foreach (Category val7 in categories2) { DirectorCard[] cards2 = val7.cards; foreach (DirectorCard val8 in cards2) { list2.Add(((Object)val8.spawnCard).name.Replace(",", "")); } } SavedConfig.Families.Add(val6.selectionChatString, list2); } list.Add(val6); } DirectorCardCategorySelection mainDCCS2 = GetMainDCCS(csi.interactableDccsPool); if ((Object)(object)mainDCCS2 != (Object)null) { Category[] categories3 = mainDCCS2.categories; foreach (Category val9 in categories3) { DirectorCard[] cards3 = val9.cards; foreach (DirectorCard val10 in cards3) { SpawnCard spawnCard2 = val10.spawnCard; InteractableSpawnCard val11 = (InteractableSpawnCard)(object)((spawnCard2 is InteractableSpawnCard) ? spawnCard2 : null); if (!((Object)(object)val11 == (Object)null)) { string key2 = ((Object)val11).name.Replace(",", ""); if (!SavedConfig.Category.ContainsKey(key2)) { SavedConfig.Category.Add(key2, val9.name); } if (!SavedConfig.Credit.ContainsKey(key2)) { SavedConfig.Credit.Add(key2, val10.cost); } if (!SavedConfig.SpawnDistance.ContainsKey(key2)) { SavedConfig.SpawnDistance.Add(key2, (int)val10.spawnDistance); } if (!SavedConfig.PreventOverhead.ContainsKey(key2)) { SavedConfig.PreventOverhead.Add(key2, val10.preventOverhead); } if (!SavedConfig.CategoryWeight.ContainsKey(val9.name)) { SavedConfig.CategoryWeight.Add(val9.name, val9.selectionWeight); } if (dictionary3.ContainsKey(val11)) { dictionary3[val11] += val10.selectionWeight; } else { dictionary3.Add(val11, val10.selectionWeight); } } } } } if (dictionary.Count == 0 && dictionary2.Count == 0 && list.Count == 0 && dictionary3.Count == 0) { Finalize_(); return; } Main.Log.LogInfo((object)("Adding Configs for " + GetStageName(def))); SavedConfig.AddDefault(def, "Monsters", JoinAndOrderBy(dictionary, (KeyValuePair<CharacterSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "") + "=" + x.Value, (KeyValuePair<CharacterSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "")), "Format: NAME=WEIGHT, separated by commas."); foreach (KeyValuePair<CharacterSpawnCard, float> item in dictionary) { if (!totalMonsters.ContainsKey(((Object)item.Key).name)) { totalMonsters.Add(((Object)item.Key).name.Replace(",", ""), GetEnemyName(item.Key)); } } SavedConfig.AddDefault(def, "Monsters Post Loop", JoinAndOrderBy(dictionary2, (KeyValuePair<CharacterSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "") + "=" + x.Value, (KeyValuePair<CharacterSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "")), "monsters that can ONLY be spawned post loop. Format: NAME=WEIGHT, separated by commas."); foreach (KeyValuePair<CharacterSpawnCard, float> item2 in dictionary2) { if (!totalMonsters.ContainsKey(((Object)item2.Key).name)) { totalMonsters.Add(((Object)item2.Key).name.Replace(",", ""), GetEnemyName(item2.Key)); } } SavedConfig.AddDefault(def, "Family Events", JoinAndOrderBy(list, (FamilyDirectorCardCategorySelection x) => x.selectionChatString.Replace(",", ""), (FamilyDirectorCardCategorySelection x) => x.selectionChatString.Replace(",", "")), "list of possible family events. Separated by commas."); foreach (FamilyDirectorCardCategorySelection item3 in list) { if (!totalFamilies.ContainsKey(item3.selectionChatString)) { totalFamilies.Add(item3.selectionChatString.Replace(",", ""), GetFamilyName(item3)); } } SavedConfig.AddDefault(def, "Interactables", JoinAndOrderBy(dictionary3, (KeyValuePair<InteractableSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "") + "=" + x.Value, (KeyValuePair<InteractableSpawnCard, float> x) => ((Object)x.Key).name.Replace(",", "")), "list of shrines, chests and other interactables to spawn. Format: NAME=WEIGHT, separated by commas."); foreach (KeyValuePair<InteractableSpawnCard, float> item4 in dictionary3) { if (!totalInteractables.ContainsKey(((Object)item4.Key).name)) { totalInteractables.Add(((Object)item4.Key).name.Replace(",", ""), GetInteractableName(item4.Key)); } } Finalize_(); } public static void Finalize_() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) processedScenes++; if (processedScenes >= SceneCatalog.allStageSceneDefs.Length) { Main.Log.LogInfo((object)"Finalizing Load"); string text = JoinAndOrderBy(totalMonsters, (KeyValuePair<string, string> x) => x.Key + "=" + x.Value, (KeyValuePair<string, string> x) => x.Value); Main.Config.Bind<string>("!! General", "List of Enemies", text, "for convenience, changing this field does not do anything").Value = string.Join(", ", totalMonsters.Select((KeyValuePair<string, string> x) => x.Key)); string text2 = JoinAndOrderBy(totalFamilies, (KeyValuePair<string, string> x) => x.Key + "=" + x.Value, (KeyValuePair<string, string> x) => x.Value); Main.Config.Bind<string>("!! General", "List of Family Events", text2, "for convenience, changing this field does not do anything").Value = string.Join(", ", totalFamilies.Select((KeyValuePair<string, string> x) => x.Key)); string text3 = JoinAndOrderBy(totalInteractables, (KeyValuePair<string, string> x) => x.Key + "=" + x.Value, (KeyValuePair<string, string> x) => x.Value); Main.Config.Bind<string>("!! General", "List of Interactables", text3, "for convenience, changing this field does not do anything").Value = string.Join(", ", totalInteractables.Select((KeyValuePair<string, string> x) => x.Key)); SavedConfig.Save(text, text2, text3); Main.ResetConfig.Value = false; Main.ResetConfig2.Value = false; Object.DestroyImmediate((Object)(object)Main.box.rootObject); DisplayEndMessage(); } } public static async void DisplayEndMessage() { await Task.Delay(250); Main.box = SimpleDialogBox.Create((MPEventSystem)null); Main.box.headerToken = new TokenParamsPair("Scan Complete", Array.Empty<object>()); Main.box.descriptionToken = new TokenParamsPair("Config files have been generated!\nA restart is required for the change to take effect.", Array.Empty<object>()); SimpleDialogBox box = Main.box; object obj = <>c.<>9__6_0; if (obj == null) { UnityAction val = delegate { ((Component)GameObject.Find("MainMenu").GetComponent<MainMenuController>().titleMenuScreen).GetComponent<TitleMenuController>().consoleFunctions.SubmitCmd("quit"); }; <>c.<>9__6_0 = val; obj = (object)val; } box.AddActionButton((UnityAction)obj, "Close Game", true, Array.Empty<object>()); } public static string JoinAndOrderBy(IEnumerable<string> arr, string joiner = ", ") { return JoinAndOrderBy(arr, (string x) => x, (string x) => x, joiner); } public static string JoinAndOrderBy<T>(IEnumerable<T> arr, Func<T, string> fn, Func<T, string> cmp, string joiner = ", ") { List<T> list = arr.ToList(); list.Sort((T a, T b) => cmp(a).CompareTo(cmp(b))); return string.Join(joiner, list.Select(fn)); } public static string GetStageName(SceneDef def) { return Language.GetString(def.nameToken).Replace("\n", "").Replace("\t", "") .Replace("\\", "") .Replace("\"", "") .Replace("'", "") .Replace("[", "") .Replace("]", "") + " (" + def.cachedName + ")"; } public static string GetEnemyName(CharacterSpawnCard csc) { if (IDToKey.ContainsKey(csc)) { return "OBJECT_" + IDToKey[csc]; } if (Object.op_Implicit((Object)(object)csc) && Object.op_Implicit((Object)(object)((SpawnCard)csc).prefab) && Object.op_Implicit((Object)(object)((SpawnCard)csc).prefab.GetComponent<CharacterMaster>()) && Object.op_Implicit((Object)(object)((SpawnCard)csc).prefab.GetComponent<CharacterMaster>().bodyPrefab) && Object.op_Implicit((Object)(object)((SpawnCard)csc).prefab.GetComponent<CharacterMaster>().bodyPrefab.GetComponent<CharacterBody>())) { return Language.GetString(((SpawnCard)csc).prefab.GetComponent<CharacterMaster>().bodyPrefab.GetComponent<CharacterBody>().baseNameToken).Trim(); } string text = ((Object)((SpawnCard)csc).prefab).name.Trim(); if (string.IsNullOrEmpty(text)) { IDToKey.Add(csc, ID); ID++; return "OBJECT_" + IDToKey[csc]; } return text; } public static string GetFamilyName(FamilyDirectorCardCategorySelection dccs) { if (IDToKey.ContainsKey(dccs)) { return "OBJECT_" + IDToKey[dccs]; } string text = dccs.selectionChatString.ToLower(); if (text.StartsWith("family_")) { string text2 = text; int length = "family_".Length; text = text2.Substring(length, text2.Length - length); } string text3 = ToTitleCase(text); if (string.IsNullOrEmpty(text3)) { IDToKey.Add(dccs, ID); ID++; return "OBJECT_" + IDToKey[dccs]; } return text3; } public static string ToTitleCase(string str) { str = str.ToLower(); if (str.Length > 0) { string text = str.Substring(0, 1).ToUpper(); object obj; if (str.Length <= 1) { obj = ""; } else { string text2 = str; obj = text2.Substring(1, text2.Length - 1); } str = text + (string?)obj; } for (int i = 1; i < str.Length; i++) { if (str[i - 1] == ' ') { string text3 = str.Substring(0, i); string text4 = str; int num = i; string text5 = text4.Substring(num, i + 1 - num).ToUpper(); object obj2; if (str.Length <= i + 1) { obj2 = ""; } else { string text2 = str; num = i + 1; obj2 = text2.Substring(num, text2.Length - num); } str = text3 + text5 + (string?)obj2; } } return str.Trim(); } public static string GetInteractableName(InteractableSpawnCard isc) { if (IDToKey.ContainsKey(isc)) { return "OBJECT_" + IDToKey[isc]; } if (Object.op_Implicit((Object)(object)isc) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab.GetComponent<PurchaseInteraction>())) { return Language.GetString(((SpawnCard)isc).prefab.GetComponent<PurchaseInteraction>().displayNameToken).Trim(); } if (Object.op_Implicit((Object)(object)isc) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab.GetComponent<BarrelInteraction>())) { return Language.GetString(((SpawnCard)isc).prefab.GetComponent<BarrelInteraction>().displayNameToken).Trim(); } if (Object.op_Implicit((Object)(object)isc) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab.GetComponent<MultiShopController>()) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab.GetComponent<MultiShopController>().terminalPrefab) && Object.op_Implicit((Object)(object)((SpawnCard)isc).prefab.GetComponent<MultiShopController>().terminalPrefab.GetComponent<PurchaseInteraction>())) { return Language.GetString(((SpawnCard)isc).prefab.GetComponent<MultiShopController>().terminalPrefab.GetComponent<PurchaseInteraction>().displayNameToken).Trim(); } string text = ((Object)((SpawnCard)isc).prefab).name.Trim(); if (string.IsNullOrEmpty(text)) { IDToKey.Add(isc, ID); ID++; return "OBJECT_" + IDToKey[isc]; } return text; } public static DirectorCardCategorySelection GetMainDCCS(DccsPool dp) { if ((Object)(object)dp == (Object)null || dp.poolCategories == null) { return null; } Category[] poolCategories = dp.poolCategories; foreach (Category val in poolCategories) { bool flag = false; List<ConditionalPoolEntry> list = val.includedIfConditionsMet.ToList(); list.Sort((ConditionalPoolEntry a, ConditionalPoolEntry b) => DLCList(b).CompareTo(DLCList(a))); foreach (ConditionalPoolEntry item in list) { if (HasDLC(item)) { flag = true; if (!(((PoolEntry)item).dccs is FamilyDirectorCardCategorySelection)) { return ((PoolEntry)item).dccs; } } } if (!flag) { PoolEntry[] includedIfNoConditionsMet = val.includedIfNoConditionsMet; foreach (PoolEntry val2 in includedIfNoConditionsMet) { if (!(val2.dccs is FamilyDirectorCardCategorySelection)) { return val2.dccs; } } } PoolEntry[] alwaysIncluded = val.alwaysIncluded; foreach (PoolEntry val3 in alwaysIncluded) { if (!(val3.dccs is FamilyDirectorCardCategorySelection)) { return val3.dccs; } } } return null; } public static FamilyDirectorCardCategorySelection[] GetFamilyDCCS(DccsPool dp) { if ((Object)(object)dp == (Object)null || dp.poolCategories == null) { return Array.Empty<FamilyDirectorCardCategorySelection>(); } List<FamilyDirectorCardCategorySelection> list = new List<FamilyDirectorCardCategorySelection>(); Category[] poolCategories = dp.poolCategories; foreach (Category val in poolCategories) { PoolEntry[] alwaysIncluded = val.alwaysIncluded; foreach (PoolEntry val2 in alwaysIncluded) { if (val2.dccs is FamilyDirectorCardCategorySelection) { DirectorCardCategorySelection dccs = val2.dccs; list.Add((FamilyDirectorCardCategorySelection)(object)((dccs is FamilyDirectorCardCategorySelection) ? dccs : null)); } } bool flag = false; ConditionalPoolEntry[] includedIfConditionsMet = val.includedIfConditionsMet; foreach (ConditionalPoolEntry val3 in includedIfConditionsMet) { if (HasDLC(val3)) { flag = true; if (((PoolEntry)val3).dccs is FamilyDirectorCardCategorySelection) { DirectorCardCategorySelection dccs2 = ((PoolEntry)val3).dccs; list.Add((FamilyDirectorCardCategorySelection)(object)((dccs2 is FamilyDirectorCardCategorySelection) ? dccs2 : null)); } } } if (flag) { continue; } PoolEntry[] includedIfNoConditionsMet = val.includedIfNoConditionsMet; foreach (PoolEntry val4 in includedIfNoConditionsMet) { if (val4.dccs is FamilyDirectorCardCategorySelection) { DirectorCardCategorySelection dccs3 = val4.dccs; list.Add((FamilyDirectorCardCategorySelection)(object)((dccs3 is FamilyDirectorCardCategorySelection) ? dccs3 : null)); } } } return list.ToArray(); } public static int DLCList(ConditionalPoolEntry entry) { int num = 0; if (entry.requiredExpansions.Any((ExpansionDef x) => ((Object)x).name == "DLC1")) { num++; } if (entry.requiredExpansions.Any((ExpansionDef x) => ((Object)x).name == "DLC2")) { num += 2; } return num; } public static bool HasDLC(ConditionalPoolEntry entry) { return entry.requiredExpansions.All(delegate(ExpansionDef x) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Invalid comparison between Unknown and I4 if (((Object)x).name == "DLC1") { return (int)SceneCatalog.FindSceneIndex("snowyforest") != -1; } if (((Object)x).name == "DLC2") { return (int)SceneCatalog.FindSceneIndex("habitat") != -1; } Main.Log.LogWarning((object)("unchecked DLC found: " + ((Object)x).name + "! let prod know of this.")); return false; }); } } }