using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using R2API; using RoR2; using RoR2.ExpansionManagement; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ArtifactOfRevolution")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+cd4fc3818f5b50aff2532e3ad323c33074fbf5d0")] [assembly: AssemblyProduct("ArtifactOfRevolution")] [assembly: AssemblyTitle("ArtifactOfRevolution")] [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 ArtifactOfRevolution { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("SomeBunny.ArtifactOfRevolution", "ArtifactOfRevolution", "1.0.2")] public class ArtifactOfRevolutionPlugin : BaseUnityPlugin { public const string PluginGUID = "SomeBunny.ArtifactOfRevolution"; public const string PluginAuthor = "SomeBunny"; public const string PluginName = "ArtifactOfRevolution"; public const string PluginVersion = "1.0.2"; public static ConfigFile configurationFile; public void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) new Harmony("SomeBunny.ArtifactOfRevolution").PatchAll(); configurationFile = ((BaseUnityPlugin)this).Config; Log.Init(((BaseUnityPlugin)this).Logger); ArtifactOfRevolution artifactOfRevolution = new ArtifactOfRevolution(); artifactOfRevolution.Init(); } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } private static string Format(object data, string file, int line) { string fileName = Path.GetFileName(file); return $"[{fileName}:{line}] {data}"; } internal static void Debug(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogDebug((object)Format(data, file, line)); } internal static void Error(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogError((object)Format(data, file, line)); } internal static void Fatal(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogFatal((object)Format(data, file, line)); } internal static void Info(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogInfo((object)Format(data, file, line)); } internal static void Message(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogMessage((object)Format(data, file, line)); } internal static void Warning(object data, [CallerFilePath] string file = "", [CallerLineNumber] int line = 0) { _logSource.LogWarning((object)Format(data, file, line)); } } public class ArtifactOfRevolution { [HarmonyPatch(typeof(Run), "Start")] public class Run_Start { [HarmonyPostfix] public static void Postfix(Run __instance) { if (NetworkServer.active && Inst.ArtifactEnabled) { treasureRng.ResetSeed(__instance.seed); RevolutionItemInventory = Object.Instantiate(RevolutionItemController).GetComponent(); ((Component)RevolutionItemInventory).GetComponent().teamIndex = (TeamIndex)2; NetworkServer.Spawn(((Component)RevolutionItemInventory).gameObject); RerollNewInventory(); } } } [HarmonyPatch(typeof(SpawnCard), "DoSpawn")] public class SpawnCard_DoSpawn { [HarmonyPostfix] public static void Postfix(SpawnCard __instance, ref SpawnResult __result) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Invalid comparison between Unknown and I4 //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Invalid comparison between Unknown and I4 if (!Inst.ArtifactEnabled || !Object.op_Implicit((Object)(object)RevolutionItemInventory)) { return; } CharacterMaster val = (Object.op_Implicit((Object)(object)__result.spawnedInstance) ? __result.spawnedInstance.GetComponent() : null); if (Object.op_Implicit((Object)(object)val)) { if ((int)val.teamIndex == 2) { val.inventory.AddItemsFrom(RevolutionItemInventory); } if (VoidEnemiesGetItems.Value && (int)val.teamIndex == 4) { val.inventory.AddItemsFrom(RevolutionItemInventory); } } } } [HarmonyPatch(typeof(SceneDirector), "PopulateScene")] public class SceneDirector_PopulateScene { [HarmonyPrefix] public static void Postfix(SceneDirector __instance) { if (NetworkServer.active) { HasRolledNewInventory = false; RerollNewInventory(); } } } private static ArtifactDef InvasionArtifactDefinition; public InteractableSpawnCard VoidCampSpawnCard; public DirectorCard VoidDirectorCard = null; private static ArtifactOfRevolution Inst; public static ConfigEntry ItemsPerStage; public static ConfigEntry StartingItemCount; public static ConfigEntry ItemStackAmountPerStage; public static ConfigEntry VoidEnemiesGetItems; public static BasicPickupDropTable VoidItems; public static ConfigEntry WhiteItemWeight; public static ConfigEntry WhiteItemCountGiven; public static ConfigEntry GreenItemWeight; public static ConfigEntry GreenItemCountGiven; public static ConfigEntry RedItemWeight; public static ConfigEntry RedItemCountGiven; public static ConfigEntry LunarItemWeight; public static ConfigEntry LunarItemCountGiven; public static ConfigEntry BossItemWeight; public static ConfigEntry BossItemCountGiven; public static ConfigEntry FoodItemWeight_1; public static ConfigEntry FoodItemWeight_2; public static ConfigEntry FoodItemWeight_3; public static ConfigEntry CorruptItemIntoVoid; public static ConfigEntry ChaosMode; public static ConfigEntry ChaosStackingMode; public static ConfigEntry UnpredictableMode; public static ExpansionDef SOTVExpansion; public static ItemDef Zoea; private static GameObject RevolutionItemController; private static Inventory RevolutionItemInventory; private static readonly Xoroshiro128Plus treasureRng = new Xoroshiro128Plus(0uL); public static Dictionary ItemsPerTier; public static WeightedTypeCollection ItemDropTables; private static bool HasRolledNewInventory = false; private static string ArtifactLangTokenName => "ARTIFACT_OF_REVOLUTION"; private static string ArtifactName => "Artifact of Revolution"; private static string ArtifactDescription => "Enemies gain items. Enemy item loadout is changed every stage, and grows in power over time."; public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(InvasionArtifactDefinition); public void Init() { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_04cc: Unknown result type (might be due to invalid IL or missing references) //IL_04d1: Unknown result type (might be due to invalid IL or missing references) //IL_04e4: Unknown result type (might be due to invalid IL or missing references) //IL_04e9: Unknown result type (might be due to invalid IL or missing references) Inst = this; LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); InvasionArtifactDefinition = ScriptableObject.CreateInstance(); Texture2D textureFromResource = Tools.GetTextureFromResource("ArtifactOfRevolution/Textures/texArtifactRevolutionEnabled.png"); Sprite smallIconSelectedSprite = Sprite.Create(textureFromResource, new Rect(0f, 0f, (float)((Texture)textureFromResource).width, (float)((Texture)textureFromResource).height), new Vector2(0.5f, 0.5f)); Texture2D textureFromResource2 = Tools.GetTextureFromResource("ArtifactOfRevolution/Textures/texArtifactRevolutionDisabled.png"); Sprite smallIconDeselectedSprite = Sprite.Create(textureFromResource2, new Rect(0f, 0f, (float)((Texture)textureFromResource2).width, (float)((Texture)textureFromResource2).height), new Vector2(0.5f, 0.5f)); InvasionArtifactDefinition.smallIconSelectedSprite = smallIconSelectedSprite; InvasionArtifactDefinition.smallIconDeselectedSprite = smallIconDeselectedSprite; InvasionArtifactDefinition.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; InvasionArtifactDefinition.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; ContentAddition.AddArtifactDef(InvasionArtifactDefinition); LegacyResourcesAPI.LoadAsyncCallback("Prefabs/NetworkedObjects/MonsterTeamGainsItemsArtifactInventory", (Action)delegate(GameObject operationResult) { RevolutionItemController = PrefabAPI.InstantiateClone(operationResult, "RevolutionInventory", false); ((Behaviour)RevolutionItemController.GetComponent()).enabled = true; PrefabAPI.RegisterNetworkPrefab(RevolutionItemController); }); StartingItemCount = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Base", "Baseline item Stack Count", 1, "The baseline amount of item stacks the enemies will recieve."); ItemsPerStage = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Base", "Item Amount Increase Per Stage", 0.5f, "The amount by which the amount of items enemies will recieve increases per stage. (0.5 Grants +1 Items every 2 stages)."); ItemStackAmountPerStage = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Base", "Item Stack Increase Per Stage", 0.2f, "The amount by which the amount of item stacks enemies will recieve increases per stage. (0.2 Grants +1 to every Item Stack every 5 stages)."); VoidEnemiesGetItems = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Base", "Void Enemies Get Items", true, "Do Void Enemies Get Items?"); WhiteItemWeight = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Common", "Weight", 85, "[Common] The weight with which this item tier will be selected."); WhiteItemCountGiven = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Common", "Item Stack Amount", 3, " [Common] The amount of items given per stack for this item tier."); GreenItemWeight = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Uncommon", "Weight", 24, "[Uncommon] The weight with which this item tier will be selected."); GreenItemCountGiven = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Uncommon", "Item Stack Amount", 2, " [Uncommon] The amount of items given per stack for this item tier."); RedItemWeight = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Legendary", "Weight", 8, "[Legendary] The weight with which this item tier will be selected."); RedItemCountGiven = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Items | Legendary", "Item Stack Amount", 1, " [Legendary] The amount of items given per stack for this item tier."); LunarItemWeight = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Lunar", "Weight", 2, "[Lunar] The weight with which this item tier will be selected."); LunarItemCountGiven = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Lunar", "Item Stack Amount", 1, " [Lunar] The amount of items given per stack for this item tier."); BossItemWeight = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Boss", "Weight", 5, "[Boss] The weight with which this item tier will be selected."); BossItemCountGiven = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Boss", "Item Stack Amount", 1, " [Boss] The amount of items given per stack for this item tier."); FoodItemWeight_1 = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Food Items Common", "Weight", 15, "[Requires AC DLC] [Food Items [Common]] The weight with which this item tier will be selected."); FoodItemWeight_2 = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Food Items Uncommon", "Weight", 5, "[Requires AC DLC] [Food Items [Uncommon]] The weight with which this item tier will be selected."); FoodItemWeight_3 = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Food Items Legendary", "Weight", 2, "[Requires AC DLC] [Food Items [Legendary]] The weight with which this item tier will be selected."); CorruptItemIntoVoid = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Special Items | Void", "Chance for Stack To Become Void items", 0.05f, "[Requires SOTV DLC] The chance that a given item stack will turn into a Void Item of an equivalent tier."); ChaosMode = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Fun Stuff", "Scrambled Mode", false, "Absolutely screws with the item tier selection RNG. Not meant to be balanced in any way."); ChaosStackingMode = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Fun Stuff", "Chaos Mode", false, "Absolutely screws with the item stack counts given to enemies. Not meant to be balanced in any way."); UnpredictableMode = ArtifactOfRevolutionPlugin.configurationFile.Bind(ArtifactName + " | Fun Stuff", "Unpredictable Mode", false, "Absolutely screws with the amount of stacks given to enemies. Not meant to be balanced in any way."); ExpansionDef AC = Addressables.LoadAssetAsync((object)"RoR2/DLC3/DLC3.asset").WaitForCompletion(); SOTVExpansion = Addressables.LoadAssetAsync((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) PickupDropTable newVal = LegacyResourcesAPI.Load("DropTables/dtMonsterTeamTier1Item"); PickupDropTable newVal2 = LegacyResourcesAPI.Load("DropTables/dtMonsterTeamTier2Item"); PickupDropTable newVal3 = LegacyResourcesAPI.Load("DropTables/dtMonsterTeamTier3Item"); PickupDropTable newVal4 = Addressables.LoadAssetAsync((object)"RoR2/Base/DuplicatorWild/dtDuplicatorWild.asset").WaitForCompletion(); PickupDropTable newVal5 = Addressables.LoadAssetAsync((object)"RoR2/Base/LunarChest/dtLunarChest.asset").WaitForCompletion(); PickupDropTable newVal6 = (PickupDropTable)(object)Addressables.LoadAssetAsync((object)"RoR2/DLC3/MealPrep/dtFoodTier1.asset").WaitForCompletion(); PickupDropTable newVal7 = (PickupDropTable)(object)Addressables.LoadAssetAsync((object)"RoR2/DLC3/MealPrep/dtFoodTier2.asset").WaitForCompletion(); PickupDropTable newVal8 = (PickupDropTable)(object)Addressables.LoadAssetAsync((object)"RoR2/DLC3/MealPrep/dtFoodTier3.asset").WaitForCompletion(); VoidItems = Addressables.LoadAssetAsync((object)"RoR2/DLC1/TreasureCacheVoid/dtVoidLockbox.asset").WaitForCompletion(); Zoea = Addressables.LoadAssetAsync((object)"RoR2/DLC1/VoidMegaCrabItem.asset").WaitForCompletion(); ItemDropTables = new WeightedTypeCollection { elements = new WeightedType[8] { new WeightedType(newVal, WhiteItemWeight.Value), new WeightedType(newVal2, GreenItemWeight.Value), new WeightedType(newVal3, RedItemWeight.Value), new WeightedType(newVal5, LunarItemWeight.Value), new WeightedType(newVal4, BossItemWeight.Value), new WeightedType(newVal6, FoodItemWeight_1.Value, AC), new WeightedType(newVal7, FoodItemWeight_2.Value, AC), new WeightedType(newVal8, FoodItemWeight_3.Value, AC) } }; ItemsPerTier = new Dictionary { { (ItemTier)4, BossItemCountGiven.Value }, { (ItemTier)3, LunarItemCountGiven.Value }, { (ItemTier)5, 0 }, { (ItemTier)0, WhiteItemCountGiven.Value }, { (ItemTier)1, GreenItemCountGiven.Value }, { (ItemTier)2, RedItemCountGiven.Value }, { (ItemTier)9, 1 }, { (ItemTier)6, 2 }, { (ItemTier)7, 1 }, { (ItemTier)8, 1 }, { (ItemTier)10, 1 } }; }); Run.onRunDestroyGlobal += Run_onRunDestroyGlobal; } private void Run_onRunDestroyGlobal(Run obj) { if (NetworkServer.active) { treasureRng.ResetSeed(0uL); if (Object.op_Implicit((Object)(object)RevolutionItemInventory)) { RevolutionItemInventory.CleanInventory(); NetworkServer.Destroy(((Component)RevolutionItemInventory).gameObject); } RevolutionItemInventory = null; } } private static void RerollNewInventory() { //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: 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_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0139: 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_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Invalid comparison between Unknown and I4 //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Invalid comparison between Unknown and I4 //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Invalid comparison between Unknown and I4 //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Invalid comparison between Unknown and I4 //IL_021c: 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_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Invalid comparison between Unknown and I4 //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Invalid comparison between Unknown and I4 //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Invalid comparison between Unknown and I4 //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) if (!Inst.ArtifactEnabled || !Object.op_Implicit((Object)(object)RevolutionItemInventory) || HasRolledNewInventory) { return; } HasRolledNewInventory = true; RevolutionItemInventory.CleanInventory(); int num = Mathf.FloorToInt((float)(((Object)(object)Run.instance != (Object)null) ? Run.instance.stageClearCount : 0) * ItemsPerStage.Value); num += StartingItemCount.Value; if (UnpredictableMode.Value) { num = (((double)Random.value < 0.4) ? Random.Range(1, num + 2) : ((!((double)Random.value < 0.3)) ? Random.Range(8 + num, 17 + num) : Random.Range(num, 4))); } for (int i = 0; i < num; i++) { PickupDropTable val = ItemDropTables.SelectByWeight(); UniquePickup val2 = val.GeneratePickup(treasureRng); if (!((UniquePickup)(ref val2)).isValid) { continue; } PickupDef pickupDef = PickupCatalog.GetPickupDef(val2.pickupIndex); if (pickupDef == null) { continue; } ItemTier itemTier = pickupDef.itemTier; if (((int)itemTier == 0 || (int)itemTier == 1 || (int)itemTier == 2 || (int)itemTier == 4) && Run.instance.IsExpansionEnabled(SOTVExpansion) && Random.value < CorruptItemIntoVoid.Value) { if ((int)itemTier == 4) { pickupDef = PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(Zoea.itemIndex)); } else { VoidItems.voidTier1Weight = (((int)itemTier == 0) ? 1 : 0); VoidItems.voidTier2Weight = (((int)itemTier == 1) ? 1 : 0); VoidItems.voidTier3Weight = (((int)itemTier == 2) ? 1 : 0); pickupDef = PickupCatalog.GetPickupDef(((PickupDropTable)VoidItems).GeneratePickup(treasureRng).pickupIndex); } } int value = 1; ItemsPerTier.TryGetValue(pickupDef.itemTier, out value); int num2 = (int)Mathf.Floor((float)Run.instance.stageClearCount * ItemStackAmountPerStage.Value); value += num2; if (ChaosStackingMode.Value) { value = (((double)Random.value < 0.4) ? Random.Range(1, value + 5) : ((!((double)Random.value < 0.3)) ? Random.Range(8, 17) : Random.Range(3, 9))); } RevolutionItemInventory.GiveItemPermanent(pickupDef.itemIndex, value); } } } public static class Tools { public static byte[] ExtractEmbeddedResource(string filePath) { filePath = filePath.Replace("/", "."); filePath = filePath.Replace("\\", "."); Assembly callingAssembly = Assembly.GetCallingAssembly(); using Stream stream = callingAssembly.GetManifestResourceStream(filePath); if (stream == null) { return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); return array; } public static Texture2D GetTextureFromResource(string resourceName) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown byte[] array = ExtractEmbeddedResource(resourceName); if (array == null) { return null; } Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false); ImageConversion.LoadImage(val, array); ((Texture)val).filterMode = (FilterMode)0; string text = resourceName.Substring(0, resourceName.LastIndexOf('.')); if (text.LastIndexOf('.') >= 0) { text = text.Substring(text.LastIndexOf('.') + 1); } ((Object)val).name = text; return val; } public static void Shuffle(this IList list) { int num = list.Count; while (num > 1) { num--; Random random = new Random(); int index = random.Next(num + 1); T value = list[index]; list[index] = list[num]; list[num] = value; } } } public class WeightedTypeCollection { public WeightedType[] elements; public T SelectByWeight(Random generatorRandom) { List list = new List(); int num = 0; for (int i = 0; i < elements.Length; i++) { WeightedType weightedType = elements[i]; ExpansionDef requiredExpansion = weightedType.requiredExpansion; if ((Object)(object)requiredExpansion != (Object)null) { if (Run.instance.IsExpansionEnabled(requiredExpansion) && (float)weightedType.Weight > 0f) { list.Add(i); num += weightedType.Weight; } } else if ((float)weightedType.Weight > 0f) { if (ArtifactOfRevolution.ChaosMode.Value) { list.Add(i); list.Add(i); } list.Add(i); num += weightedType.Weight; } } list.Shuffle(); if (ArtifactOfRevolution.ChaosMode.Value) { return elements[list[0]].value; } int num2 = 100; int? num3 = null; while (!num3.HasValue) { num2--; if (num2 < 0) { break; } int num4 = Random.Range(0, num + 1); for (int j = 0; j < list.Count; j++) { int num5 = list[j]; if (num4 >= 0 && num4 <= elements[num5].Weight) { num3 = num5; break; } } if (num3.HasValue) { break; } } return elements[num3.GetValueOrDefault()].value; } public T SelectByWeight() { return SelectByWeight(null); } } public class WeightedType { public T value; public int Weight; public ExpansionDef requiredExpansion = null; public WeightedType(T newVal, int weight = 100, ExpansionDef expansionDef = null) { value = newVal; Weight = weight; requiredExpansion = expansionDef; } } }