Decompiled source of RandomCardsGenerator v1.0.0

plugins/RandomCardsGenerator.dll

Decompiled 6 days 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 System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using HarmonyLib;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using ModdingUtils.Patches;
using ModdingUtils.Utils;
using Photon.Pun;
using RandomCardsGenerators.Cards;
using RandomCardsGenerators.Extensions;
using RandomCardsGenerators.Utils;
using TMPro;
using UnboundLib;
using UnboundLib.Cards;
using UnboundLib.Utils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.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 RandomCardsGenerators
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.aalund13.rounds.random_cards_generator", "Random Cards Generator", "1.0.0")]
	[BepInProcess("Rounds.exe")]
	public class Main : BaseUnityPlugin
	{
		private const string modId = "com.aalund13.rounds.random_cards_generator";

		private const string modName = "Random Cards Generator";

		internal const string modInitials = "RCG";

		internal static Main instance;

		internal static ManualLogSource ModLogger;

		internal static AssetBundle assets;

		internal static GameObject blankCardPrefab;

		internal static Type RarityTextType;

		internal static Dictionary<string, float> ModRarities;

		private static Harmony harmony;

		private void Awake()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			instance = this;
			ModLogger = ((BaseUnityPlugin)this).Logger;
			harmony = new Harmony("com.aalund13.rounds.random_cards_generator");
			harmony.PatchAll();
			assets = AssetUtils.LoadAssetBundleFromResources("randomcardsgenerator_assets", typeof(Main).Assembly);
			blankCardPrefab = assets.LoadAsset<GameObject>("__RCG__BlankCard");
			Debug.Log("Random Cards Generator loaded!");
		}

		private void Start()
		{
			Cards.instance.AddCardValidationFunction((Func<Player, CardInfo, bool>)delegate(Player player, CardInfo card)
			{
				if (ToggleCard.ToggleCards.Any((ToggleCard c) => (Object)(object)c.toggleCardInfo == (Object)(object)card))
				{
					return false;
				}
				ToggleCard.IsCardEnabled(card);
				return true;
			});
			if (Chainloader.PluginInfos.TryGetValue("pykess.rounds.plugins.deckcustomization", out var value))
			{
				Assembly assembly = ((object)value.Instance).GetType().Assembly;
				RarityTextType = assembly.GetType("DeckCustomization.RarityText");
				ModRarities = (Dictionary<string, float>)assembly.GetType("DeckCustomization.DeckCustomization").GetField("ModRarities", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
				DeckCustomizationPatch.Patch(harmony, assembly);
			}
			Debug.Log("Random Cards Generator started!");
		}
	}
	internal static class GeneratedCardHolder
	{
		public static readonly Dictionary<string, List<GeneratedCardInfo>> GeneratedCardsMap = new Dictionary<string, List<GeneratedCardInfo>>();

		public static readonly List<GeneratedCardInfo> GeneratedCards = new List<GeneratedCardInfo>();

		public static List<GeneratedCardInfo> GetGeneratedCards(string statGenName)
		{
			if (GeneratedCardsMap.ContainsKey(statGenName))
			{
				return GeneratedCardsMap[statGenName];
			}
			return new List<GeneratedCardInfo>();
		}

		public static GeneratedCardInfo IsCardGenerated(CardInfo cardInfo)
		{
			return GeneratedCards.FirstOrDefault((GeneratedCardInfo c) => (Object)(object)c.CardInfo == (Object)(object)cardInfo);
		}

		public static void AddCardToGenerated(string statGenName, GeneratedCardInfo cardInfo)
		{
			if (GeneratedCardsMap.ContainsKey(statGenName))
			{
				GeneratedCardsMap[statGenName].Add(cardInfo);
			}
			else
			{
				GeneratedCardsMap.Add(statGenName, new List<GeneratedCardInfo> { cardInfo });
			}
			GeneratedCards.Add(cardInfo);
		}
	}
	public class ModRandomCardsGenerators
	{
		protected readonly Dictionary<string, RandomCardsGenerator> CardsGenerators = new Dictionary<string, RandomCardsGenerator>();

		public ModRandomCardsGenerators(List<RandomCardsGenerator> cardsGenerators)
		{
			foreach (RandomCardsGenerator cardsGenerator in cardsGenerators)
			{
				if (cardsGenerators == null || cardsGenerators.Count == 0)
				{
					throw new Exception("No handlers provided.");
				}
				if (CardsGenerators.ContainsKey(cardsGenerator.CardGenName))
				{
					throw new Exception("Handler for " + cardsGenerator.CardGenName + " already exists.");
				}
				CardsGenerators.Add(cardsGenerator.CardGenName, cardsGenerator);
			}
		}

		public void CreateRandomCard(string cardGenName, int seed, Player player = null)
		{
			GetHandler(cardGenName).CreateRandomCard(seed, player);
		}

		public void CreateRandomCard(string cardGenName, Player player = null)
		{
			GetHandler(cardGenName).CreateRandomCard(player);
		}

		public RandomCardsGenerator GetHandler(string statGenName)
		{
			return CardsGenerators[statGenName];
		}

		public IEnumerable<RandomCardsGenerator> GetAllHandlers()
		{
			return CardsGenerators.Values;
		}

		public void AddGenerator(string cardGenName, RandomCardsGenerator handler)
		{
			if (!CardsGenerators.ContainsKey(cardGenName))
			{
				CardsGenerators.Add(cardGenName, handler);
				return;
			}
			throw new Exception("Handler for " + cardGenName + " already exists.");
		}

		public void RemoveGenerator(string cardGenName)
		{
			if (CardsGenerators.ContainsKey(cardGenName))
			{
				CardsGenerators.Remove(cardGenName);
			}
		}
	}
	public class ModRandomCardsGenerators<T> : ModRandomCardsGenerators where T : Enum
	{
		protected readonly Dictionary<T, RandomCardsGenerator> TypedCardsGenerators = new Dictionary<T, RandomCardsGenerator>();

		public ModRandomCardsGenerators(Dictionary<T, RandomCardsGenerator> cardsGenerators)
			: base(new List<RandomCardsGenerator>(cardsGenerators.Values))
		{
			foreach (KeyValuePair<T, RandomCardsGenerator> cardsGenerator in cardsGenerators)
			{
				if (TypedCardsGenerators.ContainsKey(cardsGenerator.Key))
				{
					throw new Exception($"Handler for {cardsGenerator.Key} already exists.");
				}
				TypedCardsGenerators.Add(cardsGenerator.Key, cardsGenerator.Value);
			}
		}

		public void CreateRandomCard(T stats, int seed, Player player = null)
		{
			RandomCardsGenerator handler = GetHandler(stats);
			NetworkingManager.RaiseEvent($"{handler.CardGenName}_SyncEvent", new object[2]
			{
				seed,
				player?.playerID ?? (-1)
			});
		}

		public void CreateRandomCard(T stats, Player player = null)
		{
			RandomCardsGenerator handler = GetHandler(stats);
			int num = Random.Range(0, int.MaxValue);
			NetworkingManager.RaiseEvent($"{handler.CardGenName}_SyncEvent", new object[2]
			{
				num,
				player?.playerID ?? (-1)
			});
		}

		public RandomCardsGenerator GetHandler(T stat)
		{
			return TypedCardsGenerators[stat];
		}

		public void AddGenerator(T stat, RandomCardsGenerator handler)
		{
			if (!TypedCardsGenerators.ContainsKey(stat) && !CardsGenerators.ContainsKey(handler.CardGenName))
			{
				TypedCardsGenerators.Add(stat, handler);
				CardsGenerators.Add(handler.CardGenName, handler);
				return;
			}
			throw new Exception($"Handler for {stat} already exists or the handler is already registered with another stat generator.");
		}

		public void RemoveGenerator(T stat)
		{
			if (TypedCardsGenerators.ContainsKey(stat))
			{
				TypedCardsGenerators.Remove(stat);
				CardsGenerators.Remove(stat.ToString());
			}
		}
	}
	internal class DeckCustomizationPatch
	{
		public static void Patch(Harmony harmony, Assembly assembly)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			harmony.Patch((MethodBase)assembly.GetType("DeckCustomization.RarityUtils").GetMethod("GetRelativeRarity", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[1] { typeof(string) }, null), new HarmonyMethod(typeof(DeckCustomizationPatch), "GetRelativeRarityPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		public static bool GetRelativeRarityPrefix(string modName, ref float __result)
		{
			if (!Main.ModRarities.ContainsKey(modName))
			{
				__result = 0.5f;
				return false;
			}
			return true;
		}
	}
	public struct RandomStatInfo
	{
		public RandomStatGenerator StatGenerator;

		public float Value;

		public RandomStatInfo(RandomStatGenerator statGenerator, float value)
		{
			StatGenerator = statGenerator;
			Value = value;
		}

		public override string ToString()
		{
			return $"RandomStatInfo: {StatGenerator.StatName} | Value: {Value}";
		}
	}
	public struct RandomCardOption
	{
		public string CardName;

		public string ModInitials;

		public string CardDescription;

		public string TwoLetterCode;

		public Rarity CardRarity;

		public CardThemeColorType ColorTheme;

		public int Min;

		public int Max;

		public RandomCardOption(string cardName, string modInitials, string cardDescription, string twoLetterCode, int min, int max, Rarity cardRarity, CardThemeColorType colorTheme = 3)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//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_0028: Unknown result type (might be due to invalid IL or missing references)
			CardName = cardName;
			ModInitials = modInitials;
			CardDescription = cardDescription;
			TwoLetterCode = twoLetterCode;
			CardRarity = cardRarity;
			ColorTheme = colorTheme;
			Min = min;
			Max = max;
		}

		public override string ToString()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			return $"RandomCardOption: {CardName} | Rarity: {CardRarity} | ModInitials: {ModInitials} | Description: {CardDescription} | TwoLetterCode: {TwoLetterCode} | Min: {Min} | Max: {Max}";
		}
	}
	public struct GeneratedCardInfo
	{
		public RandomCardsGenerator RandomCardsGenerator;

		public CardInfo CardInfo;

		public RandomStatInfo[] RandomStatInfos;

		public Random Random;

		public int Seed;

		public bool HasValue
		{
			get
			{
				if (RandomCardsGenerator != null && (Object)(object)CardInfo != (Object)null && RandomStatInfos != null)
				{
					return RandomStatInfos.Length != 0;
				}
				return false;
			}
		}

		public GeneratedCardInfo(RandomCardsGenerator randomCardsGenerator, CardInfo cardInfo, RandomStatInfo[] randomStatInfos, Random random, int seed)
		{
			RandomCardsGenerator = randomCardsGenerator;
			CardInfo = cardInfo;
			RandomStatInfos = randomStatInfos;
			Random = random;
			Seed = seed;
		}

		public override string ToString()
		{
			return string.Format("GeneratedCardInfo: {0} | CardName: {1} | Seed: {2} | RandomStatInfos: {3}", RandomCardsGenerator.CardGenName, CardInfo.cardName, Seed, string.Join(", ", RandomStatInfos.Select((RandomStatInfo x) => x.StatGenerator.StatName)));
		}
	}
	public class RandomCardsGenerator
	{
		internal const string SYNC_EVENT_FORMAT = "{0}_SyncEvent";

		internal const string CARD_NAME_FORMAT = "{0} Card ({1})";

		internal static readonly Dictionary<string, RandomCardsGenerator> RandomStatCardGenerators = new Dictionary<string, RandomCardsGenerator>();

		public readonly Dictionary<int, GeneratedCardInfo> GeneratedCards = new Dictionary<int, GeneratedCardInfo>();

		public readonly List<RandomStatGenerator> StatGenerators;

		public readonly RandomCardOption RandomCardOption;

		public readonly string CardGenName;

		public Action<GeneratedCardInfo> OnCardGenerated;

		public RandomCardsGenerator(string cardGenName, RandomCardOption randomCardOption, List<RandomStatGenerator> statGenerators)
		{
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			RandomCardsGenerator randomCardsGenerator = this;
			if (RandomStatCardGenerators.ContainsKey(cardGenName))
			{
				throw new Exception("A RandomCardsGenerators with the name " + cardGenName + " already exists!");
			}
			if (string.IsNullOrEmpty(cardGenName) || string.IsNullOrWhiteSpace(cardGenName))
			{
				throw new Exception("Card generator name cannot be null or empty!");
			}
			string text = randomCardOption.ModInitials + "_" + ExtensionMethods.Sanitize(cardGenName, (string[])null);
			RandomStatCardGenerators.Add(text, this);
			RandomCardOption = randomCardOption;
			CardGenName = text;
			StatGenerators = statGenerators;
			NetworkingManager.RegisterEvent($"{cardGenName}_SyncEvent", (PhotonEvent)delegate(object[] data)
			{
				try
				{
					int seed = (int)data[0];
					int playerID = (int)data[1];
					Player player = PlayerManager.instance.players.Find((Player p) => p.playerID == playerID);
					randomCardsGenerator.GenerateRandomCard(seed, player);
				}
				catch (Exception arg)
				{
					LoggerUtils.LogError($"Error generating random stats for {cardGenName}: {arg}");
				}
			});
		}

		public void CreateRandomCard(int seed, Player player = null)
		{
			NetworkingManager.RaiseEvent($"{CardGenName}_SyncEvent", new object[2] { seed, player.playerID });
		}

		public void CreateRandomCard(Player player = null)
		{
			int num = Random.Range(0, int.MaxValue);
			NetworkingManager.RaiseEvent($"{CardGenName}_SyncEvent", new object[2] { num, player.playerID });
		}

		public GameObject GenerateRandomCard(int seed, Player player = null, Action<GeneratedCardInfo> onCardGenerated = null)
		{
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			if (GeneratedCards.ContainsKey(seed))
			{
				LoggerUtils.LogInfo($"Card with seed {seed} already generated for {CardGenName}. Returning existing card.");
				onCardGenerated?.Invoke(GeneratedCards[seed]);
				if ((Object)(object)player != (Object)null)
				{
					Cards.instance.AddCardToPlayer(player, GeneratedCards[seed].CardInfo, false, RandomCardOption.TwoLetterCode, 2f, 2f, true);
				}
				return ((Component)GeneratedCards[seed].CardInfo).gameObject;
			}
			GameObject obj = Object.Instantiate<GameObject>(Main.blankCardPrefab);
			Object.Destroy((Object)(object)((Component)obj.transform.GetChild(0)).gameObject);
			Object.DontDestroyOnLoad((Object)(object)obj);
			CardInfo component = obj.GetComponent<CardInfo>();
			BuiltRandomCard builtRandomCard = obj.AddComponent<BuiltRandomCard>();
			component.cardName = $"{CardGenName} Card ({GeneratedCardHolder.GetGeneratedCards(CardGenName).Count})";
			component.cardDestription = RandomCardOption.CardDescription;
			component.rarity = RandomCardOption.CardRarity;
			component.colorTheme = RandomCardOption.ColorTheme;
			Cards.instance.AddHiddenCard(component);
			Random random = new Random(seed);
			RandomStatInfo[] randomStatInfos = ApplyRandomStats(component, random);
			GeneratedCardInfo generatedCardInfo = new GeneratedCardInfo(this, component, randomStatInfos, random, seed);
			GeneratedCardHolder.AddCardToGenerated(CardGenName, generatedCardInfo);
			GeneratedCards[seed] = generatedCardInfo;
			((CustomCard)builtRandomCard).BuildUnityCard((Action<CardInfo>)delegate(CardInfo cardInfo)
			{
				if ((Object)(object)player != (Object)null)
				{
					ExtensionMethods.ExecuteAfterSeconds((MonoBehaviour)(object)Main.instance, 0.2f, (Action)delegate
					{
						Cards.instance.AddCardToPlayer(player, cardInfo, false, RandomCardOption.TwoLetterCode, 2f, 2f, true);
					});
				}
				LoggerUtils.LogInfo("Card built!");
			});
			((Object)obj).name = ExtensionMethods.Sanitize($"___RANDOM___{CardGenName}_({seed})", (string[])null);
			onCardGenerated?.Invoke(generatedCardInfo);
			Action<GeneratedCardInfo> onCardGenerated2 = OnCardGenerated;
			if (onCardGenerated2 != null)
			{
				onCardGenerated2(generatedCardInfo);
				return obj;
			}
			return obj;
		}

		public RandomStatInfo[] ApplyRandomStats(CardInfo cardInfo, Random random)
		{
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Expected O, but got Unknown
			BuiltRandomCard orAddComponent = ExtensionMethods.GetOrAddComponent<BuiltRandomCard>(((Component)cardInfo).gameObject, false);
			orAddComponent.CardName = RandomCardOption.CardName;
			orAddComponent.ModInitials = RandomCardOption.ModInitials;
			Gun component = ((Component)cardInfo).GetComponent<Gun>();
			CharacterStatModifiers component2 = ((Component)cardInfo).GetComponent<CharacterStatModifiers>();
			ApplyCardStats component3 = ((Component)cardInfo).GetComponent<ApplyCardStats>();
			Block component4 = ((Component)cardInfo).GetComponent<Block>();
			LoggerUtils.LogInfo("Generating random stats for " + cardInfo.cardName + "...");
			int num = Mathf.Max(0, RandomCardOption.Min);
			int max = Mathf.Clamp(RandomCardOption.Max, num, StatGenerators.Count);
			RandomStatInfo[] array = SelectRandomStats(random, num, max);
			cardInfo.cardStats = (CardInfoStat[])(object)new CardInfoStat[array.Length];
			for (int i = 0; i < array.Length; i++)
			{
				RandomStatInfo randomStatInfo = array[i];
				randomStatInfo.StatGenerator.Apply(randomStatInfo.Value, cardInfo, component, component3, component2, component4);
				cardInfo.cardStats[i] = new CardInfoStat
				{
					stat = randomStatInfo.StatGenerator.StatName,
					amount = randomStatInfo.StatGenerator.GetStatString(randomStatInfo.Value),
					positive = randomStatInfo.StatGenerator.IsPositive(randomStatInfo.Value)
				};
				LoggerUtils.LogInfo($"Applied stat {randomStatInfo.StatGenerator.StatName} with value {randomStatInfo.Value}.");
			}
			LoggerUtils.LogInfo($"Generated {array.Length} stats for {cardInfo.cardName}.");
			return array;
		}

		private RandomStatInfo[] SelectRandomStats(Random random, int min, int max)
		{
			LoggerUtils.LogInfo("Selecting random stats for " + CardGenName + "...");
			int num = Mathf.Clamp(min, 0, StatGenerators.Count);
			int num2 = Mathf.Clamp(max, num, StatGenerators.Count);
			int num3 = random.Next(num, num2 + 1);
			List<RandomStatGenerator> list = new List<RandomStatGenerator>(num3);
			RandomStatInfo[] array = new RandomStatInfo[num3];
			while (list.Count < num3)
			{
				int index = random.Next(StatGenerators.Count);
				if (!list.Contains(StatGenerators[index]))
				{
					float value = random.NextFloat(StatGenerators[index].MinValue, StatGenerators[index].MaxValue);
					if (StatGenerators[index].ShouldApply(value))
					{
						list.Add(StatGenerators[index]);
						array[list.Count - 1] = new RandomStatInfo(StatGenerators[index], value);
						LoggerUtils.LogInfo($"Selected stat {array[list.Count - 1].StatGenerator.StatName} with value {array[list.Count - 1].Value}.");
					}
				}
			}
			LoggerUtils.LogInfo($"Selected {list.Count} stats for {CardGenName}.");
			return array;
		}

		public override string ToString()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			return $"RandomCardsGenerator: {CardGenName} | CardName: {RandomCardOption.CardName} | Rarity: {RandomCardOption.CardRarity} | Min: {RandomCardOption.Min} | Max: {RandomCardOption.Max}";
		}
	}
	public abstract class RandomStatGenerator
	{
		public abstract string StatName { get; }

		public float MinValue { get; private set; }

		public float MaxValue { get; private set; }

		public RandomStatGenerator(float minValue, float maxValue)
		{
			MinValue = minValue;
			MaxValue = maxValue;
		}

		public abstract void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block);

		public virtual string GetStatString(float value)
		{
			return GetStringValue(value * 100f);
		}

		public abstract bool IsPositive(float value);

		public virtual bool ShouldApply(float value)
		{
			return value != 0f;
		}

		protected string GetStringValue(float value, bool isPercentage = true)
		{
			return string.Format("{0}{1}{2}", (value > 0f) ? "+" : "", Mathf.Round(value), isPercentage ? "%" : "");
		}
	}
}
namespace RandomCardsGenerators.Utils
{
	internal static class LoggerUtils
	{
		private const bool logging = false;

		public static void LogInfo(string message)
		{
		}

		public static void LogWarn(string message)
		{
			Main.ModLogger.LogWarning((object)message);
		}

		public static void LogError(string message)
		{
			Main.ModLogger.LogError((object)message);
		}
	}
	public class FindRandomCardsGeneratorResult
	{
		public readonly int Seed;

		public readonly RandomCardsGenerator RandomCardsGenerator;

		public FindRandomCardsGeneratorResult(int seed, RandomCardsGenerator randomCardsGenerator)
		{
			Seed = seed;
			RandomCardsGenerator = randomCardsGenerator;
		}
	}
	public static class RandomCardsUtils
	{
		public static Regex randomCardRegex = new Regex("^___RANDOM___(.*?)_(?:\\((\\d+)\\))?$", RegexOptions.Compiled);

		public static FindRandomCardsGeneratorResult FindRandomCardsGeneratorByName(string cardName)
		{
			Match match = randomCardRegex.Match(cardName);
			if (match.Success)
			{
				string generatorName = match.Groups[1].Value;
				if (match.Groups.Count <= 2 || !int.TryParse(match.Groups[2].Value, out var result))
				{
					return null;
				}
				int seed = result;
				RandomCardsGenerator value = RandomCardsGenerator.RandomStatCardGenerators.FirstOrDefault((KeyValuePair<string, RandomCardsGenerator> r) => r.Key == generatorName).Value;
				if (value != null)
				{
					return new FindRandomCardsGeneratorResult(seed, value);
				}
			}
			return null;
		}
	}
	public static class RandomStatsUtils
	{
		public static float ScaleStatByIntensity(float intensity, float baseValue = 1f)
		{
			return baseValue / 2f / (1f - intensity);
		}
	}
}
namespace RandomCardsGenerators.StatsGroup
{
	public class HealthStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Health";

		public HealthStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.health += value;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class SizeStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Size";

		public SizeStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.sizeMultiplier += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class DamageStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Damage";

		public DamageStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.damage += value;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class ReloadTimeStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Reload Time";

		public ReloadTimeStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.reloadTime += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class AttackSpeedStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Attack Speed";

		public AttackSpeedStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.attackSpeed += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class MovementSpeedStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Movement Speed";

		public MovementSpeedStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.movementSpeed += value;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class BlockCooldownStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Block Cooldown";

		public BlockCooldownStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.025f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			block.cdMultiplier += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class BulletSpeedStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Bullet Speed";

		public BulletSpeedStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.projectileSpeed += value;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class RegenStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Regen";

		public RegenStatGenerator(float minValue, float maxValue, float thresholdToZero = 1f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.regen += value;
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(value, isPercentage: false);
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class SpreadStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Spread";

		public SpreadStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.spread += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class DragStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Drag";

		public DragStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.drag += value;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class LifeSteelStatGenerator : RandomStatGenerator
	{
		public float ThresholdToZero;

		public override string StatName => "Life Steal";

		public LifeSteelStatGenerator(float minValue, float maxValue, float thresholdToZero = 0.05f)
			: base(minValue, maxValue)
		{
			ThresholdToZero = thresholdToZero;
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= ThresholdToZero;
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.lifeSteal += value;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class ReloadTimeSecondStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Reload Time";

		public ReloadTimeSecondStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.reloadTimeAdd += value;
		}

		public override string GetStatString(float value)
		{
			return string.Format("{0}{1:F2}s", (value > 0f) ? "+" : "", value);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= 0.05f;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class BlockCooldownSecondStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Block Cooldown";

		public BlockCooldownSecondStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			block.cdAdd += value;
		}

		public override string GetStatString(float value)
		{
			return string.Format("{0}{1:F2}s", (value > 0f) ? "+" : "", value);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.Abs(value) >= 0.05f;
		}

		public override bool IsPositive(float value)
		{
			return value < 0f;
		}
	}
	public class NumberOfProjectilesStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Number of Projectiles";

		public NumberOfProjectilesStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.numberOfProjectiles += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(Mathf.RoundToInt(value), isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class BouncesStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Bounces";

		public BouncesStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.reflects += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(Mathf.RoundToInt(value), isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class AmmoStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Ammo";

		public AmmoStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.ammo += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(value, isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class AdditionalBlocksStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Additiona Block";

		public AdditionalBlocksStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			block.additionalBlocks += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(value, isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class ExtraLiveStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Extra Live";

		public ExtraLiveStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.respawns += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(value, isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
	public class JumpStatGenerator : RandomStatGenerator
	{
		public override string StatName => "Jump";

		public JumpStatGenerator(float minValue, float maxValue)
			: base(minValue, maxValue)
		{
		}

		public override void Apply(float value, CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.numberOfJumps += Mathf.RoundToInt(value);
		}

		public override string GetStatString(float value)
		{
			return GetStringValue(value, isPercentage: false);
		}

		public override bool ShouldApply(float value)
		{
			return Mathf.RoundToInt(value) != 0;
		}

		public override bool IsPositive(float value)
		{
			return value > 0f;
		}
	}
}
namespace RandomCardsGenerators.Patches
{
	[HarmonyPatch]
	public class RandomCardSpawningPatches
	{
		[HarmonyPatch(typeof(CardChoice), "SpawnUniqueCard")]
		private class SpawnUniqueCardPatch
		{
			public static bool PickPhaseCardSpawning;

			[HarmonyPriority(800)]
			private static void Prefix()
			{
				PickPhaseCardSpawning = true;
			}

			[HarmonyPriority(800)]
			private static void Postfix()
			{
				PickPhaseCardSpawning = false;
			}
		}

		[HarmonyPatch(typeof(CardChoice), "Spawn")]
		[HarmonyPriority(0)]
		[HarmonyPrefix]
		private static bool Spawn(GameObject objToSpawn, Vector3 pos, Quaternion rot, ref GameObject __result)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)objToSpawn != (Object)null && (Object)(object)objToSpawn.GetComponent<RandomCard>() != (Object)null)
			{
				__result = PhotonNetwork.Instantiate(((Object)objToSpawn).name, pos, rot, (byte)0, new object[1] { DrawableRandomCard.random.Next(int.MaxValue) });
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(Cards), "AddCardToPlayer", new Type[]
		{
			typeof(Player),
			typeof(CardInfo),
			typeof(bool),
			typeof(string),
			typeof(float),
			typeof(float),
			typeof(bool)
		})]
		[HarmonyPrefix]
		private static bool AddRandomCardToPlayer(Player player, CardInfo card)
		{
			if ((Object)(object)((Component)card).GetComponent<ToggleCustomCard>() != (Object)null && (PhotonNetwork.OfflineMode || PhotonNetwork.IsMasterClient))
			{
				foreach (NormalDrawableRandomCard normalDrawableCard in NormalDrawableRandomCard.NormalDrawableCards)
				{
					if (normalDrawableCard.ToggleCard != null && (Object)(object)normalDrawableCard.ToggleCard.toggleCardInfo == (Object)(object)card)
					{
						normalDrawableCard.StatCardGenerator.CreateRandomCard(player);
						return false;
					}
				}
			}
			return true;
		}

		[HarmonyPatch(typeof(Cards), "RPCA_AssignCard", new Type[]
		{
			typeof(string),
			typeof(int),
			typeof(bool),
			typeof(string),
			typeof(float),
			typeof(float),
			typeof(bool)
		})]
		[HarmonyPrefix]
		public static void AssignRandomCardRPC(string cardObjectName, int playerID, bool reassign, string twoLetterCode, float forceDisplay, float forceDisplayDelay, bool addToCardBar)
		{
			FindRandomCardsGeneratorResult findRandomCardsGeneratorResult = RandomCardsUtils.FindRandomCardsGeneratorByName(cardObjectName);
			if (findRandomCardsGeneratorResult != null)
			{
				PlayerManager.instance.players.Find((Player p) => p.playerID == playerID);
				findRandomCardsGeneratorResult.RandomCardsGenerator.GenerateRandomCard(findRandomCardsGeneratorResult.Seed);
			}
		}

		[HarmonyPatch(typeof(CardChoicePatchGetRanomCard), "OrignialGetRanomCard", new Type[] { typeof(CardInfo[]) })]
		[HarmonyPrefix]
		private static void NormalDrawableCardsSpawn(ref CardInfo[] cards)
		{
			if (!SpawnUniqueCardPatch.PickPhaseCardSpawning)
			{
				return;
			}
			List<CardInfo> list = new List<CardInfo>(cards);
			foreach (NormalDrawableRandomCard normalDrawableCard in NormalDrawableRandomCard.NormalDrawableCards)
			{
				list.Add(normalDrawableCard.CardInfo);
			}
			cards = list.ToArray();
		}

		[HarmonyPatch(typeof(CardManager), "GetCardInfoWithName")]
		[HarmonyPostfix]
		public static void GetRandomCardInfoWithName(string cardName, ref CardInfo __result)
		{
			FindRandomCardsGeneratorResult findRandomCardsGeneratorResult = RandomCardsUtils.FindRandomCardsGeneratorByName(cardName);
			if (findRandomCardsGeneratorResult != null)
			{
				__result = findRandomCardsGeneratorResult.RandomCardsGenerator.GenerateRandomCard(findRandomCardsGeneratorResult.Seed).GetComponent<CardInfo>();
			}
		}
	}
}
namespace RandomCardsGenerators.Extensions
{
	public static class RandomExtension
	{
		public static float NextFloat(this Random random, float minValue, float maxValue)
		{
			return (float)random.NextDouble() * (maxValue - minValue) + minValue;
		}
	}
}
namespace RandomCardsGenerators.Cards
{
	internal class BuiltRandomCard : CustomCard
	{
		public string ModInitials;

		public string CardName;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)this, 1, (Action)delegate
			{
				TextMeshProUGUI[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren<TextMeshProUGUI>();
				if (componentsInChildren.Length != 0)
				{
					((TMP_Text)((Component)componentsInChildren.Where((TextMeshProUGUI obj) => ((Object)((Component)obj).gameObject).name == "Text_Name").FirstOrDefault()).GetComponent<TextMeshProUGUI>()).text = CardName;
				}
			});
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
		}

		public override bool GetEnabled()
		{
			return false;
		}

		protected override GameObject GetCardArt()
		{
			return base.cardInfo.cardArt;
		}

		protected override string GetDescription()
		{
			return base.cardInfo.cardDestription;
		}

		protected override Rarity GetRarity()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return base.cardInfo.rarity;
		}

		protected override CardInfoStat[] GetStats()
		{
			return base.cardInfo.cardStats;
		}

		protected override CardThemeColorType GetTheme()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return base.cardInfo.colorTheme;
		}

		protected override string GetTitle()
		{
			return base.cardInfo.cardName;
		}

		public override string GetModName()
		{
			return ModInitials;
		}
	}
	public class DrawableRandomCard
	{
		internal static List<DrawableRandomCard> DrawableCards = new List<DrawableRandomCard>();

		internal static readonly Random random = new Random();

		public readonly RandomCardsGenerator StatCardGenerator;

		public readonly GameObject CardGameObject;

		public readonly CardInfo CardInfo;

		public DrawableRandomCard(RandomCardsGenerator statCardGenerator)
		{
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(Main.blankCardPrefab);
			((Object)val).name = "__" + statCardGenerator.RandomCardOption.ModInitials + "__" + statCardGenerator.CardGenName + "_DrawableCard";
			Object.Destroy((Object)(object)((Component)val.transform.GetChild(0)).gameObject);
			Object.DontDestroyOnLoad((Object)(object)val);
			RandomCard randomCard = val.AddComponent<RandomCard>();
			CardInfo = val.GetComponent<CardInfo>();
			CardInfo.cardBase = Main.blankCardPrefab.GetComponent<CardInfo>().cardBase;
			CardInfo.rarity = statCardGenerator.RandomCardOption.CardRarity;
			CardInfo.cardName = statCardGenerator.RandomCardOption.CardName;
			CardInfo.cardDestription = statCardGenerator.RandomCardOption.CardDescription;
			CardInfo.colorTheme = statCardGenerator.RandomCardOption.ColorTheme;
			randomCard.StatGenName = statCardGenerator.CardGenName;
			PhotonNetwork.PrefabPool.RegisterPrefab(((Object)val).name, val);
			CardGameObject = val;
			StatCardGenerator = statCardGenerator;
			DrawableCards.Add(this);
		}

		public GameObject InstantiateCard(Vector3 position, Quaternion rotation, int seed, Vector3 localScale)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			return PhotonNetwork.Instantiate(((Object)CardGameObject).name, position, rotation, (byte)0, new object[2] { seed, localScale });
		}

		public GameObject ReplaceCard(CardInfo cardInfo)
		{
			//IL_0030: 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_005f: Unknown result type (might be due to invalid IL or missing references)
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)Main.instance, 3, (Action)delegate
			{
				PhotonNetwork.Destroy(((Component)cardInfo).gameObject);
			});
			return InstantiateCard(((Component)cardInfo).transform.position, ((Component)cardInfo).transform.rotation, random.Next(int.MaxValue), ((Component)cardInfo).transform.localScale);
		}
	}
	public class RandomCard : MonoBehaviour, IPunInstantiateMagicCallback
	{
		public string StatGenName;

		public bool IsInstantiate;

		public void OnPhotonInstantiate(PhotonMessageInfo info)
		{
			//IL_0000: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			object[] instantiationData = info.photonView.InstantiationData;
			if (instantiationData != null)
			{
				int num = (int)instantiationData[0];
				if (instantiationData.Length > 1 && instantiationData[1] is Vector3)
				{
					Vector3 localScale = (Vector3)instantiationData[1];
					((Component)this).gameObject.transform.localScale = localScale;
				}
				LoggerUtils.LogInfo($"Generating generatedRandom generatedCardInfo with seed {num} using stat generator {StatGenName}");
				if (RandomCardsGenerator.RandomStatCardGenerators.TryGetValue(StatGenName, out var value))
				{
					GenerateCard(value, num);
				}
				else
				{
					LoggerUtils.LogError("Stat generator " + StatGenName + " does not exist.");
				}
				IsInstantiate = true;
			}
		}

		private void GenerateCard(RandomCardsGenerator generator, int seed)
		{
			CardInfo cardInfo = ((Component)this).GetComponent<CardInfo>();
			generator.GenerateRandomCard(seed, null, delegate(GeneratedCardInfo generatedCardInfo)
			{
				LoggerUtils.LogInfo($"CardGenerator: {generator}");
				LoggerUtils.LogInfo($"GeneratedCardInfo: {generatedCardInfo}");
				GeneratedCardInfo obj = new GeneratedCardInfo(generator, cardInfo, generatedCardInfo.RandomStatInfos, generatedCardInfo.Random, seed);
				CardInfoStat[] cardStats = generatedCardInfo.CardInfo.cardStats;
				Random random = new Random(seed);
				generator.ApplyRandomStats(cardInfo, random);
				LoggerUtils.LogInfo($"Applied {cardStats.Length} stats to toggleCardInfo {cardInfo.cardName}.");
				cardInfo.sourceCard = generatedCardInfo.CardInfo;
				cardInfo.cardStats = cardStats;
				generatedCardInfo.RandomCardsGenerator.OnCardGenerated?.Invoke(obj);
				((Component)this).gameObject.GetComponentInChildren<CardInfoDisplayer>().DrawCard(cardStats, generator.RandomCardOption.CardName, generator.RandomCardOption.CardDescription, (Sprite)null, false);
				LoggerUtils.LogInfo($"Card {cardInfo.cardName} displayed with {cardStats.Length} stats.");
				if (Main.RarityTextType != null)
				{
					((Component)this).gameObject.AddComponent(Main.RarityTextType);
				}
			});
		}
	}
	public class NormalDrawableRandomCard : DrawableRandomCard
	{
		public static List<NormalDrawableRandomCard> NormalDrawableCards = new List<NormalDrawableRandomCard>();

		public ToggleCard ToggleCard;

		public NormalDrawableRandomCard(RandomCardsGenerator statCardGenerator, bool createToggleCard = true)
			: base(statCardGenerator)
		{
			//IL_0036: 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 (createToggleCard)
			{
				RandomCardOption randomCardOption = statCardGenerator.RandomCardOption;
				ToggleCard = new ToggleCard(new List<CardInfo> { CardInfo }, randomCardOption.CardName, randomCardOption.CardDescription, randomCardOption.ModInitials, randomCardOption.ColorTheme);
				ToggleCard.toggleCardInfo.rarity = randomCardOption.CardRarity;
			}
			NormalDrawableCards.Add(this);
		}
	}
	public class ToggleCard
	{
		internal static readonly List<ToggleCard> ToggleCards = new List<ToggleCard>();

		public readonly CardInfo toggleCardInfo;

		public List<CardInfo> cardsInToggle = new List<CardInfo>();

		public bool IsEnabled
		{
			get
			{
				if ((Object)(object)toggleCardInfo != (Object)null)
				{
					return CardManager.IsCardActive(toggleCardInfo);
				}
				return false;
			}
		}

		public ToggleCard(List<CardInfo> cards, string cardName, string cardDescription, string modInitials, CardThemeColorType colorTheme = 3)
		{
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = Object.Instantiate<GameObject>(Main.blankCardPrefab);
			Object.Destroy((Object)(object)((Component)obj.transform.GetChild(0)).gameObject);
			Object.DontDestroyOnLoad((Object)(object)obj);
			CardInfo component = obj.GetComponent<CardInfo>();
			ToggleCustomCard toggleCustomCard = obj.AddComponent<ToggleCustomCard>();
			component.cardName = cardName;
			component.cardDestription = cardDescription;
			component.cardBase = Main.blankCardPrefab.GetComponent<CardInfo>().cardBase;
			component.rarity = (Rarity)0;
			component.colorTheme = colorTheme;
			toggleCustomCard.ModInitials = modInitials;
			((CustomCard)toggleCustomCard).RegisterUnityCard((Action<CardInfo>)delegate
			{
				LoggerUtils.LogInfo("Register toggle card " + cardName + " with description: " + cardDescription + " and mod initials: " + modInitials);
			});
			cardsInToggle = cards;
			ToggleCards.Add(this);
			toggleCardInfo = component;
		}

		public bool IsCardEnabledInstance(CardInfo cardInfo)
		{
			if ((Object)(object)cardInfo == (Object)null)
			{
				return false;
			}
			CardInfo val = cardInfo;
			if ((Object)(object)val.sourceCard != (Object)null)
			{
				val = val.sourceCard;
			}
			if (cardsInToggle.Contains(val))
			{
				return IsEnabled;
			}
			return true;
		}

		public static bool IsCardEnabled(CardInfo cardInfo)
		{
			CardInfo val = cardInfo;
			if ((Object)(object)val.sourceCard != (Object)null)
			{
				val = val.sourceCard;
			}
			foreach (ToggleCard toggleCard in ToggleCards)
			{
				if (!toggleCard.IsCardEnabledInstance(val))
				{
					return false;
				}
			}
			return true;
		}
	}
	internal class ToggleCustomCard : CustomCard
	{
		public string ModInitials;

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
		}

		protected override GameObject GetCardArt()
		{
			return base.cardInfo.cardArt;
		}

		protected override string GetDescription()
		{
			return base.cardInfo.cardDestription;
		}

		protected override Rarity GetRarity()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return base.cardInfo.rarity;
		}

		protected override CardInfoStat[] GetStats()
		{
			return base.cardInfo.cardStats;
		}

		protected override CardThemeColorType GetTheme()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return base.cardInfo.colorTheme;
		}

		protected override string GetTitle()
		{
			return base.cardInfo.cardName;
		}

		public override string GetModName()
		{
			return ModInitials;
		}
	}
}