Decompiled source of RiskOfInsanity v1.1.1

RandomizerMod.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
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 EntityStates;
using EntityStates.FalseSonBoss;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using On.RoR2;
using On.RoR2.CharacterSpeech;
using On.RoR2.Projectile;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RandomizerMod.Networking;
using RandomizerMod.RandomizerScripts.BuffRandomizers;
using RandomizerMod.RandomizerScripts.EnemyRandomizers;
using RandomizerMod.RandomizerScripts.ItemRandomizers;
using RandomizerMod.RandomizerScripts.MusicRandomizers;
using RandomizerMod.RandomizerScripts.ProjectileRandomizers;
using RandomizerMod.RandomizerScripts.StageRandomizers;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.CharacterSpeech;
using RoR2.Projectile;
using UnityEngine;
using UnityEngine.Events;
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: IgnoresAccessChecksTo("RoR2")]
[assembly: AssemblyCompany("RandomizerMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+826b060602e095c6af424eb5d0a092c85c750734")]
[assembly: AssemblyProduct("RandomizerMod")]
[assembly: AssemblyTitle("RandomizerMod")]
[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 RandomizerMod
{
	public enum RandomizeOption
	{
		Disabled,
		UniquePerKind,
		UniquePerKindWithDuplicates,
		AlwaysUnique
	}
	public class RandomConfigs
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static UnityAction <>9__19_0;

			public static UnityAction <>9__19_1;

			public static UnityAction <>9__19_2;

			public static UnityAction <>9__19_3;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, bool> <>9__25_0;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, string> <>9__25_1;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, bool> <>9__26_0;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, string> <>9__26_1;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, bool> <>9__27_0;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, string> <>9__27_1;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, bool> <>9__28_0;

			public static Func<KeyValuePair<string, ConfigEntry<bool>>, string> <>9__28_1;

			internal void <SetupConfigs>b__19_0()
			{
				foreach (string playerCharacterName in playerCharacterNames)
				{
					if (blacklist.TryGetValue(playerCharacterName, out var value))
					{
						value.Value = true;
					}
				}
			}

			internal void <SetupConfigs>b__19_1()
			{
				foreach (string playerCharacterName in playerCharacterNames)
				{
					if (blacklist.TryGetValue(playerCharacterName, out var value))
					{
						value.Value = false;
					}
				}
			}

			internal void <SetupConfigs>b__19_2()
			{
				foreach (string droneMasterName in droneMasterNames)
				{
					if (blacklist.TryGetValue(droneMasterName, out var value))
					{
						value.Value = true;
					}
				}
			}

			internal void <SetupConfigs>b__19_3()
			{
				foreach (string droneMasterName in droneMasterNames)
				{
					if (blacklist.TryGetValue(droneMasterName, out var value))
					{
						value.Value = true;
					}
				}
			}

			internal bool <GetBlacklistedItems>b__25_0(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Value.Value;
			}

			internal string <GetBlacklistedItems>b__25_1(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Key;
			}

			internal bool <GetBlacklistedBuffs>b__26_0(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Value.Value;
			}

			internal string <GetBlacklistedBuffs>b__26_1(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Key;
			}

			internal bool <GetBlacklistedProjectiles>b__27_0(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Value.Value;
			}

			internal string <GetBlacklistedProjectiles>b__27_1(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Key;
			}

			internal bool <GetBlacklistedHitscans>b__28_0(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Value.Value;
			}

			internal string <GetBlacklistedHitscans>b__28_1(KeyValuePair<string, ConfigEntry<bool>> kv)
			{
				return kv.Key;
			}
		}

		public static ConfigEntry<EnemyRandomOptions> randomizeEnemiesOption;

		public static ConfigEntry<bool> replaceChampionsWithChampions;

		public static ConfigEntry<bool> allowRandomizeWithSelf;

		public static ConfigEntry<bool> slightBalancing;

		public static Dictionary<string, ConfigEntry<bool>> blacklist = new Dictionary<string, ConfigEntry<bool>>();

		public static ConfigEntry<RandomizeOption> randomizeItems;

		public static ConfigEntry<bool> randomizeLunars;

		public static ConfigEntry<bool> randomizeEquipment;

		public static ConfigEntry<bool> randomizeDronePickups;

		public static Dictionary<string, ConfigEntry<bool>> itemBlacklist = new Dictionary<string, ConfigEntry<bool>>();

		public static ConfigEntry<RandomizeOption> randomizeBuffs;

		public static Dictionary<string, ConfigEntry<bool>> buffBlacklist = new Dictionary<string, ConfigEntry<bool>>();

		public static ConfigEntry<RandomizeOption> randomizeMusic;

		public static ConfigEntry<RandomizeOption> randomizeProjectiles;

		public static ConfigEntry<bool> separateStationaryProjectiles;

		public static Dictionary<string, ConfigEntry<bool>> projectileBlacklist = new Dictionary<string, ConfigEntry<bool>>();

		public static ConfigEntry<RandomizeOption> randomizeHitscans;

		public static Dictionary<string, ConfigEntry<bool>> hitscanBlacklist = new Dictionary<string, ConfigEntry<bool>>();

		public static ConfigEntry<bool> randomizeStages;

		private static List<string> droneMasterNames = new List<string>
		{
			"BombardmentDroneMaster", "CleanupDroneMaster", "CopycatDroneMaster", "Drone1Master", "Drone2Master", "DroneBackupMaster", "DroneBomberMaster", "DroneCommanderMaster", "DroneMissileMaster", "EmergencyDroneMaster",
			"EngiBeamTurretMaster", "EngiTurretMaster", "EngiWalkerTurretMaster", "EquipmentDroneMaster", "FlameDroneMaster", "HaulerDroneMaster", "JailerDroneMaster", "JunkDroneMaster", "MegaDroneMaster", "RechargeDroneMaster",
			"SquidTurretMaster", "Turret1Master"
		};

		private static List<string> playerCharacterNames = new List<string>
		{
			"HuntressMonsterMaster", "DroneTechMonsterMaster", "ToolbotMonsterMaster", "Bandit2MonsterMaster", "CommandoMonsterMaster", "CrocoMonsterMaster", "EngiMonsterMaster", "HereticMonsterMaster", "LoaderMonsterMaster", "MageMonsterMaster",
			"MercMonsterMaster", "VoidSurvivorMonsterMaster", "ChefMonsterMaster", "FalseSonMonsterMaster", "SeekerMonsterMaster", "DrifterMonsterMaster", "ToolbotMonsterMasterVariant", "RailgunnerMonsterMaster", "TreebotMonsterMaster"
		};

		public static void SetupConfigs(ConfigFile Config)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Expected O, but got Unknown
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Expected O, but got Unknown
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Expected O, but got Unknown
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Expected O, but got Unknown
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Expected O, but got Unknown
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Expected O, but got Unknown
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Expected O, but got Unknown
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Expected O, but got Unknown
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_0282: Expected O, but got Unknown
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Expected O, but got Unknown
			//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Expected O, but got Unknown
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ea: Expected O, but got Unknown
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e0: Expected O, but got Unknown
			//IL_0314: Unknown result type (might be due to invalid IL or missing references)
			//IL_031e: Expected O, but got Unknown
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0314: Expected O, but got Unknown
			randomizeEnemiesOption = Config.Bind<EnemyRandomOptions>("Enemies", "Randomize Enemies", EnemyRandomOptions.UniquePerEnemyType, (ConfigDescription)null);
			replaceChampionsWithChampions = Config.Bind<bool>("Enemies", "Replace bosses with bosses", false, (ConfigDescription)null);
			allowRandomizeWithSelf = Config.Bind<bool>("Enemies", "Allow to Randomize With Itself", true, (ConfigDescription)null);
			slightBalancing = Config.Bind<bool>("Enemies", "Slight balancing", false, "With this enabled, it will pick similar enemies to not make insanely overpowered enemies be picked.");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeEnemiesOption));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(replaceChampionsWithChampions));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(allowRandomizeWithSelf));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(slightBalancing));
			randomizeItems = Config.Bind<RandomizeOption>("Items", "Randomize Items", RandomizeOption.Disabled, "Disabled = no randomization.  UniquePerKind = every item maps to one fixed replacement for the whole run.  UniquePerKindWithDuplicates = Same as Unique Per Kind, but allows duplicates  AlwaysUnique = a new random replacement is picked each time an item drops.");
			randomizeLunars = Config.Bind<bool>("Items", "Randomize Lunars", false, "Mainly for the bazaar between times, for 5 free items");
			randomizeDronePickups = Config.Bind<bool>("Items", "Randomize Drone Pickups", true, "When enabled, drone pickups will also be added to the pool.");
			randomizeEquipment = Config.Bind<bool>("Items", "Randomize Equipment With Equipment", false, "When enabled, equipment will only randomize with itself (including aspect)");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeItems));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(randomizeLunars));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(randomizeDronePickups));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(randomizeEquipment));
			randomizeBuffs = Config.Bind<RandomizeOption>("Buffs", "Randomize Buffs", RandomizeOption.Disabled, "Disabled = no randomization.  UniquePerKind = each buff always maps to the same replacement.  UniquePerKindWithDuplicates = Same as Unique Per Kind, but allows duplicates  AlwaysUnique = a new random buff is picked every time one is applied.");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeBuffs));
			randomizeMusic = Config.Bind<RandomizeOption>("Music", "Randomize Music", RandomizeOption.Disabled, "Disabled = no randomization.  UniquePerKind = each track maps to one fixed replacement.  UniquePerKindWithDuplicates = Same as Unique Per Kind, but allows duplicates  AlwaysUnique = a new random track is picked every time.");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeMusic));
			randomizeProjectiles = Config.Bind<RandomizeOption>("Projectiles", "Randomize Projectiles", RandomizeOption.Disabled, "Disabled = no randomization.  UniquePerKind = each projectile prefab maps to one fixed replacement.  UniquePerKindWithDuplicates = Same as Unique Per Kind, but allows duplicates  AlwaysUnique = a new random prefab is picked on every fire.");
			separateStationaryProjectiles = Config.Bind<bool>("Projectiles", "Separate Stationary Projectiles", false, "When enabled, moving projectiles will only be randomized with other moving projectiles, and stationary projectiles with stationary projectiles. When disabled, all projectiles can be randomized together.");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeProjectiles));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(separateStationaryProjectiles));
			randomizeHitscans = Config.Bind<RandomizeOption>("Hitscans", "Randomize Hitscans", RandomizeOption.Disabled, "Disabled = no randomization.  UniquePerKind = each hitscan visual/damage-type maps to one fixed replacement.  UniquePerKindWithDuplicates = Same as Unique Per Kind, but allows duplicates  AlwaysUnique = a new random hitscan is picked on every shot.");
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)randomizeHitscans));
			randomizeStages = Config.Bind<bool>("Stages", "Randomize Stages", false, "False = disabled, True = Enabled.");
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(randomizeStages));
			object obj = <>c.<>9__19_0;
			if (obj == null)
			{
				UnityAction val = delegate
				{
					foreach (string playerCharacterName in playerCharacterNames)
					{
						if (blacklist.TryGetValue(playerCharacterName, out var value4))
						{
							value4.Value = true;
						}
					}
				};
				<>c.<>9__19_0 = val;
				obj = (object)val;
			}
			ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Blacklist all player monster", "Enemies/Blacklist", (UnityAction)obj));
			object obj2 = <>c.<>9__19_1;
			if (obj2 == null)
			{
				UnityAction val2 = delegate
				{
					foreach (string playerCharacterName2 in playerCharacterNames)
					{
						if (blacklist.TryGetValue(playerCharacterName2, out var value3))
						{
							value3.Value = false;
						}
					}
				};
				<>c.<>9__19_1 = val2;
				obj2 = (object)val2;
			}
			ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Whitelist all player monster", "Enemies/Blacklist", (UnityAction)obj2));
			object obj3 = <>c.<>9__19_2;
			if (obj3 == null)
			{
				UnityAction val3 = delegate
				{
					foreach (string droneMasterName in droneMasterNames)
					{
						if (blacklist.TryGetValue(droneMasterName, out var value2))
						{
							value2.Value = true;
						}
					}
				};
				<>c.<>9__19_2 = val3;
				obj3 = (object)val3;
			}
			ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Blacklist all drones", "Enemies/Blacklist", (UnityAction)obj3));
			object obj4 = <>c.<>9__19_3;
			if (obj4 == null)
			{
				UnityAction val4 = delegate
				{
					foreach (string droneMasterName2 in droneMasterNames)
					{
						if (blacklist.TryGetValue(droneMasterName2, out var value))
						{
							value.Value = true;
						}
					}
				};
				<>c.<>9__19_3 = val4;
				obj4 = (object)val4;
			}
			ModSettingsManager.AddOption((BaseOption)new GenericButtonOption("Whitelist all drones", "Enemies/Blacklist", (UnityAction)obj4));
		}

		public static void SetupBlacklistOptionsMonsters(ConfigFile Config)
		{
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Expected O, but got Unknown
			foreach (CharacterMaster allMaster in MasterCatalog.allMasters)
			{
				try
				{
					if (!((Object)(object)allMaster == (Object)null) && !blacklist.ContainsKey(((Object)((Component)allMaster).gameObject).name))
					{
						bool flag = RandomizerPlugin.GetForbiddenMasters().Contains(((Object)((Component)allMaster).gameObject).name);
						ConfigEntry<bool> val = Config.Bind<bool>("Enemies/Blacklist", ((Object)((Component)allMaster).gameObject).name, flag, "Set to true to EXCLUDE this monster from the randomization pool.");
						blacklist.Add(((Object)((Component)allMaster).gameObject).name, val);
						ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val));
					}
				}
				catch (Exception ex)
				{
					RandomizerPlugin.log.LogError((object)("[RandomConfigs] Error setting up monster blacklist for master: " + ex.Message));
				}
			}
		}

		public static void SetupBlacklistOptionsItem(ConfigFile Config)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Invalid comparison between Unknown and I4
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Invalid comparison between Unknown and I4
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Invalid comparison between Unknown and I4
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Invalid comparison between Unknown and I4
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			foreach (PickupDef allPickup in PickupCatalog.allPickups)
			{
				try
				{
					if (allPickup != null && (int)allPickup.artifactIndex == -1 && (int)allPickup.miscPickupIndex == -1 && ((int)allPickup.itemIndex != -1 || (int)allPickup.equipmentIndex != -1) && !itemBlacklist.ContainsKey(allPickup.internalName))
					{
						bool flag = RandomizerPlugin.GetBlacklist().Contains(allPickup.internalName);
						ConfigEntry<bool> val = Config.Bind<bool>("Items/Blacklist", allPickup.internalName, flag, "Set to true to EXCLUDE this item from the randomization pool.");
						itemBlacklist.Add(allPickup.internalName, val);
						ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val));
					}
				}
				catch (Exception ex)
				{
					RandomizerPlugin.log.LogError((object)("[RandomConfigs] Error setting up item blacklist for pickup: " + ex.Message));
				}
			}
		}

		public static void SetupBlacklistOptionsBuff(ConfigFile Config)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			BuffDef[] buffDefs = BuffCatalog.buffDefs;
			foreach (BuffDef val in buffDefs)
			{
				try
				{
					if (!((Object)(object)val == (Object)null) && !buffBlacklist.ContainsKey(((Object)val).name))
					{
						ConfigEntry<bool> val2 = Config.Bind<bool>("Buffs/Blacklist", ((Object)val).name, false, "Set to true to EXCLUDE this buff from the randomization pool.");
						buffBlacklist.Add(((Object)val).name, val2);
						ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val2));
					}
				}
				catch (Exception ex)
				{
					RandomizerPlugin.log.LogError((object)("[RandomConfigs] Error setting up buff blacklist for buff " + (((val != null) ? ((Object)val).name : null) ?? "null") + ": " + ex.Message));
				}
			}
		}

		public static void SetupBlacklistOptionsProjectile(ConfigFile Config)
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			GameObject[] projectilePrefabs = ProjectileCatalog.projectilePrefabs;
			foreach (GameObject val in projectilePrefabs)
			{
				try
				{
					if (!((Object)(object)val == (Object)null))
					{
						string name = ((Object)val).name;
						if (!string.IsNullOrEmpty(name) && !projectileBlacklist.ContainsKey(name))
						{
							bool flag = RandomizerPlugin.GetForbiddenProjectiles().Contains(name);
							ConfigEntry<bool> val2 = Config.Bind<bool>("Projectiles/Blacklist", name, flag, "Set to true to EXCLUDE this projectile from being used as a replacement in randomization.");
							projectileBlacklist.Add(name, val2);
							ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val2));
						}
					}
				}
				catch (Exception ex)
				{
					RandomizerPlugin.log.LogError((object)("[RandomConfigs] Error setting up projectile blacklist for prefab " + (((val != null) ? ((Object)val).name : null) ?? "null") + ": " + ex.Message));
				}
			}
		}

		public static void SetupBlacklistOptionsHitscan(ConfigFile Config)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Invalid comparison between Unknown and I4
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Expected O, but got Unknown
			foreach (BulletAttackIdentifier bulletAttackIdentifier in BulletAttackCatalog.bulletAttackIdentifiers)
			{
				try
				{
					if (bulletAttackIdentifier == null)
					{
						continue;
					}
					object obj;
					if ((int)bulletAttackIdentifier.TracerEffectIndex == -1)
					{
						obj = "NoTracer";
					}
					else
					{
						EffectDef effectDef = EffectCatalog.GetEffectDef(bulletAttackIdentifier.TracerEffectIndex);
						if (effectDef == null)
						{
							obj = null;
						}
						else
						{
							GameObject prefab = effectDef.prefab;
							obj = ((prefab != null) ? ((Object)prefab).name : null);
						}
						if (obj == null)
						{
							obj = "NoTracer";
						}
					}
					string text = (string)obj;
					object obj2;
					if ((int)bulletAttackIdentifier.HitEffectIndex == -1)
					{
						obj2 = "NoHit";
					}
					else
					{
						EffectDef effectDef2 = EffectCatalog.GetEffectDef(bulletAttackIdentifier.HitEffectIndex);
						if (effectDef2 == null)
						{
							obj2 = null;
						}
						else
						{
							GameObject prefab2 = effectDef2.prefab;
							obj2 = ((prefab2 != null) ? ((Object)prefab2).name : null);
						}
						if (obj2 == null)
						{
							obj2 = "NoHit";
						}
					}
					string text2 = (string)obj2;
					string text3 = $"{text}_{text2}_{bulletAttackIdentifier.DamageType}_{bulletAttackIdentifier.Flags}";
					if (!hitscanBlacklist.ContainsKey(text3))
					{
						ConfigEntry<bool> val = Config.Bind<bool>("Hitscans/Blacklist", text3, false, "Set to true to EXCLUDE this hitscan (Tracer: " + text + ", Hit: " + text2 + ") from being used as a replacement in randomization.");
						hitscanBlacklist.Add(text3, val);
						ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(val));
					}
				}
				catch (Exception ex)
				{
					RandomizerPlugin.log.LogError((object)("[RandomConfigs] Error setting up hitscan blacklist for identifier: " + ex.Message));
				}
			}
		}

		public static HashSet<string> GetBlacklistedItems()
		{
			return new HashSet<string>(from kv in itemBlacklist
				where kv.Value.Value
				select kv.Key);
		}

		public static HashSet<string> GetBlacklistedBuffs()
		{
			return new HashSet<string>(from kv in buffBlacklist
				where kv.Value.Value
				select kv.Key);
		}

		public static HashSet<string> GetBlacklistedProjectiles()
		{
			return new HashSet<string>(from kv in projectileBlacklist
				where kv.Value.Value
				select kv.Key);
		}

		public static HashSet<string> GetBlacklistedHitscans()
		{
			return new HashSet<string>(from kv in hitscanBlacklist
				where kv.Value.Value
				select kv.Key);
		}
	}
	public enum EnemyRandomOptions
	{
		Disabled,
		UniquePerEnemyType,
		UniquePerEnemyTypeWithinFamily,
		AlwaysUnique
	}
	[BepInPlugin("com.bananastudio.randomizer", "RiskofInsanity", "1.1.0")]
	public class RandomizerPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Perform <0>__MasterSummon_Perform;

			public static hook_OnBodyStart <1>__CharacterMaster_OnBodyStart;

			public static hook_SpawnRemoteOperationDrone <2>__CharacterMaster_SpawnRemoteOperationDrone;

			public static hook_PickNextStageScene <3>__Run_PickNextStageScene;

			public static hook_FireProjectile_FireProjectileInfo <4>__ProjectileManager_FireProjectile_FireProjectileInfo;

			public static hook_AddBuff_BuffDef <5>__CharacterBody_AddBuff_BuffDef;

			public static hook_RemoveBuff_BuffDef <6>__CharacterBody_RemoveBuff_BuffDef;

			public static hook_AddTimedBuff_BuffDef_float <7>__CharacterBody_AddTimedBuff_BuffDef_float;

			public static hook_AddTimedBuff_BuffDef_float_int <8>__CharacterBody_AddTimedBuff_BuffDef_float_int;

			public static hook_Fire <9>__BulletAttack_Fire;

			public static hook_FireSingle <10>__BulletAttack_FireSingle;

			public static hook_PickCurrentTrack <11>__MusicController_PickCurrentTrack;

			public static hook_SpeakNow <12>__CharacterSpeechController_SpeakNow;
		}

		public const string PluginGUID = "com.bananastudio.randomizer";

		public const string PluginName = "RiskofInsanity";

		public const string PluginVersion = "1.1.0";

		public static ManualLogSource log;

		private Hook generateDropHook;

		private Hook generatePickupHook;

		public static List<Family> families = new List<Family>
		{
			new Family("Lemurians", new List<string> { "LemurianMaster", "LemurianBruiserMasterPoison", "LemurianBruiserMasterIce", "LemurianBruiserMasterHaunted", "LemurianBruiserMasterFire", "LemurianBruiserMaster" }),
			new Family("Beetle", new List<string> { "BeetleQueenMaster", "BeetleMaster", "BeetleGuardMasterCrystal", "BeetleGuardMaster", "BeetleGuardAllyMaster", "BeetleCrystalMaster" }),
			new Family("Collective", new List<string>
			{
				"SolusAmalgamatorFlamethrowerCannonMaster", "SolusAmalgamatorMaster", "SolusAmalgamatorMissilePodMaster", "SolusAmalgamatorThrusterMaster", "SolusHeartMaster", "SolusWingMaster", "DefectiveUnitMaster", "WorkerUnitMaster", "MinePodMaster", "SolusMineMaster",
				"ExtractorUnitMaster", "IronHaulerMaster", "RoboBallBossMaster"
			}),
			new Family("Void", new List<string>
			{
				"VoidBarnacleMaster", "VoidBarnacleNoCastMaster", "VoidBarnacleAllyMaster", "VoidInfestorMaster", "VoidJailerAllyMaster", "VoidJailerMaster", "VoidMegaCrabAllyMaster", "VoidMegaCrabMaster", "MiniVoidRaidCrabMasterBase", "MiniVoidRaidCrabMasterPhase1",
				"MiniVoidRaidCrabMasterPhase2", "MiniVoidRaidCrabMasterPhase3"
			}),
			new Family("Constructs", new List<string> { "MegaConstructMaster", "MinorConstructMaster", "MinorConstructOnKillMaster", "MegaConstructMaster" }),
			new Family("Titans", new List<string> { "TitanGoldAllyMaster", "TitanGoldMaster", "TitanMaster", "GolemMaster", "HalcyoniteMaster", "FalseSonBossLunarShardMaster", "FalseSonBossMaster", "FalseSonBossLunarShardBrokenMaster" }),
			new Family("Lunars", new List<string> { "LunarWispMaster", "LunarGolemMaster", "LunarExploderMaster", "ITBrotherMaster", "BrotherMaster", "BrotherHurtMaster", "BrotherHauntMaster", "BrotherGlassMaster" }),
			new Family("Jellys", new List<string> { "JellyfishMaster", "VagrantMaster" }),
			new Family("Imps", new List<string> { "ImpMaster", "ImpBossMaster" }),
			new Family("The Family", new List<string> { "ParentMaster", "ParentPodMaster", "GrandparentMaster", "ChildMaster" }),
			new Family("Wisps", new List<string> { "GravekeeperMaster", "GreaterWispMaster", "WispMaster", "WispSoulMaster" }),
			new Family("THE GUPS!!!!!!", new List<string> { "GupMaster", "GipMaster", "GeepMaster" }),
			new Family("Vultures", new List<string> { "VultureHunterMaster", "VultureMaster" }),
			new Family("Clays", new List<string> { "ClaymanMaster", "ClayBruiserMaster", "ClayBossMaster", "ClayGrenadierMaster" }),
			new Family("Worms", new List<string> { "ScorchlingMaster", "MagmaWormMaster", "ElectricWormMaster" }),
			new Family("Scavengers", new List<string> { "ScavLunar1Master", "ScavLunar2Master", "ScavLunar3Master", "ScavLunar4Master", "ScavMaster" })
		};

		public static RandomizerPlugin Instance { get; private set; }

		public void Awake()
		{
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Expected O, but got Unknown
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Expected O, but got Unknown
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Expected O, but got Unknown
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Expected O, but got Unknown
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Expected O, but got Unknown
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Expected O, but got Unknown
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Expected O, but got Unknown
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Expected O, but got Unknown
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Expected O, but got Unknown
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: Expected O, but got Unknown
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Expected O, but got Unknown
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: Expected O, but got Unknown
			//IL_033b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Expected O, but got Unknown
			//IL_034d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0357: Expected O, but got Unknown
			//IL_035f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: Expected O, but got Unknown
			//IL_0371: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Expected O, but got Unknown
			//IL_0323: Unknown result type (might be due to invalid IL or missing references)
			//IL_0328: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Expected O, but got Unknown
			//IL_038c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_0397: Expected O, but got Unknown
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Randomizer Mod loaded!");
			log = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			RandomConfigs.SetupConfigs(((BaseUnityPlugin)this).Config);
			NetworkingAPI.RegisterMessageType<ProjectileRandomizerSync>();
			NetworkingAPI.RegisterMessageType<HitscanRandomizerSync>();
			NetworkingAPI.RegisterMessageType<SyncSettings>();
			try
			{
				MethodInfo method = typeof(PickupDropTable).GetMethod("GenerateDrop", BindingFlags.Instance | BindingFlags.Public);
				MethodInfo method2 = typeof(ItemRandomizer).GetMethod("PickupDropTable_GenerateDrop", BindingFlags.Static | BindingFlags.Public);
				if (method != null && method2 != null)
				{
					generateDropHook = new Hook((MethodBase)method, method2);
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Hooked GenerateDrop");
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)$"Could not find methods - GenerateDrop: {method != null}, Hook: {method2 != null}");
				}
				MethodInfo method3 = typeof(PickupDropTable).GetMethod("GeneratePickup", BindingFlags.Instance | BindingFlags.Public);
				MethodInfo method4 = typeof(ItemRandomizer).GetMethod("PickupDropTable_GeneratePickup", BindingFlags.Static | BindingFlags.Public);
				if (method3 != null && method4 != null)
				{
					generatePickupHook = new Hook((MethodBase)method3, method4);
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Hooked GeneratePickup");
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)$"Could not find methods - GeneratePickup: {method3 != null}, Hook: {method4 != null}");
				}
			}
			catch (Exception arg)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Error setting up pickup hooks: {arg}");
			}
			object obj = <>O.<0>__MasterSummon_Perform;
			if (obj == null)
			{
				hook_Perform val = EnemyRandomizer.MasterSummon_Perform;
				<>O.<0>__MasterSummon_Perform = val;
				obj = (object)val;
			}
			MasterSummon.Perform += (hook_Perform)obj;
			object obj2 = <>O.<1>__CharacterMaster_OnBodyStart;
			if (obj2 == null)
			{
				hook_OnBodyStart val2 = EnemyRandomizer.CharacterMaster_OnBodyStart;
				<>O.<1>__CharacterMaster_OnBodyStart = val2;
				obj2 = (object)val2;
			}
			CharacterMaster.OnBodyStart += (hook_OnBodyStart)obj2;
			object obj3 = <>O.<2>__CharacterMaster_SpawnRemoteOperationDrone;
			if (obj3 == null)
			{
				hook_SpawnRemoteOperationDrone val3 = EnemyRandomizer.CharacterMaster_SpawnRemoteOperationDrone;
				<>O.<2>__CharacterMaster_SpawnRemoteOperationDrone = val3;
				obj3 = (object)val3;
			}
			CharacterMaster.SpawnRemoteOperationDrone += (hook_SpawnRemoteOperationDrone)obj3;
			object obj4 = <>O.<3>__Run_PickNextStageScene;
			if (obj4 == null)
			{
				hook_PickNextStageScene val4 = StageRandomizer.Run_PickNextStageScene;
				<>O.<3>__Run_PickNextStageScene = val4;
				obj4 = (object)val4;
			}
			Run.PickNextStageScene += (hook_PickNextStageScene)obj4;
			Run.Start += new hook_Start(Run_Start);
			object obj5 = <>O.<4>__ProjectileManager_FireProjectile_FireProjectileInfo;
			if (obj5 == null)
			{
				hook_FireProjectile_FireProjectileInfo val5 = ProjectileRandomizer.ProjectileManager_FireProjectile_FireProjectileInfo;
				<>O.<4>__ProjectileManager_FireProjectile_FireProjectileInfo = val5;
				obj5 = (object)val5;
			}
			ProjectileManager.FireProjectile_FireProjectileInfo += (hook_FireProjectile_FireProjectileInfo)obj5;
			object obj6 = <>O.<5>__CharacterBody_AddBuff_BuffDef;
			if (obj6 == null)
			{
				hook_AddBuff_BuffDef val6 = BuffRandomizer.CharacterBody_AddBuff_BuffDef;
				<>O.<5>__CharacterBody_AddBuff_BuffDef = val6;
				obj6 = (object)val6;
			}
			CharacterBody.AddBuff_BuffDef += (hook_AddBuff_BuffDef)obj6;
			object obj7 = <>O.<6>__CharacterBody_RemoveBuff_BuffDef;
			if (obj7 == null)
			{
				hook_RemoveBuff_BuffDef val7 = BuffRandomizer.CharacterBody_RemoveBuff_BuffDef;
				<>O.<6>__CharacterBody_RemoveBuff_BuffDef = val7;
				obj7 = (object)val7;
			}
			CharacterBody.RemoveBuff_BuffDef += (hook_RemoveBuff_BuffDef)obj7;
			object obj8 = <>O.<7>__CharacterBody_AddTimedBuff_BuffDef_float;
			if (obj8 == null)
			{
				hook_AddTimedBuff_BuffDef_float val8 = BuffRandomizer.CharacterBody_AddTimedBuff_BuffDef_float;
				<>O.<7>__CharacterBody_AddTimedBuff_BuffDef_float = val8;
				obj8 = (object)val8;
			}
			CharacterBody.AddTimedBuff_BuffDef_float += (hook_AddTimedBuff_BuffDef_float)obj8;
			object obj9 = <>O.<8>__CharacterBody_AddTimedBuff_BuffDef_float_int;
			if (obj9 == null)
			{
				hook_AddTimedBuff_BuffDef_float_int val9 = BuffRandomizer.CharacterBody_AddTimedBuff_BuffDef_float_int;
				<>O.<8>__CharacterBody_AddTimedBuff_BuffDef_float_int = val9;
				obj9 = (object)val9;
			}
			CharacterBody.AddTimedBuff_BuffDef_float_int += (hook_AddTimedBuff_BuffDef_float_int)obj9;
			object obj10 = <>O.<9>__BulletAttack_Fire;
			if (obj10 == null)
			{
				hook_Fire val10 = HitscanRandomizer.BulletAttack_Fire;
				<>O.<9>__BulletAttack_Fire = val10;
				obj10 = (object)val10;
			}
			BulletAttack.Fire += (hook_Fire)obj10;
			object obj11 = <>O.<10>__BulletAttack_FireSingle;
			if (obj11 == null)
			{
				hook_FireSingle val11 = HitscanRandomizer.BulletAttack_FireSingle;
				<>O.<10>__BulletAttack_FireSingle = val11;
				obj11 = (object)val11;
			}
			BulletAttack.FireSingle += (hook_FireSingle)obj11;
			object obj12 = <>O.<11>__MusicController_PickCurrentTrack;
			if (obj12 == null)
			{
				hook_PickCurrentTrack val12 = MusicRandomizer.MusicController_PickCurrentTrack;
				<>O.<11>__MusicController_PickCurrentTrack = val12;
				obj12 = (object)val12;
			}
			MusicController.PickCurrentTrack += (hook_PickCurrentTrack)obj12;
			MasterCatalog.Init += new hook_Init(MasterCatalog_Init);
			ItemCatalog.Init += new hook_Init(ItemCatalog_Init);
			BuffCatalog.Init += new hook_Init(BuffCatalog_Init);
			ProjectileCatalog.Init += new hook_Init(ProjectileCatalog_Init);
			object obj13 = <>O.<12>__CharacterSpeechController_SpeakNow;
			if (obj13 == null)
			{
				hook_SpeakNow val13 = DialogueRandomizer.CharacterSpeechController_SpeakNow;
				<>O.<12>__CharacterSpeechController_SpeakNow = val13;
				obj13 = (object)val13;
			}
			CharacterSpeechController.SpeakNow += (hook_SpeakNow)obj13;
		}

		private void ProjectileCatalog_Init(orig_Init orig)
		{
			orig.Invoke();
			RandomConfigs.SetupBlacklistOptionsProjectile(((BaseUnityPlugin)this).Config);
			BulletAttackCatalog.Init();
		}

		private void BuffCatalog_Init(orig_Init orig)
		{
			orig.Invoke();
			RandomConfigs.SetupBlacklistOptionsBuff(((BaseUnityPlugin)this).Config);
		}

		private void ItemCatalog_Init(orig_Init orig)
		{
			orig.Invoke();
			RandomConfigs.SetupBlacklistOptionsItem(((BaseUnityPlugin)this).Config);
		}

		private void MasterCatalog_Init(orig_Init orig)
		{
			orig.Invoke();
			RandomConfigs.SetupBlacklistOptionsMonsters(((BaseUnityPlugin)this).Config);
		}

		private void Update()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (!Input.GetKeyDown((KeyCode)284))
			{
				return;
			}
			PlayerCharacterMasterController val = PlayerCharacterMasterController.instances[0];
			CharacterMaster master = val.master;
			MinionGroup val2 = MinionGroup.FindGroup(((NetworkBehaviour)master).netId);
			if (val2 == null)
			{
				return;
			}
			MinionOwnership[] members = val2.members;
			foreach (MinionOwnership val3 in members)
			{
				if ((Object)(object)val3 != (Object)null)
				{
					CharacterMaster component = ((Component)val3).GetComponent<CharacterMaster>();
					if ((Object)(object)component != (Object)null)
					{
						CharacterBody body = component.GetBody();
						((BaseUnityPlugin)this).Logger.LogInfo((object)((Object)body).name);
					}
				}
			}
		}

		private void Run_Start(orig_Start orig, Run self)
		{
			if (NetworkServer.active)
			{
				NetMessageExtensions.Send((INetMessage)(object)new SyncSettings(), (NetworkDestination)1);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Host initializing randomizers...");
				RandomConfigs.SetupBlacklistOptionsHitscan(((BaseUnityPlugin)this).Config);
				RandomConfigs.SetupBlacklistOptionsProjectile(((BaseUnityPlugin)this).Config);
				RandomConfigs.SetupBlacklistOptionsBuff(((BaseUnityPlugin)this).Config);
				RandomConfigs.SetupBlacklistOptionsItem(((BaseUnityPlugin)this).Config);
				EnemyRandomizer.Init();
				ProjectileRandomizer.Reset();
				ProjectileRandomizer.Init();
				BulletAttackCatalog.Init();
				ItemRandomizer.Init();
				MusicRandomizer.Init();
				BuffRandomizer.Init();
				if (NetworkServer.active)
				{
					ProjectileRandomizerSync.SendChunked(ProjectileRandomizer.projectileRandomized);
					HitscanRandomizerSync.SendChunked(BulletAttackCatalog.toRandomize);
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Sent projectile sync to clients");
				}
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Client waiting for sync from host...");
			}
			orig.Invoke(self);
		}

		private void OnDestroy()
		{
			//IL_0035: 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_0040: Expected O, but got Unknown
			Hook obj = generateDropHook;
			if (obj != null)
			{
				obj.Dispose();
			}
			Hook obj2 = generatePickupHook;
			if (obj2 != null)
			{
				obj2.Dispose();
			}
			object obj3 = <>O.<0>__MasterSummon_Perform;
			if (obj3 == null)
			{
				hook_Perform val = EnemyRandomizer.MasterSummon_Perform;
				<>O.<0>__MasterSummon_Perform = val;
				obj3 = (object)val;
			}
			MasterSummon.Perform -= (hook_Perform)obj3;
		}

		public static HashSet<string> GetBlacklist()
		{
			return new HashSet<string>
			{
				"ItemIndex.HealthDecay", "ItemIndex.MinHealthPercentage", "ItemIndex.Ghost", "ItemIndex.GummyCloneIdentifier", "ItemIndex.TransferDebuffOnHit", "ItemIndex.TonicAffliction", "ItemIndex.InvadingDoppelganger", "ItemIndex.Junk", "ItemIndex.UseAmbientLevel", "ItemIndex.VoidmanPassiveItem",
				"ItemIndex.ConvertCritChanceToCritDamage", "ItemIndex.CutHp", "ItemIndex.ExtraLifeVoidConsumed", "ItemIndex.AdaptiveArmor", "ItemIndex.MonsoonPlayerHelper", "ItemIndex.TeleportWhenOob", "ItemIndex.RandomlyLunar", "ItemIndex.BurnNearby", "ItemIndex.ExtraLifeConsumed", "ItemIndex.FragileDamageBonusConsumed",
				"ItemIndex.HealingPotionConsumed", "ItemIndex.AACannon", "ItemIndex.CrippleWardOnLevel", "ItemIndex.DroneDynamiteDisplay", "ItemIndex.DrizzlePlayerHelper", "ItemIndex.DroneWeaponsDisplay1", "ItemIndex.DroneWeaponsDisplay2", "ItemIndex.EmpowerAlways", "ItemIndex.LemurianHarness", "ItemIndex.LunarWings",
				"ItemIndex.MageAttunement", "ItemIndex.MinionLeash", "ItemIndex.PlantOnHit", "ItemIndex.PlasmaCore", "ItemIndex.TeamSizeDamageBonus", "ItemIndex.DroneUpgradeHidden", "ItemIndex.CritHeal", "ItemIndex.SkullCounter", "ItemIndex.TempestOnKill", "DroneIndex.DroneCommander",
				"DroneIndex.BackupDrone", "DroneIndex.EquipmentDrone", "DroneIndex.BomberDrone", "DroneIndex.DTGunnerDrone", "DroneIndex.DTHaulerDrone", "DroneIndex.DTHealDrone", "DroneIndex.MegaDrone", "EquipmentIndex.EliteSecretSpeedEquipment", "EquipmentIndex.EliteGoldEquipment", "EquipmentIndex.Enigma",
				"EquipmentIndex.IrradiatingLaser", "EquipmentIndex.LunarPotion", "EquipmentIndex.OrbOnUse", "EquipmentIndex.OrbitalLaser", "EquipmentIndex.SoulJar", "EquipmentIndex.GhostGun"
			};
		}

		public static HashSet<string> GetForbiddenMasters()
		{
			return new HashSet<string>
			{
				"VoidRaidCrabJointMaster", "VoidRaidCrabMaster", "SolusHeartMaster", "SolusHeartMaster_Offering", "SolusMineMaster", "MajorConstructMaster", "NullifierAllyMaster", "VoidJailerAllyMaster", "VoidBarnacleAllyMaster", "MinorConstructAttachableMaster",
				"ArchWispMaster", "ParentPodMaster", "DTHaulerDroneMaster", "DTGunnerDroneMaster", "DTHeallingDroneMaster", "ArtifactShellMaster", "BrotherHauntMaster", "LemurianBruiserMasterFire", "LemurianBruiserMasterIce", "LemurianBruiserMasterHaunted",
				"LemurianBruiserMasterPoison", "ShopkeeperMaster", "SolusVendorMaster", "EngiBeamTurretMaster", "RailgunnerMaster", "PlayerMaster"
			};
		}

		public static HashSet<string> GetForbiddenProjectiles()
		{
			return new HashSet<string>
			{
				"AACannon", "BeetleGrubMine", "BellBallSmall", "BellDevice", "EngiMineDeployer", "EngiSeekerGrenadeProjectile", "Funball", "GatewayProjectile", "GummyCloneProjectle", "HaulerThrowProjectile",
				"LoaderHook", "LoaderYankHook", "MinorConstructOnKillProjectile", "PaladinBigRocket", "PlasmaCore", "RedAffixMissileProjectile", "Rocket", "ScoutGrenade", "SoulSearchGhost", "SoulSearchProjectile",
				"Spine", "ThrownObjectProjectile", "ThrownObjectProjectileNoStun", "ToolbotDroneHeal", "ToolbotDroneStun", "TransferDebuffOnHitProjectile", "TreebotPounderProjectile", "VultureHunterXiSpearProjectileTeleported", "VultureHunterXiSpearProjectileThrown"
			};
		}

		public static bool isBlacklistedEnemy(string name)
		{
			if (RandomConfigs.blacklist.TryGetValue(name, out var value))
			{
				return value.Value;
			}
			return GetForbiddenMasters().Contains(name);
		}

		public static Family GetFamily(string prefabName)
		{
			return families.FirstOrDefault((Family x) => x.children.Contains(prefabName));
		}
	}
	public class Family
	{
		public string familyName;

		public List<string> children;

		public Family(string name, List<string> children)
		{
			familyName = name;
			this.children = children;
		}
	}
}
namespace RandomizerMod.RandomizerScripts.StageRandomizers
{
	public class StageRandomizer
	{
		public static void Run_PickNextStageScene(orig_PickNextStageScene orig, Run self, WeightedSelection<SceneDef> choices)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, choices);
			if (RandomConfigs.randomizeStages.Value)
			{
				List<SceneType> forbiddenScenes = new List<SceneType>
				{
					(SceneType)3,
					(SceneType)(-1),
					(SceneType)6,
					(SceneType)2,
					(SceneType)0,
					(SceneType)4
				};
				SceneDef[] array = ((IEnumerable<SceneDef>)(object)SceneCatalog.allSceneDefs).Where((SceneDef x) => !forbiddenScenes.Contains(x.sceneType) && !x.baseSceneName.ToLower().Contains("simulacrum") && x.nameToken != "MAP_INFINITETOWER_TITLE").ToArray();
				WeightedSelection<SceneDef> val = new WeightedSelection<SceneDef>(8);
				SceneDef[] array2 = array;
				foreach (SceneDef val2 in array2)
				{
					RandomizerPlugin.log.LogInfo((object)val2.nameToken);
					val.AddChoice(val2, 1f);
				}
				orig.Invoke(self, val);
			}
		}
	}
}
namespace RandomizerMod.RandomizerScripts.ProjectileRandomizers
{
	public class BulletAttackIdentifier
	{
		public EffectIndex TracerEffectIndex;

		public EffectIndex HitEffectIndex;

		public DamageType DamageType;

		public BulletAttackFlags Flags;

		public BulletAttackIdentifier(EffectIndex tracerEffectIndex, EffectIndex hitEffectIndex, DamageType damageType, BulletAttackFlags flags)
		{
			//IL_0009: 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_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: 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)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			TracerEffectIndex = tracerEffectIndex;
			HitEffectIndex = hitEffectIndex;
			DamageType = damageType;
			Flags = flags;
		}

		public string GetBlacklistKey()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			//IL_0013: 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_0046: Invalid comparison between Unknown and I4
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				object obj;
				if ((int)TracerEffectIndex == -1)
				{
					obj = "NoTracer";
				}
				else
				{
					EffectDef effectDef = EffectCatalog.GetEffectDef(TracerEffectIndex);
					if (effectDef == null)
					{
						obj = null;
					}
					else
					{
						GameObject prefab = effectDef.prefab;
						obj = ((prefab != null) ? ((Object)prefab).name : null);
					}
					if (obj == null)
					{
						obj = "NoTracer";
					}
				}
				string text = (string)obj;
				object obj2;
				if ((int)HitEffectIndex == -1)
				{
					obj2 = "NoHit";
				}
				else
				{
					EffectDef effectDef2 = EffectCatalog.GetEffectDef(HitEffectIndex);
					if (effectDef2 == null)
					{
						obj2 = null;
					}
					else
					{
						GameObject prefab2 = effectDef2.prefab;
						obj2 = ((prefab2 != null) ? ((Object)prefab2).name : null);
					}
					if (obj2 == null)
					{
						obj2 = "NoHit";
					}
				}
				string text2 = (string)obj2;
				return $"{text}_{text2}_{DamageType}_{Flags}";
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[BulletAttackIdentifier] Error generating blacklist key: " + ex.Message));
				return "ErrorGeneratingKey";
			}
		}

		public bool IsBlacklisted()
		{
			try
			{
				string blacklistKey = GetBlacklistKey();
				HashSet<string> blacklistedHitscans = RandomConfigs.GetBlacklistedHitscans();
				return blacklistedHitscans.Contains(blacklistKey);
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[BulletAttackIdentifier] Error checking blacklist status: " + ex.Message));
				return false;
			}
		}
	}
	public class BulletAttackCatalog
	{
		public static readonly BulletAttackCatalog Instance = new BulletAttackCatalog();

		public static List<BulletAttackIdentifier> bulletAttackIdentifiers = new List<BulletAttackIdentifier>();

		public static Dictionary<BulletAttackIdentifier, BulletAttackIdentifier> toRandomize = new Dictionary<BulletAttackIdentifier, BulletAttackIdentifier>();

		[SystemInitializer(new Type[] { typeof(EffectCatalog) })]
		public static void Init()
		{
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Expected O, but got Unknown
			bulletAttackIdentifiers.Clear();
			initIdentifier("TracerBanditPistol", "HitsparkBandit2Pistol", (DamageType)524292);
			initIdentifier("TracerBanditPistol", "HitsparkBandit2Pistol", (DamageType)268959744);
			initIdentifier(null, "OmniImpactVFXSlash", (DamageType)0);
			initIdentifier("TracerClayBruiserMinigun", "Hitspark1", (DamageType)0);
			initIdentifier("TracerCommandoBoost", "HitsparkCommandoBarrage", (DamageType)32);
			initIdentifier("TracerBanditPistol", "HitsparkBanditPistol", (DamageType)4);
			initIdentifier("TracerCommandoDefault", "HitsparkCommando", (DamageType)0);
			initIdentifier("TracerBanditShotgun", "HitsparkBandit", (DamageType)0);
			initIdentifier("TracerBanditPistol", "WeakPointProcEffect", (DamageType)0);
			initIdentifier("TracerNoSmoke", "Hitspark1", (DamageType)0);
			initIdentifier("TracerCommandoBoost", "MuzzleflashBarrage", (DamageType)0);
			initIdentifier(null, "Hitspark1", (DamageType)8);
			initIdentifier("TracerEngiTurret", "ImpactEngiTurret", (DamageType)0);
			initIdentifier("TracerBandit2Rifle", "HitsparkBandit", (DamageType)0);
			initIdentifier("TracerBandit2Shotgun", "HitsparkBandit", (DamageType)0);
			initIdentifier("TracerCaptainShotgun", "HitsparkCaptainShotgun", (DamageType)0);
			initIdentifier("TracerCommandoShotgun", "HitsparkCommandoShotgun", (DamageType)0);
			initIdentifier("TracerHuntressSnipe", "OmniImpactVFXHuntress", (DamageType)0);
			initIdentifier("TracerRailgunCryo", "ImpactRailgun", (DamageType)256, BulletAttackFlags.Sniper);
			initIdentifier("TracerRailgun", "ImpactRailgun", (DamageType)0, BulletAttackFlags.Sniper);
			initIdentifier("TracerRailgunLight", "ImpactRailgunLight", (DamageType)0, BulletAttackFlags.Sniper);
			initIdentifier("TracerRailgunSuper", "ImpactRailgun", (DamageType)0, BulletAttackFlags.Sniper);
			initIdentifier("TracerToolbotRebar", "ImpactSpear", (DamageType)0);
			initIdentifier("TracerGoldGat", null, (DamageType)0);
			initIdentifier("TracerLaserTurbine", null, (DamageType)0);
			initIdentifier("TracerLaserTurbineReturn", null, (DamageType)0);
			initIdentifier(null, "MissileExplosionVFX", (DamageType)0);
			initIdentifier(null, "MissileExplosionVFX", (DamageType)128);
			initIdentifier("TracerLunarWispMinigun", "LunarWispMinigunHitspark", (DamageType)0);
			initIdentifier("TracerMageLightningLaser", "LightningFlash", (DamageType)0);
			initIdentifier("TracerToolbotNails", "ImpactNailgun", (DamageType)0);
			initIdentifier(null, "LaserImpactEffect", (DamageType)0);
			initIdentifier(null, "VoidSurvivorBeamImpactCorrupt", (DamageType)0);
			initIdentifier("VoidSurvivorBeamTracer", "VoidSurvivorBeamImpact", (DamageType)8);
			initIdentifier("TracerEmbers", "OmniImpactVFX", (DamageType)0);
			initIdentifier("TracerNanoPistolCharged", "NanoPistolImpactVFX", (DamageType)0);
			initIdentifier("TracerNanoPistol", "NanoPistolImpactVFX", (DamageType)0);
			toRandomize.Clear();
			if (RandomConfigs.randomizeHitscans.Value != RandomizeOption.UniquePerKind && RandomConfigs.randomizeHitscans.Value != RandomizeOption.UniquePerKindWithDuplicates)
			{
				return;
			}
			try
			{
				Xoroshiro128Plus val = new Xoroshiro128Plus(Run.instance.seed);
				List<BulletAttackIdentifier> list = new List<BulletAttackIdentifier>();
				foreach (BulletAttackIdentifier bulletAttackIdentifier3 in bulletAttackIdentifiers)
				{
					if (bulletAttackIdentifier3 != null && !bulletAttackIdentifier3.IsBlacklisted())
					{
						list.Add(bulletAttackIdentifier3);
					}
				}
				if (list.Count == 0)
				{
					RandomizerPlugin.log.LogWarning((object)"[HitRandomizer] All hitscan identifiers are blacklisted! Using full list instead.");
					list = new List<BulletAttackIdentifier>(bulletAttackIdentifiers);
				}
				List<BulletAttackIdentifier> list2 = new List<BulletAttackIdentifier>(list);
				bool flag = RandomConfigs.randomizeHitscans.Value == RandomizeOption.UniquePerKindWithDuplicates;
				foreach (BulletAttackIdentifier bulletAttackIdentifier4 in bulletAttackIdentifiers)
				{
					if (bulletAttackIdentifier4 == null || toRandomize.ContainsKey(bulletAttackIdentifier4))
					{
						continue;
					}
					if (list2.Count == 0)
					{
						if (!flag)
						{
							break;
						}
						list2 = new List<BulletAttackIdentifier>(list);
					}
					BulletAttackIdentifier bulletAttackIdentifier = list2[val.RangeInt(0, list2.Count)];
					toRandomize.Add(bulletAttackIdentifier4, bulletAttackIdentifier);
					if (!flag)
					{
						list2.Remove(bulletAttackIdentifier);
					}
				}
				RandomizerPlugin.log.LogInfo((object)$"[HitRandomizer] Initialized {toRandomize.Count} hitscan mappings from {list.Count} available identifiers.");
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitRandomizer] Error during hitscan randomization initialization: " + ex.Message));
			}
			static EffectIndex findEffectIndex(string name)
			{
				//IL_000c: 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_009c: 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_0056: Unknown result type (might be due to invalid IL or missing references)
				if (string.IsNullOrEmpty(name))
				{
					return (EffectIndex)(-1);
				}
				try
				{
					for (int i = 0; i < EffectCatalog.effectCount; i++)
					{
						EffectDef effectDef = EffectCatalog.GetEffectDef((EffectIndex)i);
						if (Object.op_Implicit((Object)(object)((effectDef != null) ? effectDef.prefab : null)) && ((Object)effectDef.prefab).name == name)
						{
							return effectDef.index;
						}
					}
				}
				catch (Exception ex2)
				{
					RandomizerPlugin.log.LogError((object)("[HitRandomizer] Error finding effect index for " + name + ": " + ex2.Message));
				}
				return (EffectIndex)(-1);
			}
			static void initIdentifier(string tracerEffectName, string hitEffectName, DamageType damageType = 0u, BulletAttackFlags flags = BulletAttackFlags.None)
			{
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//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_0044: Unknown result type (might be due to invalid IL or missing references)
				try
				{
					RandomizerPlugin.log.LogInfo((object)("[HitRandomizer] Generating bulletattack for " + tracerEffectName + " with effect name " + hitEffectName));
					BulletAttackIdentifier bulletAttackIdentifier2 = new BulletAttackIdentifier(findEffectIndex(tracerEffectName), findEffectIndex(hitEffectName), damageType, flags);
					RandomizerPlugin.log.LogInfo((object)("[HitRandomizer] Generated bulletattack for " + tracerEffectName + $"effect index is {bulletAttackIdentifier2.HitEffectIndex}"));
					bulletAttackIdentifiers.Add(bulletAttackIdentifier2);
				}
				catch (Exception ex3)
				{
					RandomizerPlugin.log.LogError((object)("[HitRandomizer] Error initializing identifier for " + tracerEffectName + "/" + hitEffectName + ": " + ex3.Message));
				}
			}
		}

		public static int getIndex(BulletAttackIdentifier attack)
		{
			if (bulletAttackIdentifiers.Contains(attack))
			{
				return bulletAttackIdentifiers.IndexOf(attack);
			}
			return -999;
		}

		public static bool TryGetIdentifier(BulletAttack bulletAttack, out BulletAttackIdentifier identifier)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Invalid comparison between Unknown and I4
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Invalid comparison between Unknown and I4
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			identifier = null;
			try
			{
				RandomizerPlugin.log.LogInfo((object)$"[HitscanRandomizer] TryGetIdentifier - bulletAttackIdentifiers.Count={bulletAttackIdentifiers.Count}");
				GameObject tracerEffectPrefab = bulletAttack.tracerEffectPrefab;
				GameObject hitEffectPrefab = bulletAttack.hitEffectPrefab;
				for (int i = 0; i < bulletAttackIdentifiers.Count; i++)
				{
					BulletAttackIdentifier bulletAttackIdentifier = bulletAttackIdentifiers[i];
					object obj;
					if ((int)bulletAttackIdentifier.TracerEffectIndex == -1)
					{
						obj = null;
					}
					else
					{
						EffectDef effectDef = EffectCatalog.GetEffectDef(bulletAttackIdentifier.TracerEffectIndex);
						obj = ((effectDef != null) ? effectDef.prefab : null);
					}
					GameObject val = (GameObject)obj;
					object obj2;
					if ((int)bulletAttackIdentifier.HitEffectIndex == -1)
					{
						obj2 = null;
					}
					else
					{
						EffectDef effectDef2 = EffectCatalog.GetEffectDef(bulletAttackIdentifier.HitEffectIndex);
						obj2 = ((effectDef2 != null) ? effectDef2.prefab : null);
					}
					GameObject val2 = (GameObject)obj2;
					if (i == 0)
					{
						RandomizerPlugin.log.LogInfo((object)("[HitscanRandomizer] TryGetIdentifier - Looking for tracer=" + (((tracerEffectPrefab != null) ? ((Object)tracerEffectPrefab).name : null) ?? "null") + ", hit=" + (((hitEffectPrefab != null) ? ((Object)hitEffectPrefab).name : null) ?? "null")));
						RandomizerPlugin.log.LogInfo((object)("[HitscanRandomizer] TryGetIdentifier - First candidate: tracer=" + (((val != null) ? ((Object)val).name : null) ?? "null") + ", hit=" + (((val2 != null) ? ((Object)val2).name : null) ?? "null")));
					}
					if ((Object)(object)val == (Object)(object)tracerEffectPrefab && (Object)(object)val2 == (Object)(object)hitEffectPrefab)
					{
						identifier = bulletAttackIdentifier;
						return true;
					}
				}
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitscanRandomizer] Error in TryGetIdentifier: " + ex.Message));
			}
			return false;
		}

		public static BulletAttackIdentifier RandomizeAttack(BulletAttackIdentifier attack)
		{
			try
			{
				switch (RandomConfigs.randomizeHitscans.Value)
				{
				case RandomizeOption.Disabled:
					return attack;
				case RandomizeOption.UniquePerKind:
				case RandomizeOption.UniquePerKindWithDuplicates:
				{
					BulletAttackIdentifier value;
					return toRandomize.TryGetValue(attack, out value) ? value : attack;
				}
				case RandomizeOption.AlwaysUnique:
				{
					if (bulletAttackIdentifiers.Count == 0)
					{
						return attack;
					}
					List<BulletAttackIdentifier> list = new List<BulletAttackIdentifier>();
					foreach (BulletAttackIdentifier bulletAttackIdentifier in bulletAttackIdentifiers)
					{
						if (bulletAttackIdentifier != null && !bulletAttackIdentifier.IsBlacklisted())
						{
							list.Add(bulletAttackIdentifier);
						}
					}
					if (list.Count == 0)
					{
						RandomizerPlugin.log.LogWarning((object)"[HitscanRandomizer] All hitscan identifiers are blacklisted! Using original attack.");
						return attack;
					}
					return list[Random.Range(0, list.Count)];
				}
				default:
					return attack;
				}
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitscanRandomizer] Error in RandomizeAttack: " + ex.Message));
				return attack;
			}
		}

		public static void ApplyIdentifier(BulletAttack bulletAttack, BulletAttackIdentifier identifier)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Invalid comparison between Unknown and I4
			//IL_0015: 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_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((int)identifier.TracerEffectIndex != -1)
				{
					EffectDef effectDef = EffectCatalog.GetEffectDef(identifier.TracerEffectIndex);
					bulletAttack.tracerEffectPrefab = ((effectDef != null) ? effectDef.prefab : null);
				}
				if ((int)identifier.HitEffectIndex != -1)
				{
					EffectDef effectDef2 = EffectCatalog.GetEffectDef(identifier.HitEffectIndex);
					bulletAttack.hitEffectPrefab = ((effectDef2 != null) ? effectDef2.prefab : null);
				}
				DamageTypeCombo damageType = default(DamageTypeCombo);
				((DamageTypeCombo)(ref damageType))..ctor(DamageTypeCombo.op_Implicit(identifier.DamageType), bulletAttack.damageType.damageTypeExtended, bulletAttack.damageType.damageSource);
				bulletAttack.damageType = damageType;
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitscanRandomizer] Error applying identifier to bullet attack: " + ex.Message));
			}
		}
	}
	[Flags]
	public enum BulletAttackFlags : uint
	{
		None = 0u,
		Sniper = 1u
	}
	public class HitscanRandomizer
	{
		public static void BulletAttack_Fire(orig_Fire orig, BulletAttack self)
		{
			//IL_0063: 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_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			if (RandomConfigs.randomizeHitscans.Value == RandomizeOption.Disabled)
			{
				orig.Invoke(self);
				return;
			}
			try
			{
				ManualLogSource log = RandomizerPlugin.log;
				GameObject tracerEffectPrefab = self.tracerEffectPrefab;
				string arg = ((tracerEffectPrefab != null) ? ((Object)tracerEffectPrefab).name : null) ?? "null";
				GameObject hitEffectPrefab = self.hitEffectPrefab;
				log.LogInfo((object)string.Format("[HitscanRandomizer] BulletAttack.Fire called. tracerEffectPrefab={0}, hitEffectPrefab={1}, damageType={2}", arg, ((hitEffectPrefab != null) ? ((Object)hitEffectPrefab).name : null) ?? "null", self.damageType));
				if (BulletAttackCatalog.TryGetIdentifier(self, out var identifier))
				{
					RandomizerPlugin.log.LogInfo((object)$"[HitscanRandomizer] Fire - Matched identifier. Tracer={identifier.TracerEffectIndex}, Hit={identifier.HitEffectIndex}, DamageType={identifier.DamageType}");
					BulletAttackIdentifier bulletAttackIdentifier = BulletAttackCatalog.RandomizeAttack(identifier);
					RandomizerPlugin.log.LogInfo((object)$"[HitscanRandomizer] Fire - Randomized to. Tracer={bulletAttackIdentifier.TracerEffectIndex}, Hit={bulletAttackIdentifier.HitEffectIndex}, DamageType={bulletAttackIdentifier.DamageType}");
					BulletAttackCatalog.ApplyIdentifier(self, bulletAttackIdentifier);
				}
				else
				{
					RandomizerPlugin.log.LogInfo((object)"[HitscanRandomizer] Fire - No identifier match found, skipping.");
				}
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitscanRandomizer] Error in BulletAttack_Fire hook: " + ex.Message + "\n" + ex.StackTrace));
			}
			orig.Invoke(self);
		}

		public static void BulletAttack_FireSingle(orig_FireSingle orig, BulletAttack self, FireSingleArgs args)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			if (RandomConfigs.randomizeHitscans.Value == RandomizeOption.Disabled)
			{
				orig.Invoke(self, args);
				return;
			}
			try
			{
				ManualLogSource log = RandomizerPlugin.log;
				GameObject tracerEffectPrefab = self.tracerEffectPrefab;
				string arg = ((tracerEffectPrefab != null) ? ((Object)tracerEffectPrefab).name : null) ?? "null";
				GameObject hitEffectPrefab = self.hitEffectPrefab;
				log.LogInfo((object)string.Format("[HitscanRandomizer] BulletAttack.FireSingle called. tracerEffectPrefab={0}, hitEffectPrefab={1}, damageType={2}", arg, ((hitEffectPrefab != null) ? ((Object)hitEffectPrefab).name : null) ?? "null", self.damageType));
				if (BulletAttackCatalog.TryGetIdentifier(self, out var identifier))
				{
					RandomizerPlugin.log.LogInfo((object)$"[HitscanRandomizer] FireSingle - Matched identifier. Tracer={identifier.TracerEffectIndex}, Hit={identifier.HitEffectIndex}, DamageType={identifier.DamageType}");
					BulletAttackIdentifier bulletAttackIdentifier = BulletAttackCatalog.RandomizeAttack(identifier);
					RandomizerPlugin.log.LogInfo((object)$"[HitscanRandomizer] FireSingle - Randomized to. Tracer={bulletAttackIdentifier.TracerEffectIndex}, Hit={bulletAttackIdentifier.HitEffectIndex}, DamageType={bulletAttackIdentifier.DamageType}");
					BulletAttackCatalog.ApplyIdentifier(self, bulletAttackIdentifier);
				}
				else
				{
					RandomizerPlugin.log.LogInfo((object)"[HitscanRandomizer] FireSingle - No identifier match found, skipping.");
				}
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[HitscanRandomizer] Error in BulletAttack_FireSingle hook: " + ex.Message + "\n" + ex.StackTrace));
			}
			orig.Invoke(self, args);
		}
	}
	public class ProjectileRandomizer
	{
		public static Dictionary<GameObject, GameObject> projectileRandomized = new Dictionary<GameObject, GameObject>();

		private static GameObject[] allPrefabs;

		private static List<GameObject> movingProjectiles = new List<GameObject>();

		private static List<GameObject> stationaryProjectiles = new List<GameObject>();

		public static void Init()
		{
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			projectileRandomized.Clear();
			movingProjectiles.Clear();
			stationaryProjectiles.Clear();
			GameObject[] projectilePrefabs = ProjectileCatalog.projectilePrefabs;
			if (projectilePrefabs == null || projectilePrefabs.Length == 0)
			{
				RandomizerPlugin.log.LogError((object)"[ProjectileRandomizer] ProjectileCatalog.projectilePrefabs is null or empty!");
				return;
			}
			try
			{
				if ((Object)(object)Run.instance == (Object)null)
				{
					RandomizerPlugin.log.LogError((object)"[ProjectileRandomizer] Run.instance is null during Init!");
					return;
				}
				Xoroshiro128Plus val = new Xoroshiro128Plus(Run.instance.seed);
				HashSet<string> blacklistedProjectiles = RandomConfigs.GetBlacklistedProjectiles();
				GameObject[] array = (allPrefabs = projectilePrefabs.Where((GameObject x) => (Object)(object)x != (Object)null && !blacklistedProjectiles.Contains(((Object)x).name)).ToArray());
				if (RandomConfigs.separateStationaryProjectiles.Value || RandomConfigs.randomizeProjectiles.Value == RandomizeOption.UniquePerKind || RandomConfigs.randomizeProjectiles.Value == RandomizeOption.UniquePerKindWithDuplicates)
				{
					GameObject[] array2 = array;
					foreach (GameObject val2 in array2)
					{
						try
						{
							if (!((Object)(object)val2 == (Object)null))
							{
								ProjectileSimple component = val2.GetComponent<ProjectileSimple>();
								if ((Object)(object)component != (Object)null && component.desiredForwardSpeed > 0f)
								{
									movingProjectiles.Add(val2);
								}
								else
								{
									stationaryProjectiles.Add(val2);
								}
							}
						}
						catch (Exception ex)
						{
							RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error categorizing projectile " + (((val2 != null) ? ((Object)val2).name : null) ?? "null") + ": " + ex.Message));
						}
					}
				}
				if ((!NetworkServer.active && NetworkClient.active) || (RandomConfigs.randomizeProjectiles.Value != RandomizeOption.UniquePerKind && RandomConfigs.randomizeProjectiles.Value != RandomizeOption.UniquePerKindWithDuplicates))
				{
					return;
				}
				bool flag = RandomConfigs.randomizeProjectiles.Value == RandomizeOption.UniquePerKindWithDuplicates;
				if (RandomConfigs.separateStationaryProjectiles.Value)
				{
					if (movingProjectiles.Count == 0)
					{
						RandomizerPlugin.log.LogWarning((object)"[ProjectileRandomizer] No non-blacklisted moving projectiles available!");
					}
					else
					{
						List<GameObject> list = new List<GameObject>(movingProjectiles);
						foreach (GameObject movingProjectile in movingProjectiles)
						{
							try
							{
								if (projectileRandomized.ContainsKey(movingProjectile))
								{
									continue;
								}
								if (list.Count == 0)
								{
									if (!flag)
									{
										break;
									}
									list = new List<GameObject>(movingProjectiles);
								}
								GameObject val3 = list[val.RangeInt(0, list.Count)];
								projectileRandomized.Add(movingProjectile, val3);
								if (!flag)
								{
									list.Remove(val3);
								}
							}
							catch (Exception ex2)
							{
								RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error randomizing moving projectile " + (((movingProjectile != null) ? ((Object)movingProjectile).name : null) ?? "null") + ": " + ex2.Message));
							}
						}
					}
					if (stationaryProjectiles.Count == 0)
					{
						RandomizerPlugin.log.LogWarning((object)"[ProjectileRandomizer] No non-blacklisted stationary projectiles available!");
					}
					else
					{
						List<GameObject> list2 = new List<GameObject>(stationaryProjectiles);
						foreach (GameObject stationaryProjectile in stationaryProjectiles)
						{
							try
							{
								if (projectileRandomized.ContainsKey(stationaryProjectile))
								{
									continue;
								}
								if (list2.Count == 0)
								{
									if (!flag)
									{
										break;
									}
									list2 = new List<GameObject>(stationaryProjectiles);
								}
								GameObject val4 = list2[val.RangeInt(0, list2.Count)];
								projectileRandomized.Add(stationaryProjectile, val4);
								if (!flag)
								{
									list2.Remove(val4);
								}
							}
							catch (Exception ex3)
							{
								RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error randomizing stationary projectile " + (((stationaryProjectile != null) ? ((Object)stationaryProjectile).name : null) ?? "null") + ": " + ex3.Message));
							}
						}
					}
				}
				else
				{
					List<GameObject> list3 = new List<GameObject>(array);
					if (list3.Count == 0)
					{
						RandomizerPlugin.log.LogWarning((object)"[ProjectileRandomizer] No non-blacklisted projectiles available!");
						return;
					}
					List<GameObject> list4 = new List<GameObject>(list3);
					foreach (GameObject item in list3)
					{
						try
						{
							if (projectileRandomized.ContainsKey(item))
							{
								continue;
							}
							if (list4.Count == 0)
							{
								if (!flag)
								{
									break;
								}
								list4 = new List<GameObject>(list3);
							}
							GameObject val5 = list4[val.RangeInt(0, list4.Count)];
							projectileRandomized.Add(item, val5);
							if (!flag)
							{
								list4.Remove(val5);
							}
						}
						catch (Exception ex4)
						{
							RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error randomizing projectile " + (((item != null) ? ((Object)item).name : null) ?? "null") + ": " + ex4.Message));
						}
					}
				}
				RandomizerPlugin.log.LogInfo((object)($"[ProjectileRandomizer] Initialized {projectileRandomized.Count} projectile mappings. " + $"Moving: {movingProjectiles.Count}, Stationary: {stationaryProjectiles.Count}"));
			}
			catch (Exception ex5)
			{
				RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error during projectile randomization initialization: " + ex5.Message + "\n" + ex5.StackTrace));
			}
		}

		public static void Reset()
		{
			projectileRandomized.Clear();
			movingProjectiles.Clear();
			stationaryProjectiles.Clear();
		}

		private static GameObject Resolve(GameObject original)
		{
			try
			{
				HashSet<string> blacklistedProjectiles = RandomConfigs.GetBlacklistedProjectiles();
				switch (RandomConfigs.randomizeProjectiles.Value)
				{
				case RandomizeOption.Disabled:
					return original;
				case RandomizeOption.UniquePerKind:
				case RandomizeOption.UniquePerKindWithDuplicates:
				{
					if (projectileRandomized.TryGetValue(original, out var value))
					{
						return value;
					}
					if (RandomConfigs.separateStationaryProjectiles.Value)
					{
						ProjectileSimple component2 = original.GetComponent<ProjectileSimple>();
						List<GameObject> list3 = (((Object)(object)component2 != (Object)null && component2.desiredForwardSpeed > 0f) ? movingProjectiles : stationaryProjectiles);
						if (list3.Count > 0)
						{
							GameObject val2 = list3[Random.Range(0, list3.Count)];
							projectileRandomized[original] = val2;
							return val2;
						}
					}
					return original;
				}
				case RandomizeOption.AlwaysUnique:
				{
					if (allPrefabs == null || allPrefabs.Length == 0)
					{
						return original;
					}
					if (blacklistedProjectiles.Contains(((Object)original).name))
					{
						return original;
					}
					if (RandomConfigs.separateStationaryProjectiles.Value)
					{
						ProjectileSimple component = original.GetComponent<ProjectileSimple>();
						bool flag = (Object)(object)component != (Object)null && component.desiredForwardSpeed > 0f;
						List<GameObject> list = (flag ? movingProjectiles : stationaryProjectiles);
						if (list.Count > 0)
						{
							return list[Random.Range(0, list.Count)];
						}
						RandomizerPlugin.log.LogWarning((object)("[ProjectileRandomizer] No available projectiles in pool for " + (flag ? "moving" : "stationary") + " projectile " + (((original != null) ? ((Object)original).name : null) ?? "null")));
						return original;
					}
					List<GameObject> list2 = new List<GameObject>();
					GameObject[] array = allPrefabs;
					foreach (GameObject val in array)
					{
						if ((Object)(object)val != (Object)null && !blacklistedProjectiles.Contains(((Object)val).name))
						{
							list2.Add(val);
						}
					}
					if (list2.Count == 0)
					{
						RandomizerPlugin.log.LogWarning((object)"[ProjectileRandomizer] All projectiles are blacklisted! Using original.");
						return original;
					}
					return list2[Random.Range(0, list2.Count)];
				}
				default:
					return original;
				}
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error in Resolve for " + (((original != null) ? ((Object)original).name : null) ?? "null") + ": " + ex.Message));
				return original;
			}
		}

		public static void ProjectileManager_FireProjectileServer(orig_FireProjectileServer orig, ProjectileManager self, FireProjectileInfo fireProjectileInfo, NetworkConnection clientAuthorityOwner, ushort predictionId, double fastForwardTime)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				fireProjectileInfo.projectilePrefab = Resolve(fireProjectileInfo.projectilePrefab);
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error in ProjectileManager_FireProjectileServer hook: " + ex.Message));
			}
			orig.Invoke(self, fireProjectileInfo, clientAuthorityOwner, predictionId, fastForwardTime);
		}

		public static void ProjectileManager_FireProjectile_FireProjectileInfo(orig_FireProjectile_FireProjectileInfo orig, ProjectileManager self, FireProjectileInfo fireProjectileInfo)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				fireProjectileInfo.projectilePrefab = Resolve(fireProjectileInfo.projectilePrefab);
			}
			catch (Exception ex)
			{
				RandomizerPlugin.log.LogError((object)("[ProjectileRandomizer] Error in ProjectileManager_FireProjectile_FireProjectileInfo hook: " + ex.Message));
			}
			orig.Invoke(self, fireProjectileInfo);
		}
	}
}
namespace RandomizerMod.RandomizerScripts.MusicRandomizers
{
	public class MusicRandomizer
	{
		public static Dictionary<MusicTrackDef, MusicTrackDef> toRandomize = new Dictionary<MusicTrackDef, MusicTrackDef>();

		private static MusicTrackDef[] allTracks;

		public static void Init()
		{
			toRandomize.Clear();
			allTracks = MusicTrackCatalog.musicTrackDefs;
			if (RandomConfigs.randomizeMusic.Value != RandomizeOption.UniquePerKind && RandomConfigs.randomizeMusic.Value != RandomizeOption.UniquePerKindWithDuplicates)
			{
				return;
			}
			List<MusicTrackDef> list = new List<MusicTrackDef>(allTracks);
			bool flag = RandomConfigs.randomizeMusic.Value == RandomizeOption.UniquePerKindWithDuplicates;
			MusicTrackDef[] array = allTracks;
			foreach (MusicTrackDef key in array)
			{
				if (!toRandomize.ContainsKey(key))
				{
					if (list.Count == 0)
					{
						break;
					}
					MusicTrackDef val = list[Random.Range(0, list.Count)];
					toRandomize.Add(key, val);
					if (!flag)
					{
						list.Remove(val);
					}
				}
			}
		}

		public static void MusicController_PickCurrentTrack(orig_PickCurrentTrack orig, MusicController self, ref MusicTrackDef newTrack)
		{
			orig.Invoke(self, ref newTrack);
			if ((Object)(object)newTrack == (Object)null)
			{
				return;
			}
			switch (RandomConfigs.randomizeMusic.Value)
			{
			case RandomizeOption.Disabled:
				break;
			case RandomizeOption.UniquePerKind:
			case RandomizeOption.UniquePerKindWithDuplicates:
			{
				if (toRandomize.TryGetValue(newTrack, out var value))
				{
					newTrack = value;
				}
				break;
			}
			case RandomizeOption.AlwaysUnique:
				if (allTracks != null && allTracks.Length != 0)
				{
					newTrack = allTracks[Random.Range(0, allTracks.Length)];
				}
				break;
			}
		}
	}
}
namespace RandomizerMod.RandomizerScripts.ItemRandomizers
{
	public class ItemRandomizer
	{
		public delegate PickupIndex orig_GenerateDrop(PickupDropTable self, Xoroshiro128Plus rng);

		public delegate UniquePickup orig_GeneratePickup(PickupDropTable self, Xoroshiro128Plus rng);

		private static Dictionary<PickupDef, PickupDef> toRandomize = new Dictionary<PickupDef, PickupDef>();

		private static List<PickupDef> candidatePool = new List<PickupDef>();

		private static List<PickupDef> equipmentPool = new List<PickupDef>();

		public static void Init()
		{
			toRandomize.Clear();
			candidatePool.Clear();
			equipmentPool.Clear();
			HashSet<string> blacklist = RandomizerPlugin.GetBlacklist();
			bool droneBlacklist = RandomConfigs.randomizeDronePickups.Value;
			List<PickupDef> list = (from p in PickupCatalog.allPickups
				where !blacklist.Contains(p.internalName)
				where (int)p.artifactIndex == -1 && (int)p.miscPickupIndex == -1 && (droneBlacklist || (int)p.droneIndex == -1)
				select p).ToList();
			if (RandomConfigs.randomizeEquipment.Value)
			{
				equipmentPool.AddRange(list.Where((PickupDef p) => (int)p.equipmentIndex != -1));
				candidatePool.AddRange(list.Where((PickupDef p) => (int)p.equipmentIndex == -1));
			}
			else
			{
				candidatePool.AddRange(list);
			}
			if (RandomConfigs.randomizeItems.Value != RandomizeOption.UniquePerKind && RandomConfigs.randomizeItems.Value != RandomizeOption.UniquePerKindWithDuplicates)
			{
				return;
			}
			bool flag = RandomConfigs.randomizeItems.Value == RandomizeOption.UniquePerKindWithDuplicates;
			List<PickupDef> list2 = new List<PickupDef>(candidatePool);
			foreach (PickupDef item in candidatePool)
			{
				if (!toRandomize.ContainsKey(item))
				{
					if (list2.Count == 0)
					{
						break;
					}
					PickupDef val = list2[Random.Range(0, list2.Count)];
					toRandomize.Add(item, val);
					if (!flag)
					{
						list2.Remove(val);
					}
				}
			}
			if (!RandomConfigs.randomizeEquipment.Value || equipmentPool.Count <= 0)
			{
				return;
			}
			List<PickupDef> list3 = new List<PickupDef>(equipmentPool);
			foreach (PickupDef item2 in equipmentPool)
			{
				if (!toRandomize.ContainsKey(item2))
				{
					if (list3.Count == 0)
					{
						break;
					}
					PickupDef val2 = list3[Random.Range(0, list3.Count)];
					toRandomize.Add(item2, val2);
					if (!flag)
					{
						list3.Remove(val2);
					}
				}
			}
		}

		public static PickupIndex PickupDropTable_GenerateDrop(orig_GenerateDrop orig, PickupDropTable self, Xoroshiro128Plus rng)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_000b: 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_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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			PickupIndex val = orig(self, rng);
			if (val == PickupIndex.none || !((PickupIndex)(ref val)).isValid)
			{
				return val;
			}
			return ApplyPickupRandomization(val, rng);
		}

		public static UniquePickup PickupDropTable_GeneratePickup(orig_GeneratePickup orig, PickupDropTable self, Xoroshiro128Plus rng)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: 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_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//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_007c: 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)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			UniquePickup val = orig(self, rng);
			if (val.pickupIndex == PickupIndex.none || !((PickupIndex)(ref val.pickupIndex)).isValid)
			{
				return val;
			}
			ItemDef itemDef = ItemCatalog.GetItemDef(((PickupIndex)(ref val.pickupIndex)).itemIndex);
			if ((Object)(object)itemDef != (Object)null && itemDef.tags.Contains((ItemTag)33))
			{
				return val;
			}
			PickupIndex val2 = ApplyPickupRandomization(val.pickupIndex, rng);
			return ((UniquePickup)(ref val)).WithPickupIndex(val2);
		}

		public static PickupIndex ApplyPickupRandomization(PickupIndex pickupIndex, Xoroshiro128Plus rng)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Invalid comparison between Unknown and I4
			//IL_002b: 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_011f: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Invalid comparison between Unknown and I4
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: 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_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			if (RandomConfigs.randomizeItems.Value == RandomizeOption.Disabled)
			{
				return pickupIndex;
			}
			PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex);
			if (pickupDef == null)
			{
				return pickupIndex;
			}
			if ((int)pickupDef.itemTier == 3 && !RandomConfigs.randomizeLunars.Value)
			{
				return pickupIndex;
			}
			HashSet<string> blacklist = RandomizerPlugin.GetBlacklist();
			if (blacklist.Contains(pickupDef.internalName))
			{
				return pickupIndex;
			}
			bool flag = (int)pickupDef.equipmentIndex != -1;
			switch (RandomConfigs.randomizeItems.Value)
			{
			case RandomizeOption.UniquePerKind:
			case RandomizeOption.UniquePerKindWithDuplicates:
			{
				if (toRandomize.TryGetValue(pickupDef, out var value))
				{
					return value.pickupIndex;
				}
				return pickupIndex;
			}
			case RandomizeOption.AlwaysUnique:
			{
				List<PickupDef> list = ((flag && RandomConfigs.randomizeEquipment.Value) ? equipmentPool : candidatePool);
				if (list.Count == 0)
				{
					return pickupIndex;
				}
				return list[rng.RangeInt(0, list.Count)].pickupIndex;
			}
			default:
				return pickupIndex;
			}
		}
	}
}
namespace RandomizerMod.RandomizerScripts.EnemyRandomizers
{
	public class DialogueRandomizer
	{
		public static void CharacterSpeechController_SpeakNow(orig_SpeakNow orig, CharacterSpeechController self, ref SpeechInfo speechInfo)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: 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_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Expected O, but got Unknown
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Expected O, but got Unknown
			if (!NetworkServer.active)
			{
				return;
			}
			if (CharacterSpeechController.cvEnableLogging.value)
			{
				self.Log($"Playing speech: {speechInfo}");
			}
			self.nextSpeakTime = self.localTime + speechInfo.duration;
			GameObject sender = null;
			SfxLocator val = null;
			if (Object.op_Implicit((Object)(object)self.characterMaster))
			{
				CharacterBody body = self.characterMaster.GetBody();
				if (Object.op_Implicit((Object)(object)body))
				{
					val = ((Component)body).GetComponent<SfxLocator>();
				}
			}
			EnemyRandomizer.RandomizedFrom randomizedFrom = default(EnemyRandomizer.RandomizedFrom);
			if (((Component)self.characterMaster).TryGetComponent<EnemyRandomizer.RandomizedFrom>(ref randomizedFrom))
			{
				string originalNameString = randomizedFrom.originalNameString;
				string @string = Language.GetString(self.chatFormatToken);
				@string = @string.Replace(Language.GetString(originalNameString), Language.GetString(self.characterMaster.GetBody().baseNameToken));
				RandomizerPlugin.log.LogInfo((object)("Sending dialogue: bossname: " + originalNameString + ", original: " + @string + ", " + self.characterMaster.GetBody().baseNameToken));
				Chat.SendBroadcastChat((ChatMessageBase)new NpcChatMessage
				{
					baseToken = speechInfo.token,
					formatStringToken = @string,
					sender = sender,
					sound = (((Object)(object)val != (Object)null) ? val.barkSound : null)
				});
			}
			else
			{
				Chat.SendBroadcastChat((ChatMessageBase)new BodyChatMessage
				{
					bodyObject = ((Component)self.characterMaster.GetBody()).gameObject,
					token = speechInfo.token
				});
			}
		}
	}
	public class EnemyRandomizer
	{
		public class RandomizedFrom : MonoBehaviour
		{
			public string originalMasterName;

			public string originalNameString;
		}

		public static Dictionary<GameObject, GameObject> toRandomizeWith = new Dictionary<GameObject, GameObject>();

		public static Dictionary<GameObject, GameObject> masterPrefabToRandomMaster = new Dictionary<GameObject, GameObject>();

		private static Dictionary<GameObject, GameObject> bodyPrefabToRandomBody = new Dictionary<GameObject, GameObject>();

		private static Dictionary<GameObject, float> masterPrefabToDirectorCost = new Dictionary<GameObject, float>();

		private static float HealthScore(CharacterBody body)
		{
			if ((Object)(object)body == (Object)null)
			{
				return 0f;
			}
			return body.baseMaxHealth + body.levelMaxHealth * 10f;
		}

		private static void CacheSpawnCardCosts()
		{
			CharacterSpawnCard[] array = Resources.FindObjectsOfTypeAll<CharacterSpawnCard>();
			CharacterSpawnCard[] array2 = array;
			foreach (CharacterSpawnCard val in array2)
			{
				if ((Object)(object)val != (Object)null && (Object)(object)((SpawnCard)val).prefab != (Object)null)
				{
					masterPrefabToDirectorCost[((SpawnCard)val).prefab] = ((SpawnCard)val).directorCreditCost;
				}
			}
		}

		private static float GetDirectorCost(GameObject masterPrefab)
		{
			if (masterPrefabToDirectorCost.TryGetValue(masterPrefab, out var value))
			{
				return value;
			}
			return 0f;
		}

		public static void Init()
		{
			toRandomizeWith.Clear();
			masterPrefabToRandomMaster.Clear();
			bodyPrefabToRandomBody.Clear();
			masterPrefabToDirectorCost.Clear();
			if (RandomConfigs.randomizeEnemiesOption.Value == EnemyRandomOptions.Disabled || RandomConfigs.randomizeEnemiesOption.Value == EnemyRandomOptions.AlwaysUnique)
			{
				return;
			}
			if (RandomConfigs.slightBalancing.Value)
			{
				CacheSpawnCardCosts();
			}
			var array = (from <>h__TransparentIdentifier0 in MasterCatalog.allMasters.Select(delegate(CharacterMaster master)
				{
					object body;
					if (master == null)
					{
						body = null;
					}
					else
					{
						GameObject bodyPrefab = master.bodyPrefab;
						body = ((bodyPrefab != null) ? bodyPrefab.GetComponent<CharacterBody>() : null);
					}
					return new
					{
						master = master,
						body = (CharacterBody)body
					};
				})
				where (Object)(object)<>h__TransparentIdentifier0.body != (Object)null && !RandomizerPlugin.isBlacklistedEnemy(((Object)<>h__TransparentIdentifier0.master).name)
				select new
				{
					masterPrefab = ((Component)<>h__TransparentIdentifier0.master).gameObject,
					body = <>h__TransparentIdentifier0.body,
					masterName = ((Object)<>h__TransparentIdentifier0.master).name
				}).ToArray();
			List<GameObject> list = new List<GameObject>();
			list.AddRange(array.Select(p => p.masterPrefab));
			var array2 = array;
			foreach (var anon in array2)
			{
				if (!toRandomizeWith.ContainsKey(anon.masterPrefab))
				{
					int num = 0;
					Family family = null;
					if (RandomConfigs.randomizeEnemiesOption.Value == EnemyRandomOptions.UniquePerEnemyTypeWithinFamily)
					{
						family = RandomizerPlugin.GetFamily(anon.masterName);
					}
					GameObject randomMaster;
					do
					{
						randomMaster = getRandomMaster(list, anon.body.isChampion, family, anon.masterPrefab, anon.body);
						num++;
					}
					while ((Object)(object)randomMaster == (Object)(object)anon.masterPrefab && !RandomConfigs.allowRandomizeWithSelf.Value && list.Count > 1 && num < 50);
					toRandomizeWith.Add(anon.masterPrefab, randomMaster);
					if (!masterPrefabToRandomMaster.ContainsKey(anon.masterPrefab))
					{
						masterPrefabToRandomMaster.Add(anon.masterPrefab, randomMaster);
					}
					list.Remove(randomMaster);
				}
			}
		}

		private static void LogAllComponents(GameObject tologg)
		{
			Component[] components = tologg.GetComponents<Component>();
			foreach (Component val in components)
			{
				RandomizerPlugin.log.LogInfo((object)((object)val).GetType().Name);
			}
		}

		public static void CharacterMaster_SpawnRemoteOperationDrone(orig_SpawnRemoteOperationDrone orig, CharacterMaster self, string droneBodyToSpawn, uint moneyToUse)
		{
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			if (RandomConfigs.randomizeEnemiesOption.Value == EnemyRandomOptions.Disabled)
			{
				orig.Invoke(self, droneBodyToSpawn, moneyToUse);
				return;
			}
			GameObject val = BodyCatalog.FindBodyPrefab(droneBodyToSpawn);
			if ((Object)(object)val == (Object)null)
			{
				orig.Invoke(self, droneBodyToSpawn, moneyToUse);
				return;
			}
			CharacterBody component = val.GetComponent<CharacterBody>();
			if ((Object)(object)component == (Object)null)
			{
				orig.Invoke(self, droneBodyToSpawn, moneyToUse);
				return;
			}
			string name = ((Object)val).name;
			GameObject val2 = ((RandomConfigs.randomizeEnemiesOption.Value != EnemyRandomOptions.AlwaysUnique) ? GetRandomBodyConsistent(val, component) : GetRandomBodyDirect(val, component));
			if ((Object)(object)val2 != (Object)null && (Object)(object)val2 != (Object)(object)val)
			{
				CharacterBody component2 = val2.GetComponent<CharacterBody>();
				if ((Object)(object)component2 != (Object)null)
				{
					droneBodyToSpawn = BodyCatalog.GetBodyName(component2.bodyIndex);
				}
			}
			orig.Invoke(self, droneBodyToSpawn, moneyToUse);
		}

		private static GameObject GetRandomBodyDirect(GameObject originalBodyPrefab, CharacterBody originalBody)
		{
			bool isChampion = originalBody?.isChampion ?? false;
			GameObject[] array = (from body in BodyCatalog.allBodyPrefabs
				let charBody = (body != null) ? body.GetComponent<CharacterBody>() : null
				where (Object)(object)charBody != (Object)null && MasterCatalog.allMasters.Any((CharacterMaster m) => (Object)(object)m != (Object)null && (Object)(object)m.bodyPrefab == (Object)(object)body && !RandomizerPlugin.isBlacklistedEnemy(((Object)m).name)) && !((Object)charBody).name.StartsWith("DTGunnerDroneBody") && !((Object)charBody).name.StartsWith("DTHealingDroneBody") && !((Object)charBody).name.StartsWith("DTHaulerDroneBody") && (!RandomConfigs.replaceChampionsWithChampions.Value || isChampion == charBody.isChampion)
				select body).ToArray();
			if (array.Length == 0)
			{
				return originalBodyPrefab;
			}
			if (RandomConfigs.slightBalancing.Value)
			{
				return ApplyBalancingToBodySelection(array, originalBodyPrefab, originalBody);
			}
			int num = 0;
			GameObject val;
			do
			{
				val = array[Random.Range(0, array.Length)];
				num++;
			}
			while ((Object)(object)val == (Object)(object)originalBodyPrefab && !RandomConfigs.allowRandomizeWithSelf.Value && array.Length > 1 && num < 50);
			return val;
		}

		private static GameObject GetRandomBodyConsistent(GameObject originalBodyPrefab, CharacterBody originalBody)
		{
			if (bodyPrefabToRandomBody.ContainsKey(originalBodyPrefab))
			{
				ret