Decompiled source of NiuglMegaCards v2.7.0

plugins\NiuglMegaCards\RoundsCardRerollMod.dll

Decompiled 6 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnboundLib.Cards;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("RoundsCardRerollMod")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RoundsCardRerollMod")]
[assembly: AssemblyTitle("RoundsCardRerollMod")]
[assembly: AssemblyVersion("1.0.0.0")]
[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 RoundsCardRerollMod
{
	[BepInPlugin("com.tobia.rounds.megacards", "Niugl Mega Cards", "2.7.0")]
	public class MegaCardsPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private sealed class <Start>d__4 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public MegaCardsPlugin <>4__this;

			private int <ticks>5__2;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <Start>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				int num = <>1__state;
				MegaCardsPlugin megaCardsPlugin = <>4__this;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
				}
				else
				{
					<>1__state = -1;
					((BaseUnityPlugin)megaCardsPlugin).Logger.LogInfo((object)"Niugl Mega Cards loading...");
					<ticks>5__2 = 0;
				}
				if (CardVisualFactory.TryInitialize(((BaseUnityPlugin)megaCardsPlugin).Logger))
				{
					CardRegistry.RegisterAll(((BaseUnityPlugin)megaCardsPlugin).Logger);
					return false;
				}
				<ticks>5__2++;
				if (<ticks>5__2 % 300 == 0)
				{
					((BaseUnityPlugin)megaCardsPlugin).Logger.LogInfo((object)"Waiting for card templates...");
				}
				<>2__current = null;
				<>1__state = 1;
				return true;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public const string ModId = "com.tobia.rounds.megacards";

		public const string ModName = "Niugl Mega Cards";

		public const string ModVersion = "2.7.0";

		private void Awake()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			new Harmony("com.tobia.rounds.megacards").PatchAll();
		}

		[IteratorStateMachine(typeof(<Start>d__4))]
		private IEnumerator Start()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <Start>d__4(0)
			{
				<>4__this = this
			};
		}
	}
	internal static class CardRegistry
	{
		private static bool _registered;

		public static void RegisterAll(ManualLogSource logger)
		{
			if (!_registered)
			{
				MethodInfo methodInfo = typeof(CustomCard).GetMethods(BindingFlags.Static | BindingFlags.Public).First((MethodInfo m) => m.Name == "BuildCard" && m.IsGenericMethodDefinition && m.GetParameters().Length == 0);
				Type[] all = CardTypeList.All;
				foreach (Type type in all)
				{
					methodInfo.MakeGenericMethod(type).Invoke(null, null);
				}
				_registered = true;
				logger.LogInfo((object)$"Registered {CardTypeList.All.Length} custom cards.");
			}
		}
	}
	internal static class CardAvailabilityGate
	{
		public static bool IsEnabled(int index)
		{
			return true;
		}

		public static bool IsUltraRareIndex(int index)
		{
			if (index >= 131)
			{
				return index <= 180;
			}
			return false;
		}

		public static bool TryGetGeneratedIndex(GameObject cardObject, out int index)
		{
			index = -1;
			CardInfo val = (((Object)(object)cardObject != (Object)null) ? cardObject.GetComponent<CardInfo>() : null);
			string text = (((Object)(object)val != (Object)null) ? val.cardName : null);
			if (string.IsNullOrEmpty(text))
			{
				return false;
			}
			int num = text.LastIndexOf('#');
			if (num < 0 || num >= text.Length - 1)
			{
				return false;
			}
			return int.TryParse(text.Substring(num + 1).Trim(), out index);
		}
	}
	internal static class CardVisualFactory
	{
		private static bool _ready;

		private static GameObject _templateArt;

		private static GameObject _templateBase;

		public static GameObject CardBase => _templateBase;

		public static bool TryInitialize(ManualLogSource logger)
		{
			if (_ready)
			{
				return true;
			}
			CardInfo[] allCards = GetAllCards();
			if (allCards == null || allCards.Length == 0)
			{
				return false;
			}
			CardInfo val = ((IEnumerable<CardInfo>)allCards).FirstOrDefault((Func<CardInfo, bool>)((CardInfo c) => (Object)(object)c != (Object)null && (Object)(object)c.cardArt != (Object)null && (Object)(object)c.cardBase != (Object)null));
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			_templateArt = val.cardArt;
			_templateBase = val.cardBase;
			if ((Object)(object)_templateArt == (Object)null || (Object)(object)_templateBase == (Object)null)
			{
				return false;
			}
			_ready = true;
			logger.LogInfo((object)"Card visual templates initialized.");
			return true;
		}

		public static GameObject CreateArtVariant(int index)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			if (_ready && !((Object)(object)_templateArt == (Object)null))
			{
				GameObject obj = Object.Instantiate<GameObject>(_templateArt);
				((Object)obj).name = $"NiuglArt_{index:000}";
				Color tint = ColorFor(index);
				TintObject(obj, tint);
				LabelObject(obj, index);
				return obj;
			}
			return new GameObject($"NiuglArtFallback{index:000}");
		}

		private static CardInfo[] GetAllCards()
		{
			CardInfo[] array = Resources.FindObjectsOfTypeAll<CardInfo>();
			if (array != null && array.Length != 0)
			{
				return array;
			}
			return Array.Empty<CardInfo>();
		}

		private static Color ColorFor(int index)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			return Color.HSVToRGB((float)(index % 100) / 100f, 0.35f, 1f);
		}

		private static void TintObject(GameObject root, Color tint)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: 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)
			Component[] componentsInChildren = root.GetComponentsInChildren<Component>(true);
			foreach (Component val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				PropertyInfo property = ((object)val).GetType().GetProperty("color", BindingFlags.Instance | BindingFlags.Public);
				if (property != null && property.CanRead && property.CanWrite && property.PropertyType == typeof(Color))
				{
					try
					{
						Color val2 = Color.Lerp((Color)property.GetValue(val, null), tint, 0.25f);
						property.SetValue(val, val2, null);
					}
					catch
					{
					}
				}
			}
		}

		private static void LabelObject(GameObject root, int index)
		{
			Component[] componentsInChildren = root.GetComponentsInChildren<Component>(true);
			foreach (Component val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				PropertyInfo property = ((object)val).GetType().GetProperty("text", BindingFlags.Instance | BindingFlags.Public);
				if (property != null && property.CanWrite && property.PropertyType == typeof(string))
				{
					try
					{
						property.SetValue(val, $"N-{index:000}", null);
						break;
					}
					catch
					{
					}
				}
			}
		}
	}
	internal static class CardTypeList
	{
		public static readonly Type[] All = new Type[210]
		{
			typeof(Card001),
			typeof(Card002),
			typeof(Card003),
			typeof(Card004),
			typeof(Card005),
			typeof(Card006),
			typeof(Card007),
			typeof(Card008),
			typeof(Card009),
			typeof(Card010),
			typeof(Card011),
			typeof(Card012),
			typeof(Card013),
			typeof(Card014),
			typeof(Card015),
			typeof(Card016),
			typeof(Card017),
			typeof(Card018),
			typeof(Card019),
			typeof(Card020),
			typeof(Card021),
			typeof(Card022),
			typeof(Card023),
			typeof(Card024),
			typeof(Card025),
			typeof(Card026),
			typeof(Card027),
			typeof(Card028),
			typeof(Card029),
			typeof(Card030),
			typeof(Card031),
			typeof(Card032),
			typeof(Card033),
			typeof(Card034),
			typeof(Card035),
			typeof(Card036),
			typeof(Card037),
			typeof(Card038),
			typeof(Card039),
			typeof(Card040),
			typeof(Card041),
			typeof(Card042),
			typeof(Card043),
			typeof(Card044),
			typeof(Card045),
			typeof(Card046),
			typeof(Card047),
			typeof(Card048),
			typeof(Card049),
			typeof(Card050),
			typeof(Card051),
			typeof(Card052),
			typeof(Card053),
			typeof(Card054),
			typeof(Card055),
			typeof(Card056),
			typeof(Card057),
			typeof(Card058),
			typeof(Card059),
			typeof(Card060),
			typeof(Card061),
			typeof(Card062),
			typeof(Card063),
			typeof(Card064),
			typeof(Card065),
			typeof(Card066),
			typeof(Card067),
			typeof(Card068),
			typeof(Card069),
			typeof(Card070),
			typeof(Card071),
			typeof(Card072),
			typeof(Card073),
			typeof(Card074),
			typeof(Card075),
			typeof(Card076),
			typeof(Card077),
			typeof(Card078),
			typeof(Card079),
			typeof(Card080),
			typeof(Card081),
			typeof(Card082),
			typeof(Card083),
			typeof(Card084),
			typeof(Card085),
			typeof(Card086),
			typeof(Card087),
			typeof(Card088),
			typeof(Card089),
			typeof(Card090),
			typeof(Card091),
			typeof(Card092),
			typeof(Card093),
			typeof(Card094),
			typeof(Card095),
			typeof(Card096),
			typeof(Card097),
			typeof(Card098),
			typeof(Card099),
			typeof(Card100),
			typeof(Card101),
			typeof(Card102),
			typeof(Card103),
			typeof(Card104),
			typeof(Card105),
			typeof(Card106),
			typeof(Card107),
			typeof(Card108),
			typeof(Card109),
			typeof(Card110),
			typeof(Card111),
			typeof(Card112),
			typeof(Card113),
			typeof(Card114),
			typeof(Card115),
			typeof(Card116),
			typeof(Card117),
			typeof(Card118),
			typeof(Card119),
			typeof(Card120),
			typeof(Card121),
			typeof(Card122),
			typeof(Card123),
			typeof(Card124),
			typeof(Card125),
			typeof(Card126),
			typeof(Card127),
			typeof(Card128),
			typeof(Card129),
			typeof(Card130),
			typeof(Card131),
			typeof(Card132),
			typeof(Card133),
			typeof(Card134),
			typeof(Card135),
			typeof(Card136),
			typeof(Card137),
			typeof(Card138),
			typeof(Card139),
			typeof(Card140),
			typeof(Card141),
			typeof(Card142),
			typeof(Card143),
			typeof(Card144),
			typeof(Card145),
			typeof(Card146),
			typeof(Card147),
			typeof(Card148),
			typeof(Card149),
			typeof(Card150),
			typeof(Card151),
			typeof(Card152),
			typeof(Card153),
			typeof(Card154),
			typeof(Card155),
			typeof(Card156),
			typeof(Card157),
			typeof(Card158),
			typeof(Card159),
			typeof(Card160),
			typeof(Card161),
			typeof(Card162),
			typeof(Card163),
			typeof(Card164),
			typeof(Card165),
			typeof(Card166),
			typeof(Card167),
			typeof(Card168),
			typeof(Card169),
			typeof(Card170),
			typeof(Card171),
			typeof(Card172),
			typeof(Card173),
			typeof(Card174),
			typeof(Card175),
			typeof(Card176),
			typeof(Card177),
			typeof(Card178),
			typeof(Card179),
			typeof(Card180),
			typeof(Card181),
			typeof(Card182),
			typeof(Card183),
			typeof(Card184),
			typeof(Card185),
			typeof(Card186),
			typeof(Card187),
			typeof(Card188),
			typeof(Card189),
			typeof(Card190),
			typeof(Card191),
			typeof(Card192),
			typeof(Card193),
			typeof(Card194),
			typeof(Card195),
			typeof(Card196),
			typeof(Card197),
			typeof(Card198),
			typeof(Card199),
			typeof(Card200),
			typeof(Card201),
			typeof(Card202),
			typeof(Card203),
			typeof(Card204),
			typeof(Card205),
			typeof(Card206),
			typeof(Card207),
			typeof(Card208),
			typeof(Card209),
			typeof(Card210)
		};
	}
	internal enum SpecialMode
	{
		None,
		CoinFlip,
		TinyBullets,
		BigBullets,
		HyperJump,
		HeavyBoots,
		StatLottery,
		GravityFlip,
		GlassOverdrive,
		TankMode,
		ChaosGift,
		VampBurst,
		MomentumRush,
		AmmoForge,
		PhaseStep,
		Reversal,
		RicochetDance,
		BerserkerCore,
		SniperStance,
		CloseQuarters,
		BlinkStep,
		Overclock,
		FrostCore,
		InfernalTrade,
		AeroGlass,
		AnchorHeart,
		DiceAmmo,
		TwinPulse,
		LastStand,
		FeatherFall,
		IronSkin,
		BloodTax,
		TurboBlock,
		StaticCharge,
		LongGame,
		WildMagic,
		QuantumFlux,
		ProbabilityStorm,
		RealityWarp,
		LuckyDraw,
		ChaoticMerge,
		OverdriveLottery,
		QuantumTangle,
		VortexSwap,
		InfinityStone,
		PrimalChaosShift,
		RocketFuse,
		BlastCore,
		WallPiercer,
		GhostRounds,
		RicochetEngine,
		PinballShells,
		PortalShot,
		BunkerBuster,
		ScatterMissiles,
		PhaseRocket,
		DrillRounds,
		SiegePayload,
		ShrapnelBurst,
		MeteorShells,
		EchoWarp,
		AegisField,
		ShockRing,
		ReloadCache,
		MedicPulse,
		WarpStepBlock,
		GravityBubble,
		MirrorShell,
		GhostScreen,
		SiegeReserve,
		ShrapnelGuard,
		OverhealDrive,
		NovaBrake,
		ForceWall,
		RicochetWard,
		PhaseBattery,
		RerollSomeAllPlayers,
		RerollSomeOwnCards,
		RerollAllOwnCards,
		RerollAllPlayersCards,
		RerollHalfOwnCards,
		RerollHalfAllPlayers,
		RerollOneEachPlayer,
		RerollTwoOwnCards,
		RerollTwoEachPlayer,
		RerollAllOthers
	}
	internal sealed class CardSpec
	{
		public string Title;

		public string Description;

		public Rarity Rarity;

		public CardThemeColorType Theme;

		public float DamageMult = 1f;

		public float AttackSpeedMult = 1f;

		public float ReloadTimeMult = 1f;

		public float ProjectileSpeedMult = 1f;

		public float AmmoMult = 1f;

		public float HealthMult = 1f;

		public float MoveSpeedMult = 1f;

		public float GravityMult = 1f;

		public float BlockCooldownMult = 1f;

		public SpecialMode Special;

		public bool UseDamage;

		public bool UseAttackSpeed;

		public bool UseReload;

		public bool UseProjectileSpeed;

		public bool UseAmmo;

		public bool UseHealth;

		public bool UseMoveSpeed;

		public bool UseGravity;

		public bool UseBlockCooldown;
	}
	internal static class CardSpecFactory
	{
		private static readonly string[] Prefixes = new string[20]
		{
			"Turbo", "Cursed", "Lucky", "Greedy", "Bouncy", "Sneaky", "Wild", "Spicy", "Ancient", "Chaotic",
			"Sticky", "Shiny", "Fragile", "Heavy", "Elastic", "Rocket", "Noisy", "Sleepy", "Wizard", "Glitch"
		};

		private static readonly string[] Suffixes = new string[20]
		{
			"Banana", "Anvil", "Peashooter", "Boomstick", "Sandwich", "Laser", "Socks", "Meteor", "Toaster", "Mushroom",
			"Trombone", "Cannon", "Pogo", "Pillow", "Blaster", "Pickle", "Comet", "Meme", "Duck", "Wrench"
		};

		private static readonly string[] BlockPrefixes = new string[10] { "Guard", "Ward", "Anchor", "Echo", "Bastion", "Mirror", "Pulse", "Barrier", "Vault", "Phase" };

		private static readonly string[] BlockSuffixes = new string[10] { "Core", "Shell", "Wall", "Loop", "Screen", "Field", "Node", "Burst", "Aegis", "Brake" };

		private static readonly string[] RerollPrefixes = new string[10] { "Reroll", "Shuffle", "Chaos", "Draft", "Deck", "Meta", "Spin", "Swap", "Remix", "Reset" };

		private static readonly string[] RerollSuffixes = new string[10] { "Protocol", "Engine", "Signal", "Pulse", "Matrix", "Storm", "Drive", "Circuit", "Node", "Burst" };

		private static readonly SpecialMode[] SpecialPool = new SpecialMode[65]
		{
			SpecialMode.None,
			SpecialMode.None,
			SpecialMode.None,
			SpecialMode.None,
			SpecialMode.None,
			SpecialMode.CoinFlip,
			SpecialMode.TinyBullets,
			SpecialMode.BigBullets,
			SpecialMode.HyperJump,
			SpecialMode.HeavyBoots,
			SpecialMode.StatLottery,
			SpecialMode.GravityFlip,
			SpecialMode.GlassOverdrive,
			SpecialMode.TankMode,
			SpecialMode.ChaosGift,
			SpecialMode.VampBurst,
			SpecialMode.MomentumRush,
			SpecialMode.AmmoForge,
			SpecialMode.PhaseStep,
			SpecialMode.Reversal,
			SpecialMode.RicochetDance,
			SpecialMode.BerserkerCore,
			SpecialMode.SniperStance,
			SpecialMode.CloseQuarters,
			SpecialMode.BlinkStep,
			SpecialMode.Overclock,
			SpecialMode.FrostCore,
			SpecialMode.InfernalTrade,
			SpecialMode.AeroGlass,
			SpecialMode.AnchorHeart,
			SpecialMode.DiceAmmo,
			SpecialMode.TwinPulse,
			SpecialMode.LastStand,
			SpecialMode.FeatherFall,
			SpecialMode.IronSkin,
			SpecialMode.BloodTax,
			SpecialMode.TurboBlock,
			SpecialMode.StaticCharge,
			SpecialMode.LongGame,
			SpecialMode.WildMagic,
			SpecialMode.QuantumFlux,
			SpecialMode.ProbabilityStorm,
			SpecialMode.RealityWarp,
			SpecialMode.LuckyDraw,
			SpecialMode.ChaoticMerge,
			SpecialMode.OverdriveLottery,
			SpecialMode.QuantumTangle,
			SpecialMode.VortexSwap,
			SpecialMode.InfinityStone,
			SpecialMode.PrimalChaosShift,
			SpecialMode.RocketFuse,
			SpecialMode.BlastCore,
			SpecialMode.WallPiercer,
			SpecialMode.GhostRounds,
			SpecialMode.RicochetEngine,
			SpecialMode.PinballShells,
			SpecialMode.PortalShot,
			SpecialMode.BunkerBuster,
			SpecialMode.ScatterMissiles,
			SpecialMode.PhaseRocket,
			SpecialMode.DrillRounds,
			SpecialMode.SiegePayload,
			SpecialMode.ShrapnelBurst,
			SpecialMode.MeteorShells,
			SpecialMode.EchoWarp
		};

		private static readonly SpecialMode[] BlockSpecialPool = new SpecialMode[20]
		{
			SpecialMode.AegisField,
			SpecialMode.ShockRing,
			SpecialMode.ReloadCache,
			SpecialMode.MedicPulse,
			SpecialMode.WarpStepBlock,
			SpecialMode.GravityBubble,
			SpecialMode.MirrorShell,
			SpecialMode.GhostScreen,
			SpecialMode.SiegeReserve,
			SpecialMode.ShrapnelGuard,
			SpecialMode.OverhealDrive,
			SpecialMode.NovaBrake,
			SpecialMode.ForceWall,
			SpecialMode.RicochetWard,
			SpecialMode.PhaseBattery,
			SpecialMode.AegisField,
			SpecialMode.ShockRing,
			SpecialMode.MirrorShell,
			SpecialMode.GhostScreen,
			SpecialMode.PhaseBattery
		};

		private static readonly SpecialMode[] RerollSpecialPool = new SpecialMode[10]
		{
			SpecialMode.RerollSomeAllPlayers,
			SpecialMode.RerollSomeOwnCards,
			SpecialMode.RerollAllOwnCards,
			SpecialMode.RerollAllPlayersCards,
			SpecialMode.RerollHalfOwnCards,
			SpecialMode.RerollHalfAllPlayers,
			SpecialMode.RerollOneEachPlayer,
			SpecialMode.RerollTwoOwnCards,
			SpecialMode.RerollTwoEachPlayer,
			SpecialMode.RerollAllOthers
		};

		public static CardSpec Create(int index)
		{
			//IL_0869: Unknown result type (might be due to invalid IL or missing references)
			//IL_087b: Unknown result type (might be due to invalid IL or missing references)
			//IL_088b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0885: Unknown result type (might be due to invalid IL or missing references)
			//IL_0893: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ef: Unknown result type (might be due to invalid IL or missing references)
			int num = index - 1;
			Random random = new Random(9187 + index * 7919);
			bool flag = index >= 131 && index <= 180;
			bool flag2 = index >= 181;
			bool flag3 = random.NextDouble() < (flag ? 0.22 : 0.38);
			float damageMult = Roll(random, flag3, flag ? 0.88f : 0.72f, flag ? 1.24f : 1.58f);
			float attackSpeedMult = Roll(random, flag3, flag ? 0.9f : 0.7f, flag ? 1.2f : 1.55f);
			float reloadTimeMult = Roll(random, flag3, flag ? 0.82f : 0.68f, flag ? 1.16f : 1.55f);
			float projectileSpeedMult = Roll(random, flag3, flag ? 0.88f : 0.72f, flag ? 1.22f : 1.58f);
			float ammoMult = Roll(random, flag3, flag ? 0.92f : 0.7f, flag ? 1.22f : 1.6f);
			float healthMult = Roll(random, flag3, flag ? 0.94f : 0.7f, flag ? 1.3f : 1.6f);
			float moveSpeedMult = Roll(random, flag3, flag ? 0.92f : 0.72f, flag ? 1.24f : 1.55f);
			float gravityMult = Roll(random, flag3, flag ? 0.82f : 0.72f, flag ? 1.18f : 1.45f);
			float blockCooldownMult = Roll(random, curse: false, flag ? 0.58f : 0.7f, flag ? 0.92f : 1.55f);
			SpecialMode specialMode = (flag2 ? RerollSpecialPool[(index - 181) % RerollSpecialPool.Length] : (flag ? BlockSpecialPool[random.Next(BlockSpecialPool.Length)] : SpecialPool[random.Next(SpecialPool.Length)]));
			int count = ((!flag && !flag2 && random.NextDouble() < 0.18) ? random.Next(4, 6) : ((random.NextDouble() < 0.7) ? 2 : 3));
			bool[] array = (flag2 ? PickPrimaryStats(random, 3) : (flag ? PickBlockStats(random) : PickPrimaryStats(random, count)));
			string arg = (flag2 ? (RerollPrefixes[num % RerollPrefixes.Length] + " " + RerollSuffixes[num / RerollPrefixes.Length % RerollSuffixes.Length]) : (flag ? (BlockPrefixes[num % BlockPrefixes.Length] + " " + BlockSuffixes[num / BlockPrefixes.Length % BlockSuffixes.Length]) : (Prefixes[num % Prefixes.Length] + " " + Suffixes[num / Prefixes.Length % Suffixes.Length])));
			string text = (flag2 ? "Reroll" : (flag ? "Block" : (flag3 ? "Curse" : "Perk")));
			string text2 = specialMode switch
			{
				SpecialMode.CoinFlip => "Coinflip effect on pickup.", 
				SpecialMode.TinyBullets => "Tiny bullets and handling boost.", 
				SpecialMode.BigBullets => "Big bullets with heavy punch.", 
				SpecialMode.HyperJump => "Low-gravity jump style.", 
				SpecialMode.HeavyBoots => "Heavy gravity grounded style.", 
				SpecialMode.StatLottery => "Random bonus and penalty every pickup.", 
				SpecialMode.GravityFlip => "Randomly flips between moon and heavy gravity.", 
				SpecialMode.GlassOverdrive => "Huge offense at a survivability cost.", 
				SpecialMode.TankMode => "Tank burst: health up, speed down, damage up.", 
				SpecialMode.ChaosGift => "Random jackpot or tax on pickup.", 
				SpecialMode.VampBurst => "Steals bulk via hp boost plus ammo tax.", 
				SpecialMode.MomentumRush => "Each pickup rolls speed-focused or power-focused mode.", 
				SpecialMode.AmmoForge => "Converts reload rhythm into ammo pressure.", 
				SpecialMode.PhaseStep => "Block phase boost: mobility and cooldown swing.", 
				SpecialMode.Reversal => "Swaps one strong upside with one random downside.", 
				SpecialMode.RicochetDance => "Fast rounds with agile rhythm and softer hits.", 
				SpecialMode.BerserkerCore => "Aggro core: high output with fragile body.", 
				SpecialMode.SniperStance => "Slow stance, long-range precision burst.", 
				SpecialMode.CloseQuarters => "Close-fight damage and speed, weaker range.", 
				SpecialMode.BlinkStep => "Quick mobility with lighter gravity and better block pace.", 
				SpecialMode.Overclock => "Rapid fire engine, burns through magazine quality.", 
				SpecialMode.FrostCore => "Tanky chill core with heavier movement.", 
				SpecialMode.InfernalTrade => "Big damage bargain at a health cost.", 
				SpecialMode.AeroGlass => "Aerial speed and velocity for glass builds.", 
				SpecialMode.AnchorHeart => "Heavy anchor body with massive durability.", 
				SpecialMode.DiceAmmo => "Ammo pool rerolls each pickup.", 
				SpecialMode.TwinPulse => "Two random pulses buff your build.", 
				SpecialMode.LastStand => "Risky low-health high-impact setup.", 
				SpecialMode.FeatherFall => "Floaty movement with risky defense profile.", 
				SpecialMode.IronSkin => "Durable shell with slower offense.", 
				SpecialMode.BloodTax => "Power now, sustain later.", 
				SpecialMode.TurboBlock => "Aggressive block cycle with tradeoff on gun rhythm.", 
				SpecialMode.StaticCharge => "Charged shots with unstable timing.", 
				SpecialMode.LongGame => "Economy setup for longer rounds.", 
				SpecialMode.WildMagic => "Unpredictable triple-roll blessing or curse.", 
				SpecialMode.QuantumFlux => "Randomly applies 2-4 chaotic stat shifts instantly.", 
				SpecialMode.ProbabilityStorm => "50% chance each stat becomes extremely good or bad.", 
				SpecialMode.RealityWarp => "Creates extreme stat opposites for high-risk gameplay.", 
				SpecialMode.LuckyDraw => "70% excellent buffs, 30% severe penalties.", 
				SpecialMode.ChaoticMerge => "Blends 3 different special effect combinations.", 
				SpecialMode.OverdriveLottery => "Multiple random effect rolls stacked for chaos.", 
				SpecialMode.QuantumTangle => "Links stats: one rises, another falls unpredictably.", 
				SpecialMode.VortexSwap => "Randomly swaps your stat multipliers with each other.", 
				SpecialMode.InfinityStone => "Alternates between amazing and terrible every action.", 
				SpecialMode.PrimalChaosShift => "Pure random extreme shifts with wild combinations.", 
				SpecialMode.RocketFuse => "Slow rocket rounds with splash pressure.", 
				SpecialMode.BlastCore => "Direct explosive payload on every shot.", 
				SpecialMode.WallPiercer => "Shots phase through walls with lighter punch.", 
				SpecialMode.GhostRounds => "Wall-passing portal rounds with unstable damage.", 
				SpecialMode.RicochetEngine => "Ricochet bullets that bounce around the arena.", 
				SpecialMode.PinballShells => "Extra ricochets and speed for chaos angles.", 
				SpecialMode.PortalShot => "Portal-linked rounds with a tighter firing profile.", 
				SpecialMode.BunkerBuster => "Wall-breaching explosive shells for cover pressure.", 
				SpecialMode.ScatterMissiles => "Split rocket volley with reduced per-shot power.", 
				SpecialMode.PhaseRocket => "Ghost rocket that drifts through walls before bursting.", 
				SpecialMode.DrillRounds => "Long-travel drilling shots that ignore terrain.", 
				SpecialMode.SiegePayload => "Heavy siege shell with large blast and reload tax.", 
				SpecialMode.ShrapnelBurst => "Fragmenting spread that fills space with pressure.", 
				SpecialMode.MeteorShells => "Huge falling shells with chunky explosions.", 
				SpecialMode.EchoWarp => "Portal splash rounds with warped tempo.", 
				SpecialMode.AegisField => "Blocking wraps your bullets in a growing force field.", 
				SpecialMode.ShockRing => "Block releases a custom shock ring that hurts and shoves enemies.", 
				SpecialMode.ReloadCache => "Each block refills ammo and improves gun rhythm.", 
				SpecialMode.MedicPulse => "Block converts timing into instant healing.", 
				SpecialMode.WarpStepBlock => "Block launches you in your aim direction.", 
				SpecialMode.GravityBubble => "Block creates a floaty mobility bubble around you.", 
				SpecialMode.MirrorShell => "Block arms your shots with bouncing mirror shells.", 
				SpecialMode.GhostScreen => "Block charges phase shots that pass walls.", 
				SpecialMode.SiegeReserve => "Blocking stockpiles siege payload into your gun.", 
				SpecialMode.ShrapnelGuard => "Block loads fragmentation scatter into the next volleys.", 
				SpecialMode.OverhealDrive => "Block overheals your build and thickens the shell.", 
				SpecialMode.NovaBrake => "Block emits a braking nova that blasts space open.", 
				SpecialMode.ForceWall => "Block inflates a heavy force field around every bullet.", 
				SpecialMode.RicochetWard => "Block wards your gun with ricochet splash rounds.", 
				SpecialMode.PhaseBattery => "Blocking stores portal and phase energy for shots.", 
				SpecialMode.RerollSomeAllPlayers => "Rerolls some cards from every player.", 
				SpecialMode.RerollSomeOwnCards => "Rerolls some cards only from you.", 
				SpecialMode.RerollAllOwnCards => "Rerolls all your cards.", 
				SpecialMode.RerollAllPlayersCards => "Rerolls all cards from everyone.", 
				SpecialMode.RerollHalfOwnCards => "Rerolls half your cards.", 
				SpecialMode.RerollHalfAllPlayers => "Rerolls half of all players cards.", 
				SpecialMode.RerollOneEachPlayer => "Rerolls one card for each player.", 
				SpecialMode.RerollTwoOwnCards => "Rerolls two of your cards.", 
				SpecialMode.RerollTwoEachPlayer => "Rerolls two cards for each player.", 
				SpecialMode.RerollAllOthers => "Rerolls all cards for everyone except you.", 
				_ => "Balanced modifier set.", 
			};
			Rarity rarity = (Rarity)0;
			switch (num % 5)
			{
			case 2:
			case 3:
				rarity = (Rarity)1;
				break;
			case 4:
				rarity = (Rarity)2;
				break;
			}
			if (flag)
			{
				rarity = (Rarity)2;
			}
			else if (flag2)
			{
				rarity = (Rarity)2;
			}
			CardThemeColorType theme = (CardThemeColorType)(flag2 ? 1 : (flag ? 2 : (flag3 ? 4 : ((num % 2 == 0) ? 1 : 2))));
			return new CardSpec
			{
				Title = $"{arg} #{index:000}",
				Description = text + ": " + text2,
				Rarity = rarity,
				Theme = theme,
				DamageMult = damageMult,
				AttackSpeedMult = attackSpeedMult,
				ReloadTimeMult = reloadTimeMult,
				ProjectileSpeedMult = projectileSpeedMult,
				AmmoMult = ammoMult,
				HealthMult = healthMult,
				MoveSpeedMult = moveSpeedMult,
				GravityMult = gravityMult,
				BlockCooldownMult = blockCooldownMult,
				Special = specialMode,
				UseDamage = array[0],
				UseAttackSpeed = array[1],
				UseReload = array[2],
				UseProjectileSpeed = array[3],
				UseAmmo = array[4],
				UseHealth = array[5],
				UseMoveSpeed = array[6],
				UseGravity = array[7],
				UseBlockCooldown = array[8]
			};
		}

		private static bool[] PickPrimaryStats(Random rng, int count)
		{
			bool[] array = new bool[9];
			foreach (int item in (from _ in Enumerable.Range(0, 9)
				orderby rng.Next()
				select _).Take(count).ToList())
			{
				array[item] = true;
			}
			return array;
		}

		private static bool[] PickBlockStats(Random rng)
		{
			bool[] array = new bool[9] { false, false, false, false, false, false, false, false, true };
			int[] source = new int[6] { 5, 6, 2, 4, 7, 0 };
			foreach (int item in Enumerable.Take(count: (rng.NextDouble() < 0.7) ? 2 : 3, source: source.OrderBy((int _) => rng.Next())))
			{
				array[item] = true;
			}
			return array;
		}

		private static float Roll(Random rng, bool curse, float min, float max)
		{
			float num = (float)rng.NextDouble();
			float num2 = Mathf.Lerp(min, max, num);
			if (curse)
			{
				if (rng.NextDouble() < 0.65)
				{
					num2 = Mathf.Min(1f, num2);
				}
			}
			else if (rng.NextDouble() < 0.65)
			{
				num2 = Mathf.Max(1f, num2);
			}
			return Mathf.Clamp((float)Math.Round(num2, 2), 0.65f, 1.65f);
		}
	}
	public abstract class GeneratedCardBase : CustomCard
	{
		protected abstract int CardIndex { get; }

		private CardSpec Spec => CardSpecFactory.Create(CardIndex);

		protected override string GetTitle()
		{
			return Spec.Title;
		}

		protected override string GetDescription()
		{
			return Spec.Description;
		}

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

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

		protected override GameObject GetCardArt()
		{
			return CardVisualFactory.CreateArtVariant(CardIndex);
		}

		protected override GameObject GetCardBase()
		{
			return CardVisualFactory.CardBase;
		}

		public override bool GetEnabled()
		{
			return CardAvailabilityGate.IsEnabled(CardIndex);
		}

		public override string GetModName()
		{
			return "Niugl MegaPack";
		}

		protected override CardInfoStat[] GetStats()
		{
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Expected O, but got Unknown
			List<CardInfoStat> source = new List<CardInfoStat>
			{
				Stat("Damage", Spec.DamageMult, Spec.UseDamage),
				Stat("Attack Speed", Spec.AttackSpeedMult, Spec.UseAttackSpeed),
				Stat("Reload", Spec.ReloadTimeMult, Spec.UseReload),
				Stat("Projectile Speed", Spec.ProjectileSpeedMult, Spec.UseProjectileSpeed),
				Stat("Ammo", Spec.AmmoMult, Spec.UseAmmo),
				Stat("Health", Spec.HealthMult, Spec.UseHealth),
				Stat("Move Speed", Spec.MoveSpeedMult, Spec.UseMoveSpeed),
				Stat("Gravity", Spec.GravityMult, Spec.UseGravity),
				Stat("Block Cooldown", Spec.BlockCooldownMult, Spec.UseBlockCooldown)
			};
			source = source.Where((CardInfoStat s) => s != null).ToList();
			if (Spec.Special != 0)
			{
				source.Add(new CardInfoStat
				{
					stat = "Extra",
					amount = Spec.Special.ToString(),
					positive = true,
					simepleAmount = (SimpleAmount)2
				});
			}
			return source.ToArray();
		}

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			cardInfo.allowMultiple = true;
			ApplyCore(gun, statModifiers, block, Spec);
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			EnsureBlockPowerTracker(player)?.Register(Spec.Special);
			if (Spec.Special == SpecialMode.CoinFlip)
			{
				float multiplier = ((Random.value > 0.5f) ? 1.3f : 0.8f);
				TryScaleFloat(gun, new string[1] { "damage" }, multiplier);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, multiplier);
			}
			else if (Spec.Special == SpecialMode.TinyBullets)
			{
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 0.75f);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 1.12f);
			}
			else if (Spec.Special == SpecialMode.BigBullets)
			{
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 1.35f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.15f);
			}
			else if (Spec.Special == SpecialMode.HyperJump)
			{
				TryScaleFloat(characterStats, new string[3] { "jump", "jumpImpulse", "jumpPower" }, 1.35f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 0.82f);
			}
			else if (Spec.Special == SpecialMode.HeavyBoots)
			{
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 1.25f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.9f);
			}
			else if (Spec.Special == SpecialMode.StatLottery)
			{
				ApplyLottery(gun, characterStats, block);
			}
			else if (Spec.Special == SpecialMode.GravityFlip)
			{
				float multiplier2 = ((Random.value > 0.5f) ? 0.65f : 1.45f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, multiplier2);
			}
			else if (Spec.Special == SpecialMode.GlassOverdrive)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.45f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.2f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.75f);
			}
			else if (Spec.Special == SpecialMode.TankMode)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.35f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.8f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.15f);
			}
			else if (Spec.Special == SpecialMode.ChaosGift)
			{
				float value = Random.value;
				if (value < 0.2f)
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 1.7f);
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.25f);
				}
				else if (value < 0.4f)
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 0.72f);
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.78f);
				}
			}
			else if (Spec.Special == SpecialMode.VampBurst)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.18f);
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 0.85f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.1f);
			}
			else if (Spec.Special == SpecialMode.MomentumRush)
			{
				if (Random.value > 0.5f)
				{
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.3f);
					TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.2f);
				}
				else
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 1.25f);
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.88f);
				}
			}
			else if (Spec.Special == SpecialMode.AmmoForge)
			{
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 1.25f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.15f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.PhaseStep)
			{
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 0.8f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.15f);
			}
			else if (Spec.Special == SpecialMode.Reversal)
			{
				int num = Random.Range(0, 3);
				int num2 = Random.Range(0, 3);
				if (num == 0)
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 1.35f);
				}
				if (num == 1)
				{
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.25f);
				}
				if (num == 2)
				{
					TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.75f);
				}
				if (num2 == 0)
				{
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.82f);
				}
				if (num2 == 1)
				{
					TryScaleFloat(characterStats, new string[1] { "gravity" }, 1.2f);
				}
				if (num2 == 2)
				{
					TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 0.85f);
				}
			}
			else if (Spec.Special == SpecialMode.RicochetDance)
			{
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.28f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.88f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.92f);
			}
			else if (Spec.Special == SpecialMode.BerserkerCore)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.35f);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 1.2f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.78f);
			}
			else if (Spec.Special == SpecialMode.SniperStance)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.4f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.35f);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 0.8f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.88f);
			}
			else if (Spec.Special == SpecialMode.CloseQuarters)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.22f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.18f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.85f);
			}
			else if (Spec.Special == SpecialMode.BlinkStep)
			{
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.2f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 0.8f);
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 0.85f);
			}
			else if (Spec.Special == SpecialMode.Overclock)
			{
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 1.28f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.82f);
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 0.86f);
			}
			else if (Spec.Special == SpecialMode.FrostCore)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.26f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.86f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 1.12f);
			}
			else if (Spec.Special == SpecialMode.InfernalTrade)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.45f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.15f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.74f);
			}
			else if (Spec.Special == SpecialMode.AeroGlass)
			{
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.24f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 0.78f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.2f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.82f);
			}
			else if (Spec.Special == SpecialMode.AnchorHeart)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.34f);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 1.2f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.82f);
			}
			else if (Spec.Special == SpecialMode.DiceAmmo)
			{
				float multiplier3 = ((Random.value > 0.5f) ? 1.45f : 0.7f);
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, multiplier3);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.TwinPulse)
			{
				int pulse = Random.Range(0, 4);
				int pulse2 = Random.Range(0, 4);
				ApplyPulse(pulse, gun, characterStats, block);
				ApplyPulse(pulse2, gun, characterStats, block);
			}
			else if (Spec.Special == SpecialMode.LastStand)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.72f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.38f);
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 0.88f);
			}
			else if (Spec.Special == SpecialMode.FeatherFall)
			{
				TryScaleFloat(characterStats, new string[1] { "gravity" }, 0.68f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.16f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.86f);
			}
			else if (Spec.Special == SpecialMode.IronSkin)
			{
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.32f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.84f);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 0.9f);
			}
			else if (Spec.Special == SpecialMode.BloodTax)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, 1.28f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.82f);
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 0.88f);
			}
			else if (Spec.Special == SpecialMode.TurboBlock)
			{
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 0.72f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.12f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.12f);
			}
			else if (Spec.Special == SpecialMode.StaticCharge)
			{
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.22f);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 1.12f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.1f);
			}
			else if (Spec.Special == SpecialMode.LongGame)
			{
				TryScaleFloat(gunAmmo, new string[2] { "maxAmmo", "ammo" }, 1.35f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.92f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.94f);
			}
			else if (Spec.Special == SpecialMode.WildMagic)
			{
				for (int i = 0; i < 3; i++)
				{
					ApplyPulse(Random.Range(0, 6), gun, characterStats, block);
				}
			}
			else if (Spec.Special == SpecialMode.QuantumFlux)
			{
				int num3 = Random.Range(2, 5);
				for (int j = 0; j < num3; j++)
				{
					ApplyPulse(Random.Range(0, 6), gun, characterStats, block);
				}
			}
			else if (Spec.Special == SpecialMode.ProbabilityStorm)
			{
				if (Random.value > 0.5f)
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 1.5f);
				}
				else
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 0.65f);
				}
				if (Random.value > 0.5f)
				{
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.45f);
				}
				else
				{
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 0.7f);
				}
				if (Random.value > 0.5f)
				{
					TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.72f);
				}
				else
				{
					TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.38f);
				}
				if (Random.value > 0.5f)
				{
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.48f);
				}
				else
				{
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.68f);
				}
			}
			else if (Spec.Special == SpecialMode.RealityWarp)
			{
				float num4 = ((Random.value > 0.5f) ? 1.55f : 0.68f);
				TryScaleFloat(gun, new string[1] { "damage" }, num4);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, (num4 > 1f) ? 0.72f : 1.48f);
				float num5 = ((Random.value > 0.5f) ? 1.5f : 0.7f);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, num5);
				TryScaleFloat(characterStats, new string[1] { "gravity" }, (num5 > 1f) ? 1.3f : 0.78f);
			}
			else if (Spec.Special == SpecialMode.LuckyDraw)
			{
				if (Random.value < 0.7f)
				{
					ApplyPulse(0, gun, characterStats, block);
					ApplyPulse(2, gun, characterStats, block);
					return;
				}
				TryScaleFloat(gun, new string[1] { "damage" }, 0.65f);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.7f);
			}
			else if (Spec.Special == SpecialMode.ChaoticMerge)
			{
				int pulse3 = Random.Range(0, 6);
				int pulse4 = Random.Range(0, 6);
				int pulse5 = Random.Range(0, 6);
				ApplyPulse(pulse3, gun, characterStats, block);
				ApplyPulse(pulse4, gun, characterStats, block);
				ApplyPulse(pulse5, gun, characterStats, block);
			}
			else if (Spec.Special == SpecialMode.OverdriveLottery)
			{
				ApplyLottery(gun, characterStats, block);
				if (Random.value > 0.5f)
				{
					ApplyLottery(gun, characterStats, block);
				}
			}
			else if (Spec.Special == SpecialMode.QuantumTangle)
			{
				int num6 = Random.Range(0, 3);
				float num7 = ((Random.value > 0.5f) ? 1.3f : 0.77f);
				switch (num6)
				{
				case 0:
					TryScaleFloat(gun, new string[1] { "damage" }, num7);
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, (num7 > 1f) ? 0.8f : 1.25f);
					break;
				case 1:
					TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, num7);
					TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, (num7 > 1f) ? 0.85f : 1.2f);
					break;
				default:
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, num7);
					TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, (num7 > 1f) ? 1.15f : 0.88f);
					break;
				}
			}
			else if (Spec.Special == SpecialMode.VortexSwap)
			{
				float[] array = new float[6] { 1.35f, 0.75f, 1.25f, 0.8f, 1.4f, 0.7f };
				float multiplier4 = array[Random.Range(0, array.Length)];
				float multiplier5 = array[Random.Range(0, array.Length)];
				TryScaleFloat(gun, new string[1] { "damage" }, multiplier4);
				TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, multiplier5);
				TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, array[Random.Range(0, array.Length)]);
			}
			else if (Spec.Special == SpecialMode.InfinityStone)
			{
				if (Random.value > 0.5f)
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 1.6f);
					TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.5f);
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 1.55f);
				}
				else
				{
					TryScaleFloat(gun, new string[1] { "damage" }, 0.62f);
					TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.65f);
					TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.4f);
				}
			}
			else if (Spec.Special == SpecialMode.PrimalChaosShift)
			{
				for (int k = 0; k < 2; k++)
				{
					if (Random.value > 0.5f)
					{
						TryScaleFloat(gun, new string[1] { "damage" }, 1.4f);
						TryScaleFloat(characterStats, new string[2] { "health", "maxHealth" }, 0.75f);
					}
					else
					{
						TryScaleFloat(characterStats, new string[1] { "movementSpeed" }, 1.38f);
						TryScaleFloat(characterStats, new string[1] { "gravity" }, 0.8f);
					}
				}
			}
			else if (Spec.Special == SpecialMode.RocketFuse)
			{
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.8f);
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 1.15f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 0.85f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.38f);
			}
			else if (Spec.Special == SpecialMode.BlastCore)
			{
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 1.1f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.48f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.WallPiercer)
			{
				TrySetBool(gun, new string[1] { "ignoreWalls" }, value: true);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.94f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.GhostRounds)
			{
				TrySetBool(gun, new string[1] { "ignoreWalls" }, value: true);
				TryAddInt(gun, new string[1] { "bulletPortal" }, 1);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.9f);
			}
			else if (Spec.Special == SpecialMode.RicochetEngine)
			{
				TryAddInt(gun, new string[1] { "reflects" }, 2);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.93f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.PinballShells)
			{
				TryAddInt(gun, new string[1] { "reflects" }, 3);
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, 1.08f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.86f);
			}
			else if (Spec.Special == SpecialMode.PortalShot)
			{
				TryAddInt(gun, new string[1] { "bulletPortal" }, 1);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.92f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.BunkerBuster)
			{
				TrySetBool(gun, new string[1] { "ignoreWalls" }, value: true);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 0.95f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.44f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.14f);
				TryScaleFloat(gun, new string[1] { "damage" }, 1.08f);
			}
			else if (Spec.Special == SpecialMode.ScatterMissiles)
			{
				TryAddInt(gun, new string[1] { "numberOfProjectiles" }, 1);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 0.65f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.26f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.84f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.82f);
			}
			else if (Spec.Special == SpecialMode.PhaseRocket)
			{
				TrySetBool(gun, new string[1] { "ignoreWalls" }, value: true);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 0.75f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.3f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.88f);
			}
			else if (Spec.Special == SpecialMode.DrillRounds)
			{
				TrySetBool(gun, new string[1] { "ignoreWalls" }, value: true);
				TrySetFloat(gun, new string[1] { "destroyBulletAfter" }, 6f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.1f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.92f);
			}
			else if (Spec.Special == SpecialMode.SiegePayload)
			{
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 1.3f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.55f);
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 1.24f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.18f);
			}
			else if (Spec.Special == SpecialMode.ShrapnelBurst)
			{
				TryAddInt(gun, new string[1] { "numberOfProjectiles" }, 2);
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 0.86f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.8f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.06f);
			}
			else if (Spec.Special == SpecialMode.MeteorShells)
			{
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 1.45f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.62f);
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 0.72f);
				TryScaleFloat(gun, new string[3] { "projectileSize", "bulletSize", "size" }, 1.3f);
			}
			else if (Spec.Special == SpecialMode.EchoWarp)
			{
				TryAddInt(gun, new string[1] { "bulletPortal" }, 1);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyRange" }, 0.8f);
				TrySetFloat(gun, new string[1] { "explodeNearEnemyDamage" }, 0.32f);
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 1.1f);
			}
			else if (Spec.Special == SpecialMode.RerollSomeAllPlayers)
			{
				RerollCards(player, includeSelf: true, includeOthers: true, rerollAll: false, 0.35f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollSomeOwnCards)
			{
				RerollCards(player, includeSelf: true, includeOthers: false, rerollAll: false, 0.45f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollAllOwnCards)
			{
				RerollCards(player, includeSelf: true, includeOthers: false, rerollAll: true, 1f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollAllPlayersCards)
			{
				RerollCards(player, includeSelf: true, includeOthers: true, rerollAll: true, 1f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollHalfOwnCards)
			{
				RerollCards(player, includeSelf: true, includeOthers: false, rerollAll: false, 0.5f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollHalfAllPlayers)
			{
				RerollCards(player, includeSelf: true, includeOthers: true, rerollAll: false, 0.5f, 0);
			}
			else if (Spec.Special == SpecialMode.RerollOneEachPlayer)
			{
				RerollCards(player, includeSelf: true, includeOthers: true, rerollAll: false, 0f, 1);
			}
			else if (Spec.Special == SpecialMode.RerollTwoOwnCards)
			{
				RerollCards(player, includeSelf: true, includeOthers: false, rerollAll: false, 0f, 2);
			}
			else if (Spec.Special == SpecialMode.RerollTwoEachPlayer)
			{
				RerollCards(player, includeSelf: true, includeOthers: true, rerollAll: false, 0f, 2);
			}
			else if (Spec.Special == SpecialMode.RerollAllOthers)
			{
				RerollCards(player, includeSelf: false, includeOthers: true, rerollAll: true, 1f, 0);
			}
		}

		private static BlockPowerTracker EnsureBlockPowerTracker(Player player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return null;
			}
			BlockPowerTracker blockPowerTracker = ((Component)player).gameObject.GetComponent<BlockPowerTracker>();
			if ((Object)(object)blockPowerTracker == (Object)null)
			{
				blockPowerTracker = ((Component)player).gameObject.AddComponent<BlockPowerTracker>();
			}
			return blockPowerTracker;
		}

		private static void RerollCards(Player source, bool includeSelf, bool includeOthers, bool rerollAll, float fraction, int fixedCount)
		{
			CardInfo[] array = (((Object)(object)CardChoice.instance != (Object)null) ? CardChoice.instance.cards : null);
			if (array == null || array.Length == 0)
			{
				return;
			}
			List<Player> list = (from p in Object.FindObjectsOfType<Player>()
				where (Object)(object)p != (Object)null && (Object)(object)p.data != (Object)null && !p.data.dead
				select p).ToList();
			foreach (Player item in list)
			{
				bool flag = (Object)(object)source != (Object)null && item.playerID == source.playerID;
				if ((flag && !includeSelf) || (!flag && !includeOthers))
				{
					continue;
				}
				List<CardInfo> currentCards = item.data.currentCards;
				if (currentCards == null || currentCards.Count == 0)
				{
					continue;
				}
				int count = (rerollAll ? currentCards.Count : ((fixedCount > 0) ? Mathf.Min(fixedCount, currentCards.Count) : Mathf.Clamp(Mathf.RoundToInt((float)currentCards.Count * fraction), 1, currentCards.Count)));
				foreach (int item2 in (from _ in Enumerable.Range(0, currentCards.Count)
					orderby Random.value
					select _).Take(count).ToList())
				{
					CardInfo current3 = currentCards[item2];
					CardInfo randomReplacement = GetRandomReplacement(array, current3);
					if ((Object)(object)randomReplacement != (Object)null)
					{
						currentCards[item2] = randomReplacement;
					}
				}
				ApplyCardStats componentInChildren = ((Component)item).GetComponentInChildren<ApplyCardStats>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					typeof(ApplyCardStats).GetMethod("ApplyStats", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.Invoke(componentInChildren, null);
				}
			}
			if (!((Object)(object)CardBarHandler.instance != (Object)null))
			{
				return;
			}
			CardBarHandler.instance.ResetCardBards();
			foreach (Player item3 in list)
			{
				if ((Object)(object)item3 == (Object)null || (Object)(object)item3.data == (Object)null || item3.data.currentCards == null)
				{
					continue;
				}
				foreach (CardInfo currentCard in item3.data.currentCards)
				{
					if ((Object)(object)currentCard != (Object)null)
					{
						CardBarHandler.instance.AddCard(item3.teamID, currentCard);
					}
				}
			}
		}

		private static CardInfo GetRandomReplacement(CardInfo[] cardPool, CardInfo current)
		{
			for (int i = 0; i < 24; i++)
			{
				CardInfo val = cardPool[Random.Range(0, cardPool.Length)];
				if ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)current)
				{
					return val;
				}
			}
			return current;
		}

		private static void ApplyPulse(int pulse, Gun gun, CharacterStatModifiers stats, Block block)
		{
			switch (pulse)
			{
			case 0:
				TryScaleFloat(gun, new string[1] { "damage" }, 1.18f);
				break;
			case 1:
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.85f);
				break;
			case 2:
				TryScaleFloat(stats, new string[1] { "movementSpeed" }, 1.15f);
				break;
			case 3:
				TryScaleFloat(stats, new string[2] { "health", "maxHealth" }, 1.12f);
				break;
			case 4:
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 0.9f);
				break;
			default:
				TryScaleFloat(stats, new string[1] { "gravity" }, (Random.value > 0.5f) ? 0.86f : 1.16f);
				break;
			}
		}

		private static CardInfoStat Stat(string label, float mult, bool enabled)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_0074: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			if (!enabled)
			{
				return null;
			}
			if (Mathf.Abs(mult - 1f) < 0.06f)
			{
				return null;
			}
			float num = (mult - 1f) * 100f;
			bool flag = num >= 0f;
			string amount = (flag ? "+" : "-") + Mathf.Abs(Mathf.RoundToInt(num)) + "%";
			return new CardInfoStat
			{
				stat = label,
				amount = amount,
				positive = flag,
				simepleAmount = (SimpleAmount)(flag ? 2 : 6)
			};
		}

		private static void ApplyLottery(Gun gun, CharacterStatModifiers stats, Block block)
		{
			switch (Random.Range(0, 4))
			{
			case 0:
				TryScaleFloat(gun, new string[1] { "damage" }, 1.25f);
				TryScaleFloat(stats, new string[1] { "movementSpeed" }, 0.9f);
				break;
			case 1:
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, 0.8f);
				TryScaleFloat(gun, new string[1] { "damage" }, 0.9f);
				break;
			case 2:
				TryScaleFloat(stats, new string[2] { "health", "maxHealth" }, 1.2f);
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, 1.15f);
				break;
			default:
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, 1.25f);
				TryScaleFloat(stats, new string[1] { "gravity" }, 1.12f);
				break;
			}
		}

		private static void ApplyCore(Gun gun, CharacterStatModifiers stats, Block block, CardSpec spec)
		{
			if (spec.UseDamage)
			{
				TryScaleFloat(gun, new string[1] { "damage" }, spec.DamageMult);
			}
			if (spec.UseAttackSpeed)
			{
				TryScaleFloat(gun, new string[2] { "attackSpeed", "timeBetweenBullets" }, spec.AttackSpeedMult);
			}
			if (spec.UseReload)
			{
				TryScaleFloat(gun, new string[2] { "reloadTime", "reloadTimeAdd" }, spec.ReloadTimeMult);
			}
			if (spec.UseProjectileSpeed)
			{
				TryScaleFloat(gun, new string[2] { "projectileSpeed", "bulletSpeed" }, spec.ProjectileSpeedMult);
			}
			if (spec.UseAmmo)
			{
				TryScaleFloat(gun, new string[2] { "ammo", "numberOfProjectiles" }, spec.AmmoMult);
			}
			if (spec.UseHealth)
			{
				TryScaleFloat(stats, new string[2] { "health", "maxHealth" }, spec.HealthMult);
			}
			if (spec.UseMoveSpeed)
			{
				TryScaleFloat(stats, new string[2] { "movementSpeed", "runSpeed" }, spec.MoveSpeedMult);
			}
			if (spec.UseGravity)
			{
				TryScaleFloat(stats, new string[1] { "gravity" }, spec.GravityMult);
			}
			if (spec.UseBlockCooldown)
			{
				TryScaleFloat(block, new string[3] { "cdMultiplier", "cooldownMultiplier", "cooldown" }, spec.BlockCooldownMult);
			}
		}

		private static bool TryScaleFloat(object target, IEnumerable<string> names, float multiplier)
		{
			if (target == null)
			{
				return false;
			}
			Type type = target.GetType();
			foreach (string name in names)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null && field.FieldType == typeof(float))
				{
					float num = (float)field.GetValue(target);
					field.SetValue(target, num * multiplier);
					return true;
				}
				if (field != null && field.FieldType == typeof(int))
				{
					int num2 = (int)field.GetValue(target);
					field.SetValue(target, Mathf.Max(1, Mathf.RoundToInt((float)num2 * multiplier)));
					return true;
				}
			}
			return false;
		}

		private static bool TrySetFloat(object target, IEnumerable<string> names, float value)
		{
			if (target == null)
			{
				return false;
			}
			Type type = target.GetType();
			foreach (string name in names)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null && field.FieldType == typeof(float))
				{
					field.SetValue(target, value);
					return true;
				}
			}
			return false;
		}

		private static bool TrySetBool(object target, IEnumerable<string> names, bool value)
		{
			if (target == null)
			{
				return false;
			}
			Type type = target.GetType();
			foreach (string name in names)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null && field.FieldType == typeof(bool))
				{
					field.SetValue(target, value);
					return true;
				}
			}
			return false;
		}

		private static bool TryAddInt(object target, IEnumerable<string> names, int delta)
		{
			if (target == null)
			{
				return false;
			}
			Type type = target.GetType();
			foreach (string name in names)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null && field.FieldType == typeof(int))
				{
					int num = (int)field.GetValue(target);
					field.SetValue(target, Mathf.Max(0, num + delta));
					return true;
				}
			}
			return false;
		}
	}
	internal sealed class BlockPowerTracker : MonoBehaviour
	{
		private int _aegisField;

		private int _shockRing;

		private int _reloadCache;

		private int _medicPulse;

		private int _warpStepBlock;

		private int _gravityBubble;

		private int _mirrorShell;

		private int _ghostScreen;

		private int _siegeReserve;

		private int _shrapnelGuard;

		private int _overhealDrive;

		private int _novaBrake;

		private int _forceWall;

		private int _ricochetWard;

		private int _phaseBattery;

		public void Register(SpecialMode special)
		{
			switch (special)
			{
			case SpecialMode.AegisField:
				_aegisField++;
				break;
			case SpecialMode.ShockRing:
				_shockRing++;
				break;
			case SpecialMode.ReloadCache:
				_reloadCache++;
				break;
			case SpecialMode.MedicPulse:
				_medicPulse++;
				break;
			case SpecialMode.WarpStepBlock:
				_warpStepBlock++;
				break;
			case SpecialMode.GravityBubble:
				_gravityBubble++;
				break;
			case SpecialMode.MirrorShell:
				_mirrorShell++;
				break;
			case SpecialMode.GhostScreen:
				_ghostScreen++;
				break;
			case SpecialMode.SiegeReserve:
				_siegeReserve++;
				break;
			case SpecialMode.ShrapnelGuard:
				_shrapnelGuard++;
				break;
			case SpecialMode.OverhealDrive:
				_overhealDrive++;
				break;
			case SpecialMode.NovaBrake:
				_novaBrake++;
				break;
			case SpecialMode.ForceWall:
				_forceWall++;
				break;
			case SpecialMode.RicochetWard:
				_ricochetWard++;
				break;
			case SpecialMode.PhaseBattery:
				_phaseBattery++;
				break;
			}
		}

		public void Trigger(Block block)
		{
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			CharacterData val = ReadField<CharacterData>(block, "data");
			if ((Object)(object)block == (Object)null || (Object)(object)val == (Object)null)
			{
				return;
			}
			Player player = val.player;
			Gun val2 = (((Object)(object)val.weaponHandler != (Object)null) ? val.weaponHandler.gun : null);
			GunAmmo val3 = ReadField<GunAmmo>(val2, "gunAmmo");
			CharacterStatModifiers stats = val.stats;
			HealthHandler healthHandler = val.healthHandler;
			PlayerVelocity playerVel = val.playerVel;
			if (_aegisField > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.projectileSize = Mathf.Max(val2.projectileSize, 1.18f + 0.08f * (float)_aegisField);
				val2.explodeNearEnemyRange = Mathf.Max(val2.explodeNearEnemyRange, 0.22f + 0.08f * (float)_aegisField);
				val2.explodeNearEnemyDamage = Mathf.Max(val2.explodeNearEnemyDamage, 0.12f + 0.05f * (float)_aegisField);
				val2.reflects = Mathf.Max(val2.reflects, Mathf.Min(4, _aegisField / 2));
			}
			if (_shockRing > 0)
			{
				PulseNearby(player, 3.2f + 0.4f * (float)_shockRing, 12f * (float)_shockRing, 16f + 4f * (float)_shockRing);
			}
			if (_reloadCache > 0 && (Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null)
			{
				WriteField(val3, "currentAmmo", val3.maxAmmo);
				val2.reloadTime = Mathf.Max(0.12f, val2.reloadTime * Mathf.Pow(0.97f, (float)_reloadCache));
			}
			if (_medicPulse > 0 && (Object)(object)healthHandler != (Object)null)
			{
				healthHandler.Heal(14f * (float)_medicPulse);
			}
			if (_warpStepBlock > 0 && (Object)(object)playerVel != (Object)null)
			{
				? val4;
				if (!(((Vector3)(ref val.aimDirection)).sqrMagnitude > 0.001f))
				{
					val4 = new Vector2((player.teamID == 0) ? 1f : (-1f), 0f);
				}
				else
				{
					Vector2 val5 = Vector2.op_Implicit(val.aimDirection);
					val4 = ((Vector2)(ref val5)).normalized;
				}
				Vector2 val6 = (Vector2)val4;
				AddVelocity(playerVel, val6 * (14f + 4f * (float)_warpStepBlock) + Vector2.up * (3f + (float)_warpStepBlock));
			}
			if (_gravityBubble > 0 && (Object)(object)stats != (Object)null)
			{
				stats.gravity = Mathf.Min(stats.gravity, Mathf.Max(0.5f, 0.9f - 0.04f * (float)_gravityBubble));
				stats.movementSpeed = Mathf.Max(stats.movementSpeed, 1.08f + 0.05f * (float)_gravityBubble);
			}
			if (_mirrorShell > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.reflects = Mathf.Max(val2.reflects, Mathf.Min(6, 1 + _mirrorShell));
				val2.projectileSpeed = Mathf.Max(val2.projectileSpeed, 1.06f + 0.06f * (float)_mirrorShell);
			}
			if (_ghostScreen > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.ignoreWalls = true;
				val2.bulletPortal = Mathf.Max(val2.bulletPortal, 1 + _ghostScreen / 2);
			}
			if (_siegeReserve > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.explodeNearEnemyRange = Mathf.Max(val2.explodeNearEnemyRange, 0.4f + 0.14f * (float)_siegeReserve);
				val2.explodeNearEnemyDamage = Mathf.Max(val2.explodeNearEnemyDamage, 0.2f + 0.08f * (float)_siegeReserve);
				val2.projectileSize = Mathf.Max(val2.projectileSize, 1.08f + 0.05f * (float)_siegeReserve);
			}
			if (_shrapnelGuard > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.numberOfProjectiles = Mathf.Clamp(Mathf.Max(val2.numberOfProjectiles, 1 + _shrapnelGuard), 1, 6);
				val2.projectileSize = Mathf.Max(val2.projectileSize, 1.04f + 0.02f * (float)_shrapnelGuard);
			}
			if (_overhealDrive > 0 && (Object)(object)stats != (Object)null && (Object)(object)healthHandler != (Object)null)
			{
				stats.health = Mathf.Max(stats.health, 1.06f + 0.05f * (float)_overhealDrive);
				healthHandler.Heal(10f * (float)_overhealDrive);
			}
			if (_novaBrake > 0)
			{
				PulseNearby(player, 3f + 0.35f * (float)_novaBrake, 8f * (float)_novaBrake, 20f + 5f * (float)_novaBrake);
			}
			if (_forceWall > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.projectileSize = Mathf.Max(val2.projectileSize, 1.3f + 0.08f * (float)_forceWall);
				val2.explodeNearEnemyRange = Mathf.Max(val2.explodeNearEnemyRange, 0.3f + 0.08f * (float)_forceWall);
				val2.projectileSpeed = Mathf.Max(val2.projectileSpeed, 0.92f);
			}
			if (_ricochetWard > 0 && (Object)(object)val2 != (Object)null)
			{
				val2.reflects = Mathf.Max(val2.reflects, Mathf.Min(7, 2 + _ricochetWard));
				val2.explodeNearEnemyDamage = Mathf.Max(val2.explodeNearEnemyDamage, 0.14f + 0.05f * (float)_ricochetWard);
			}
			if (_phaseBattery > 0 && (Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null)
			{
				val2.ignoreWalls = true;
				val2.bulletPortal = Mathf.Max(val2.bulletPortal, 1 + _phaseBattery);
				WriteField(val3, "currentAmmo", val3.maxAmmo);
			}
		}

		private static void PulseNearby(Player source, float radius, float damage, float force)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: 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_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: 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_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)source == (Object)null)
			{
				return;
			}
			Vector3 position = ((Component)source).transform.position;
			Player[] array = Object.FindObjectsOfType<Player>();
			foreach (Player val in array)
			{
				if ((Object)(object)val == (Object)null || (Object)(object)val == (Object)(object)source || val.teamID == source.teamID || (Object)(object)val.data == (Object)null || val.data.dead)
				{
					continue;
				}
				Vector2 val2 = Vector2.op_Implicit(((Component)val).transform.position - position);
				if (!(((Vector2)(ref val2)).magnitude > radius))
				{
					((Damagable)val.data.healthHandler).CallTakeDamage(Vector2.one * damage, Vector2.op_Implicit(((Component)val).transform.position), ((Component)source).gameObject, source, false);
					if ((Object)(object)val.data.playerVel != (Object)null)
					{
						Vector2 val3 = ((((Vector2)(ref val2)).sqrMagnitude > 0.001f) ? ((Vector2)(ref val2)).normalized : Vector2.up);
						AddVelocity(val.data.playerVel, val3 * force);
					}
				}
			}
		}

		private static void AddVelocity(PlayerVelocity velocity, Vector2 add)
		{
			//IL_0006: 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_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_0014: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = ReadField<Vector2>(velocity, "velocity");
			WriteField(velocity, "velocity", val + add);
		}

		internal static T ReadField<T>(object target, string name)
		{
			if (target == null)
			{
				return default(T);
			}
			FieldInfo field = target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field == null)
			{
				return default(T);
			}
			object value = field.GetValue(target);
			if (value is T)
			{
				return (T)value;
			}
			return default(T);
		}

		private static void WriteField(object target, string name, object value)
		{
			if (target != null)
			{
				FieldInfo field = target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null)
				{
					field.SetValue(target, value);
				}
			}
		}
	}
	[HarmonyPatch(typeof(Block), "DoBlockAtPosition")]
	internal static class BlockPowerPatch
	{
		private static void Postfix(Block __instance)
		{
			Player val = BlockPowerTracker.ReadField<CharacterData>(__instance, "data")?.player;
			if (!((Object)(object)val == (Object)null))
			{
				((Component)val).gameObject.GetComponent<BlockPowerTracker>()?.Trigger(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(CardChoice), "GetRanomCard")]
	internal static class UltraRareRollPatch
	{
		private const float UltraRareKeepChance = 0.0015f;

		private static bool _suppress;

		private static readonly MethodInfo GetRandomCardMethod = AccessTools.Method(typeof(CardChoice), "GetRanomCard", (Type[])null, (Type[])null);

		private static void Postfix(CardChoice __instance, ref GameObject __result)
		{
			if (_suppress || (Object)(object)__result == (Object)null || !CardAvailabilityGate.TryGetGeneratedIndex(__result, out var index) || !CardAvailabilityGate.IsUltraRareIndex(index) || Random.value <= 0.0015f)
			{
				return;
			}
			for (int i = 0; i < 40; i++)
			{
				_suppress = true;
				object? obj = GetRandomCardMethod?.Invoke(__instance, null);
				GameObject val = (GameObject)((obj is GameObject) ? obj : null);
				_suppress = false;
				if (!((Object)(object)val == (Object)null))
				{
					if (!CardAvailabilityGate.TryGetGeneratedIndex(val, out var index2) || !CardAvailabilityGate.IsUltraRareIndex(index2))
					{
						__result = val;
						break;
					}
					if (Random.value <= 0.0015f)
					{
						__result = val;
						break;
					}
				}
			}
		}
	}
	public class Card001 : GeneratedCardBase
	{
		protected override int CardIndex => 1;
	}
	public class Card002 : GeneratedCardBase
	{
		protected override int CardIndex => 2;
	}
	public class Card003 : GeneratedCardBase
	{
		protected override int CardIndex => 3;
	}
	public class Card004 : GeneratedCardBase
	{
		protected override int CardIndex => 4;
	}
	public class Card005 : GeneratedCardBase
	{
		protected override int CardIndex => 5;
	}
	public class Card006 : GeneratedCardBase
	{
		protected override int CardIndex => 6;
	}
	public class Card007 : GeneratedCardBase
	{
		protected override int CardIndex => 7;
	}
	public class Card008 : GeneratedCardBase
	{
		protected override int CardIndex => 8;
	}
	public class Card009 : GeneratedCardBase
	{
		protected override int CardIndex => 9;
	}
	public class Card010 : GeneratedCardBase
	{
		protected override int CardIndex => 10;
	}
	public class Card011 : GeneratedCardBase
	{
		protected override int CardIndex => 11;
	}
	public class Card012 : GeneratedCardBase
	{
		protected override int CardIndex => 12;
	}
	public class Card013 : GeneratedCardBase
	{
		protected override int CardIndex => 13;
	}
	public class Card014 : GeneratedCardBase
	{
		protected override int CardIndex => 14;
	}
	public class Card015 : GeneratedCardBase
	{
		protected override int CardIndex => 15;
	}
	public class Card016 : GeneratedCardBase
	{
		protected override int CardIndex => 16;
	}
	public class Card017 : GeneratedCardBase
	{
		protected override int CardIndex => 17;
	}
	public class Card018 : GeneratedCardBase
	{
		protected override int CardIndex => 18;
	}
	public class Card019 : GeneratedCardBase
	{
		protected override int CardIndex => 19;
	}
	public class Card020 : GeneratedCardBase
	{
		protected override int CardIndex => 20;
	}
	public class Card021 : GeneratedCardBase
	{
		protected override int CardIndex => 21;
	}
	public class Card022 : GeneratedCardBase
	{
		protected override int CardIndex => 22;
	}
	public class Card023 : GeneratedCardBase
	{
		protected override int CardIndex => 23;
	}
	public class Card024 : GeneratedCardBase
	{
		protected override int CardIndex => 24;
	}
	public class Card025 : GeneratedCardBase
	{
		protected override int CardIndex => 25;
	}
	public class Card026 : GeneratedCardBase
	{
		protected override int CardIndex => 26;
	}
	public class Card027 : GeneratedCardBase
	{
		protected override int CardIndex => 27;
	}
	public class Card028 : GeneratedCardBase
	{
		protected override int CardIndex => 28;
	}
	public class Card029 : GeneratedCardBase
	{
		protected override int CardIndex => 29;
	}
	public class Card030 : GeneratedCardBase
	{
		protected override int CardIndex => 30;
	}
	public class Card031 : GeneratedCardBase
	{
		protected override int CardIndex => 31;
	}
	public class Card032 : GeneratedCardBase
	{
		protected override int CardIndex => 32;
	}
	public class Card033 : GeneratedCardBase
	{
		protected override int CardIndex => 33;
	}
	public class Card034 : GeneratedCardBase
	{
		protected override int CardIndex => 34;
	}
	public class Card035 : GeneratedCardBase
	{
		protected override int CardIndex => 35;
	}
	public class Card036 : GeneratedCardBase
	{
		protected override int CardIndex => 36;
	}
	public class Card037 : GeneratedCardBase
	{
		protected override int CardIndex => 37;
	}
	public class Card038 : GeneratedCardBase
	{
		protected override int CardIndex => 38;
	}
	public class Card039 : GeneratedCardBase
	{
		protected override int CardIndex => 39;
	}
	public class Card040 : GeneratedCardBase
	{
		protected override int CardIndex => 40;
	}
	public class Card041 : GeneratedCardBase
	{
		protected override int CardIndex => 41;
	}
	public class Card042 : GeneratedCardBase
	{
		protected override int CardIndex => 42;
	}
	public class Card043 : GeneratedCardBase
	{
		protected override int CardIndex => 43;
	}
	public class Card044 : GeneratedCardBase
	{
		protected override int CardIndex => 44;
	}
	public class Card045 : GeneratedCardBase
	{
		protected override int CardIndex => 45;
	}
	public class Card046 : GeneratedCardBase
	{
		protected override int CardIndex => 46;
	}
	public class Card047 : GeneratedCardBase
	{
		protected override int CardIndex => 47;
	}
	public class Card048 : GeneratedCardBase
	{
		protected override int CardIndex => 48;
	}
	public class Card049 : GeneratedCardBase
	{
		protected override int CardIndex => 49;
	}
	public class Card050 : GeneratedCardBase
	{
		protected override int CardIndex => 50;
	}
	public class Card051 : GeneratedCardBase
	{
		protected override int CardIndex => 51;
	}
	public class Card052 : GeneratedCardBase
	{
		protected override int CardIndex => 52;
	}
	public class Card053 : GeneratedCardBase
	{
		protected override int CardIndex => 53;
	}
	public class Card054 : GeneratedCardBase
	{
		protected override int CardIndex => 54;
	}
	public class Card055 : GeneratedCardBase
	{
		protected override int CardIndex => 55;
	}
	public class Card056 : GeneratedCardBase
	{
		protected override int CardIndex => 56;
	}
	public class Card057 : GeneratedCardBase
	{
		protected override int CardIndex => 57;
	}
	public class Card058 : GeneratedCardBase
	{
		protected override int CardIndex => 58;
	}
	public class Card059 : GeneratedCardBase
	{
		protected override int CardIndex => 59;
	}
	public class Card060 : GeneratedCardBase
	{
		protected override int CardIndex => 60;
	}
	public class Card061 : GeneratedCardBase
	{
		protected override int CardIndex => 61;
	}
	public class Card062 : GeneratedCardBase
	{
		protected override int CardIndex => 62;
	}
	public class Card063 : GeneratedCardBase
	{
		protected override int CardIndex => 63;
	}
	public class Card064 : GeneratedCardBase
	{
		protected override int CardIndex => 64;
	}
	public class Card065 : GeneratedCardBase
	{
		protected override int CardIndex => 65;
	}
	public class Card066 : GeneratedCardBase
	{
		protected override int CardIndex => 66;
	}
	public class Card067 : GeneratedCardBase
	{
		protected override int CardIndex => 67;
	}
	public class Card068 : GeneratedCardBase
	{
		protected override int CardIndex => 68;
	}
	public class Card069 : GeneratedCardBase
	{
		protected override int CardIndex => 69;
	}
	public class Card070 : GeneratedCardBase
	{
		protected override int CardIndex => 70;
	}
	public class Card071 : GeneratedCardBase
	{
		protected override int CardIndex => 71;
	}
	public class Card072 : GeneratedCardBase
	{
		protected override int CardIndex => 72;
	}
	public class Card073 : GeneratedCardBase
	{
		protected override int CardIndex => 73;
	}
	public class Card074 : GeneratedCardBase
	{
		protected override int CardIndex => 74;
	}
	public class Card075 : GeneratedCardBase
	{
		protected override int CardIndex => 75;
	}
	public class Card076 : GeneratedCardBase
	{
		protected override int CardIndex => 76;
	}
	public class Card077 : GeneratedCardBase
	{
		protected override int CardIndex => 77;
	}
	public class Card078 : GeneratedCardBase
	{
		protected override int CardIndex => 78;
	}
	public class Card079 : GeneratedCardBase
	{
		protected override int CardIndex => 79;
	}
	public class Card080 : GeneratedCardBase
	{
		protected override int CardIndex => 80;
	}
	public class Card081 : GeneratedCardBase
	{
		protected override int CardIndex => 81;
	}
	public class Card082 : GeneratedCardBase
	{
		protected override int CardIndex => 82;
	}
	public class Card083 : GeneratedCardBase
	{
		protected override int CardIndex => 83;
	}
	public class Card084 : GeneratedCardBase
	{
		protected override int CardIndex => 84;
	}
	public class Card085 : GeneratedCardBase
	{
		protected override int CardIndex => 85;
	}
	public class Card086 : GeneratedCardBase
	{
		protected override int CardIndex => 86;
	}
	public class Card087 : GeneratedCardBase
	{
		protected override int CardIndex => 87;
	}
	public class Card088 : GeneratedCardBase
	{
		protected override int CardIndex => 88;
	}
	public class Card089 : GeneratedCardBase
	{
		protected override int CardIndex => 89;
	}
	public class Card090 : GeneratedCardBase
	{
		protected override int CardIndex => 90;
	}
	public class Card091 : GeneratedCardBase
	{
		protected override int CardIndex => 91;
	}
	public class Card092 : GeneratedCardBase
	{
		protected override int CardIndex => 92;
	}
	public class Card093 : GeneratedCardBase
	{
		protected override int CardIndex => 93;
	}
	public class Card094 : GeneratedCardBase
	{
		protected override int CardIndex => 94;
	}
	public class Card095 : GeneratedCardBase
	{
		protected override int CardIndex => 95;
	}
	public class Card096 : GeneratedCardBase
	{
		protected override int CardIndex => 96;
	}
	public class Card097 : GeneratedCardBase
	{
		protected override int CardIndex => 97;
	}
	public class Card098 : GeneratedCardBase
	{
		protected override int CardIndex => 98;
	}
	public class Card099 : GeneratedCardBase
	{
		protected override int CardIndex => 99;
	}
	public class Card100 : GeneratedCardBase
	{
		protected override int CardIndex => 100;
	}
	public class Card101 : GeneratedCardBase
	{
		protected override int CardIndex => 101;
	}
	public class Card102 : GeneratedCardBase
	{
		protected override int CardIndex => 102;
	}
	public class Card103 : GeneratedCardBase
	{
		protected override int CardIndex => 103;
	}
	public class Card104 : GeneratedCardBase
	{
		protected override int CardIndex => 104;
	}
	public class Card105 : GeneratedCardBase
	{
		protected override int CardIndex => 105;
	}
	public class Card106 : GeneratedCardBase
	{
		protected override int CardIndex => 106;
	}
	public class Card107 : GeneratedCardBase
	{
		protected override int CardIndex => 107;
	}
	public class Card108 : GeneratedCardBase
	{
		protected override int CardIndex => 108;
	}
	public class Card109 : GeneratedCardBase
	{
		protected override int CardIndex => 109;
	}
	public class Card110 : GeneratedCardBase
	{
		protected override int CardIndex => 110;
	}
	public class Card111 : GeneratedCardBase
	{
		protected override int CardIndex => 111;
	}
	public class Card112 : GeneratedCardBase
	{
		protected override int CardIndex => 112;
	}
	public class Card113 : GeneratedCardBase
	{
		protected override int CardIndex => 113;
	}
	public class Card114 : GeneratedCardBase
	{
		protected override int CardIndex => 114;
	}
	public class Card115 : GeneratedCardBase
	{
		protected override int CardIndex => 115;
	}
	public class Card116 : GeneratedCardBase
	{
		protected override int CardIndex => 116;
	}
	public class Card117 : GeneratedCardBase
	{
		protected override int CardIndex => 117;
	}
	public class Card118 : GeneratedCardBase
	{
		protected override int CardIndex => 118;
	}
	public class Card119 : GeneratedCardBase
	{
		protected override int CardIndex => 119;
	}
	public class Card120 : GeneratedCardBase
	{
		protected override int CardIndex => 120;
	}
	public class Card121 : GeneratedCardBase
	{
		protected override int CardIndex => 121;
	}
	public class Card122 : GeneratedCardBase
	{
		protected override int CardIndex => 122;
	}
	public class Card123 : GeneratedCardBase
	{
		protected override int CardIndex => 123;
	}
	public class Card124 : GeneratedCardBase
	{
		protected override int CardIndex => 124;
	}
	public class Card125 : GeneratedCardBase
	{
		protected override int CardIndex => 125;
	}
	public class Card126 : GeneratedCardBase
	{
		protected override int CardIndex => 126;
	}
	public class Card127 : GeneratedCardBase
	{
		protected override int CardIndex => 127;
	}
	public class Card128 : GeneratedCardBase
	{
		protected override int CardIndex => 128;
	}
	public class Card129 : GeneratedCardBase
	{
		protected override int CardIndex => 129;
	}
	public class Card130 : GeneratedCardBase
	{
		protected override int CardIndex => 130;
	}
	public class Card131 : GeneratedCardBase
	{
		protected override int CardIndex => 131;
	}
	public class Card132 : GeneratedCardBase
	{
		protected override int CardIndex => 132;
	}
	public class Card133 : GeneratedCardBase
	{
		protected override int CardIndex => 133;
	}
	public class Card134 : GeneratedCardBase
	{
		protected override int CardIndex => 134;
	}
	public class Card135 : GeneratedCardBase
	{
		protected override int CardIndex => 135;
	}
	public class Card136 : GeneratedCardBase
	{
		protected override int CardIndex => 136;
	}
	public class Card137 : GeneratedCardBase
	{
		protected override int CardIndex => 137;
	}
	public class Card138 : GeneratedCardBase
	{
		protected override int CardIndex => 138;
	}
	public class Card139 : GeneratedCardBase
	{
		protected override int CardIndex => 139;
	}
	public class Card140 : GeneratedCardBase
	{
		protected override int CardIndex => 140;
	}
	public class Card141 : GeneratedCardBase
	{
		protected override int CardIndex => 141;
	}
	public class Card142 : GeneratedCardBase
	{
		protected override int CardIndex => 142;
	}
	public class Card143 : GeneratedCardBase
	{
		protected override int CardIndex => 143;
	}
	public class Card144 : GeneratedCardBase
	{
		protected override int CardIndex => 144;
	}
	public class Card145 : GeneratedCardBase
	{
		protected override int CardIndex => 145;
	}
	public class Card146 : GeneratedCardBase
	{
		protected override int CardIndex => 146;
	}
	public class Card147 : GeneratedCardBase
	{
		protected override int CardIndex => 147;
	}
	public class Card148 : GeneratedCardBase
	{
		protected override int CardIndex => 148;
	}
	public class Card149 : GeneratedCardBase
	{
		protected override int CardIndex => 149;
	}
	public class Card150 : GeneratedCardBase
	{
		protected override int CardIndex => 150;
	}
	public class Card151 : GeneratedCardBase
	{
		protected override int CardIndex => 151;
	}
	public class Card152 : GeneratedCardBase
	{
		protected override int CardIndex => 152;
	}
	public class Card153 : GeneratedCardBase
	{
		protected override int CardIndex => 153;
	}
	public class Card154 : GeneratedCardBase
	{
		protected override int CardIndex => 154;
	}
	public class Card155 : GeneratedCardBase
	{
		protected override int CardIndex => 155;
	}
	public class Card156 : GeneratedCardBase
	{
		protected override int CardIndex => 156;
	}
	public class Card157 : GeneratedCardBase
	{
		protected override int CardIndex => 157;
	}
	public class Card158 : GeneratedCardBase
	{
		protected override int CardIndex => 158;
	}
	public class Card159 : GeneratedCardBase
	{
		protected override int CardIndex => 159;
	}
	public class Card160 : GeneratedCardBase
	{
		protected override int CardIndex => 160;
	}
	public class Card161 : GeneratedCardBase
	{
		protected override int CardIndex => 161;
	}
	public class Card162 : GeneratedCardBase
	{
		protected override int CardIndex => 162;
	}
	public class Card163 : GeneratedCardBase
	{
		protected override int CardIndex => 163;
	}
	public class Card164 : GeneratedCardBase
	{
		protected override int CardIndex => 164;
	}
	public class Card165 : GeneratedCardBase
	{
		protected override int CardIndex => 165;
	}
	public class Card166 : GeneratedCardBase
	{
		protected override int CardIndex => 166;
	}
	public class Card167 : GeneratedCardBase
	{
		protected override int CardIndex => 167;
	}
	public class Card168 : GeneratedCardBase
	{
		protected override int CardIndex => 168;
	}
	public class Card169 : GeneratedCardBase
	{
		protected override int CardIndex => 169;
	}
	public class Card170 : GeneratedCardBase
	{
		protected override int CardIndex => 170;
	}
	public class Card171 : GeneratedCardBase
	{
		protected override int CardIndex => 171;
	}
	public class Card172 : GeneratedCardBase
	{
		protected override int CardIndex => 172;
	}
	public class Card173 : GeneratedCardBase
	{
		protected override int CardIndex => 173;
	}
	public class Card174 : GeneratedCardBase
	{
		protected override int CardIndex => 174;
	}
	public class Card175 : GeneratedCardBase
	{
		protected override int CardIndex => 175;
	}
	public class Card176 : GeneratedCardBase
	{
		protected override int CardIndex => 176;
	}
	public class Card177 : GeneratedCardBase
	{
		protected override int CardIndex => 177;
	}
	public class Card178 : GeneratedCardBase
	{
		protected override int CardIndex => 178;
	}
	public class Card179 : GeneratedCardBase
	{
		protected override int CardIndex => 179;
	}
	public class Card180 : GeneratedCardBase
	{
		protected override int CardIndex => 180;
	}
	public class Card181 : GeneratedCardBase
	{
		protected override int CardIndex => 181;
	}
	public class Card182 : GeneratedCardBase
	{
		protected override int CardIndex => 182;
	}
	public class Card183 : GeneratedCardBase
	{
		protected override int CardIndex => 183;
	}
	public class Card184 : GeneratedCardBase
	{
		protected override int CardIndex => 184;
	}
	public class Card185 : GeneratedCardBase
	{
		protected override int CardIndex => 185;
	}
	public class Card186 : GeneratedCardBase
	{
		protected override int CardIndex => 186;
	}
	public class Card187 : GeneratedCardBase
	{
		protected override int CardIndex => 187;
	}
	public class Card188 : GeneratedCardBase
	{
		protected override int CardIndex => 188;
	}
	public class Card189 : GeneratedCardBase
	{
		protected override int CardIndex => 189;
	}
	public class Card190 : GeneratedCardBase
	{
		protected override int CardIndex => 190;
	}
	public class Card191 : GeneratedCardBase
	{
		protected override int CardIndex => 191;
	}
	public class Card192 : GeneratedCardBase
	{
		protected override int CardIndex => 192;
	}
	public class Card193 : GeneratedCardBase
	{
		protected override int CardIndex => 193;
	}
	public class Card194 : GeneratedCardBase
	{
		protected override int CardIndex => 194;
	}
	public class Card195 : GeneratedCardBase
	{
		protected override int CardIndex => 195;
	}
	public class Card196 : GeneratedCardBase
	{
		protected override int CardIndex => 196;
	}
	public class Card197 : GeneratedCardBase
	{
		protected override int CardIndex => 197;
	}
	public class Card198 : GeneratedCardBase
	{
		protected override int CardIndex => 198;
	}
	public class Card199 : GeneratedCardBase
	{
		protected override int CardIndex => 199;
	}
	public class Card200 : GeneratedCardBase
	{
		protected override int CardIndex => 200;
	}
	public class Card201 : GeneratedCardBase
	{
		protected override int CardIndex => 201;
	}
	public class Card202 : GeneratedCardBase
	{
		protected override int CardIndex => 202;
	}
	public class Card203 : GeneratedCardBase
	{
		protected override int CardIndex => 203;
	}
	public class Card204 : GeneratedCardBase
	{
		protected override int CardIndex => 204;
	}
	public class Card205 : GeneratedCardBase
	{
		protected override int CardIndex => 205;
	}
	public class Card206 : GeneratedCardBase
	{
		protected override int CardIndex => 206;
	}
	public class Card207 : GeneratedCardBase
	{
		protected override int CardIndex => 207;
	}
	public class Card208 : GeneratedCardBase
	{
		protected override int CardIndex => 208;
	}
	public class Card209 : GeneratedCardBase
	{
		protected override int CardIndex => 209;
	}
	public class Card210 : GeneratedCardBase
	{
		protected override int CardIndex => 210;
	}
}