Decompiled source of DolysCards v0.1.0

plugins\RoundsDolyMods.dll

Decompiled 6 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using RarityLib.Utils;
using RoundsDolyMods.Cards;
using RoundsDolyMods.Effects;
using UnboundLib.Cards;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RoundsDolyMods")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+839a0660265a5c9417d73eb8ca8fba237c169933")]
[assembly: AssemblyProduct("RoundsDolyMods")]
[assembly: AssemblyTitle("RoundsDolyMods")]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 RoundsDolyMods
{
	internal static class CardStats
	{
		internal static CardInfoStat Positive(string stat, string amount)
		{
			return Build(stat, amount, positive: true);
		}

		internal static CardInfoStat Negative(string stat, string amount)
		{
			return Build(stat, amount, positive: false);
		}

		internal static CardInfoStat Neutral(string stat, string amount)
		{
			return Build(stat, amount, positive: true);
		}

		private static CardInfoStat Build(string stat, string amount, bool positive)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			return new CardInfoStat
			{
				positive = positive,
				stat = stat,
				amount = amount,
				simepleAmount = (SimpleAmount)0
			};
		}
	}
	internal static class ComponentExtensions
	{
		internal static T GetOrAddComponent<T>(this GameObject gameObject) where T : Component
		{
			T component = gameObject.GetComponent<T>();
			return (component != null) ? component : gameObject.AddComponent<T>();
		}

		internal static T GetOrAddComponent<T>(this Component component) where T : Component
		{
			return component.gameObject.GetOrAddComponent<T>();
		}
	}
	internal static class DolyRarityHelper
	{
		internal static Rarity Resolve(string rarityName, Rarity fallback)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrWhiteSpace(rarityName))
			{
				return fallback;
			}
			try
			{
				return RarityUtils.GetRarity(rarityName);
			}
			catch
			{
				return fallback;
			}
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.dolyfin.rounds.dolymods", "Doly's Cards", "0.1.0")]
	[BepInProcess("Rounds.exe")]
	public sealed class RoundsDolyModsPlugin : BaseUnityPlugin
	{
		internal const string ModId = "com.dolyfin.rounds.dolymods";

		internal const string ModName = "Doly's Cards";

		internal const string ModInitials = "DOLY";

		internal const string Version = "0.1.0";

		internal static RoundsDolyModsPlugin? Instance { get; private set; }

		private void Awake()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			Instance = this;
			Harmony val = new Harmony("com.dolyfin.rounds.dolymods");
			val.PatchAll();
		}

		private void Start()
		{
			CustomCard.BuildCard<HealthCharmCard>();
			CustomCard.BuildCard<DamageCharmCard>();
			CustomCard.BuildCard<MegaCard>();
			CustomCard.BuildCard<GiantSlayerCard>();
			CustomCard.BuildCard<CutDownCard>();
			CustomCard.BuildCard<GreviousWoundsCard>();
			CustomCard.BuildCard<SuppressorCard>();
			CustomCard.BuildCard<Makeshift2xScopeCard>();
			CustomCard.BuildCard<Wobbly6xScopeCard>();
			CustomCard.BuildCard<DuctTaped12xScopeCard>();
			CustomCard.BuildCard<ScopiestScopeCard>();
			CustomCard.BuildCard<AtchissonAa12Card>();
			CustomCard.BuildCard<FriendliestOfFiresCard>();
			CustomCard.BuildCard<ExtendedMagazineCard>();
			CustomCard.BuildCard<DrumMagCard>();
		}
	}
}
namespace RoundsDolyMods.Patches
{
	[HarmonyPatch(typeof(HealthHandler), "Heal")]
	internal static class HealthHandlerPatches
	{
		private static bool Prefix(HealthHandler __instance)
		{
			HealBlockDebuff healBlockDebuff = ((Component)__instance).GetComponent<HealBlockDebuff>() ?? ((Component)__instance).GetComponentInParent<HealBlockDebuff>();
			return healBlockDebuff == null || !healBlockDebuff.IsActive;
		}
	}
	[HarmonyPatch(typeof(HealthHandler), "TakeDamage")]
	internal static class SelfDamagePatches
	{
		private static void Prefix(HealthHandler __instance, ref Vector2 damage, Player damagingPlayer)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (damagingPlayer == null)
			{
				return;
			}
			Player val = ((Component)__instance).GetComponent<Player>() ?? ((Component)__instance).GetComponentInParent<Player>();
			if (val != null && !((Object)(object)val != (Object)(object)damagingPlayer))
			{
				SelfDamageReductionEffect component = ((Component)val).GetComponent<SelfDamageReductionEffect>();
				if (component != null && component.Stacks > 0)
				{
					damage *= component.GetMultiplier();
				}
			}
		}
	}
}
namespace RoundsDolyMods.Effects
{
	internal sealed class CutDownEffect : ProjectileEffectBase
	{
		internal int Stacks { get; set; }

		protected override void AttachToProjectile(GameObject projectile, ProjectileHit projectileHit)
		{
			GameObject projectile2 = projectile;
			if (Stacks <= 0)
			{
				return;
			}
			projectileHit.AddHitActionWithData((Action<HitInfo>)delegate(HitInfo hit)
			{
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				HealthHandler hitHealth = ProjectileEffectBase.GetHitHealth(hit);
				CharacterData hitCharacterData = ProjectileEffectBase.GetHitCharacterData(hit);
				if (hitHealth != null && hitCharacterData != null)
				{
					float amount = hitCharacterData.maxHealth * 0.05f * (float)Stacks;
					ProjectileEffectBase.ApplyBonusDamage(hitHealth, amount, hit.point, projectile2, base.OwnerPlayer);
				}
			});
		}
	}
	internal sealed class DamageCharmEffect : ProjectileEffectBase
	{
		internal int Stacks { get; set; }

		protected override void AttachToProjectile(GameObject projectile, ProjectileHit projectileHit)
		{
			GameObject projectile2 = projectile;
			float bonusDamage = 20f * (float)Stacks;
			if (bonusDamage <= 0f)
			{
				return;
			}
			projectileHit.AddHitActionWithData((Action<HitInfo>)delegate(HitInfo hit)
			{
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				HealthHandler hitHealth = ProjectileEffectBase.GetHitHealth(hit);
				if (hitHealth != null)
				{
					ProjectileEffectBase.ApplyBonusDamage(hitHealth, bonusDamage, hit.point, projectile2, base.OwnerPlayer);
				}
			});
		}
	}
	internal sealed class GiantSlayerEffect : ProjectileEffectBase
	{
		internal int Stacks { get; set; }

		protected override void AttachToProjectile(GameObject projectile, ProjectileHit projectileHit)
		{
			ProjectileHit projectileHit2 = projectileHit;
			GameObject projectile2 = projectile;
			if (Stacks <= 0)
			{
				return;
			}
			projectileHit2.AddHitActionWithData((Action<HitInfo>)delegate(HitInfo hit)
			{
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				HealthHandler hitHealth = ProjectileEffectBase.GetHitHealth(hit);
				CharacterData hitCharacterData = ProjectileEffectBase.GetHitCharacterData(hit);
				CharacterData ownerData = base.OwnerData;
				if (hitHealth != null && ownerData != null && hitCharacterData != null && !(hitCharacterData.maxHealth < ownerData.maxHealth * 2f))
				{
					float num = projectileHit2.damage + projectileHit2.percentageDamage * hitCharacterData.maxHealth;
					float amount = num * (float)Stacks;
					ProjectileEffectBase.ApplyBonusDamage(hitHealth, amount, hit.point, projectile2, base.OwnerPlayer);
				}
			});
		}
	}
	internal sealed class GreviousWoundsEffect : ProjectileEffectBase
	{
		internal int Stacks { get; set; }

		protected override void AttachToProjectile(GameObject projectile, ProjectileHit projectileHit)
		{
			if (Stacks <= 0)
			{
				return;
			}
			projectileHit.AddHitActionWithData((Action<HitInfo>)delegate(HitInfo hit)
			{
				HealthHandler hitHealth = ProjectileEffectBase.GetHitHealth(hit);
				if (hitHealth != null)
				{
					HealBlockDebuff orAddComponent = ((Component)(object)hitHealth).GetOrAddComponent<HealBlockDebuff>();
					orAddComponent.Apply(4f * (float)Stacks);
				}
			});
		}
	}
	internal sealed class HealBlockDebuff : MonoBehaviour
	{
		private float expiresAt;

		internal bool IsActive => Time.time < expiresAt;

		internal void Apply(float durationSeconds)
		{
			expiresAt = Mathf.Max(expiresAt, Time.time + durationSeconds);
		}

		private void Update()
		{
			if (!IsActive && expiresAt > 0f)
			{
				Object.Destroy((Object)(object)this);
			}
		}
	}
	internal abstract class ProjectileEffectBase : MonoBehaviour
	{
		private Gun? hookedGun;

		protected CharacterData? OwnerData { get; private set; }

		protected Player? OwnerPlayer { get; private set; }

		protected virtual void Start()
		{
			ResolveOwner();
			TryHookGun();
		}

		protected virtual void Update()
		{
			TryHookGun();
		}

		protected virtual void OnDestroy()
		{
			UnhookGun();
		}

		protected static HealthHandler? GetHitHealth(HitInfo hit)
		{
			if (hit.transform == null)
			{
				return null;
			}
			return ((Component)hit.transform).GetComponent<HealthHandler>() ?? ((Component)hit.transform).GetComponentInParent<HealthHandler>();
		}

		protected static CharacterData? GetHitCharacterData(HitInfo hit)
		{
			if (hit.transform == null)
			{
				return null;
			}
			return ((Component)hit.transform).GetComponent<CharacterData>() ?? ((Component)hit.transform).GetComponentInParent<CharacterData>();
		}

		protected static void ApplyBonusDamage(HealthHandler target, float amount, Vector2 point, GameObject damagingWeapon, Player? damagingPlayer)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (!(amount <= 0f))
			{
				((Damagable)target).TakeDamage(Vector2.up * amount, point, damagingWeapon, damagingPlayer, true, true);
			}
		}

		protected abstract void AttachToProjectile(GameObject projectile, ProjectileHit projectileHit);

		private void OnProjectileShot(GameObject projectile)
		{
			if (((Behaviour)this).isActiveAndEnabled)
			{
				ProjectileHit component = projectile.GetComponent<ProjectileHit>();
				if (component != null)
				{
					AttachToProjectile(projectile, component);
				}
			}
		}

		private void ResolveOwner()
		{
			if (OwnerPlayer == null)
			{
				Player obj = ((Component)this).GetComponent<Player>() ?? ((Component)this).GetComponentInParent<Player>();
				Player val = obj;
				OwnerPlayer = obj;
			}
			if (OwnerData == null)
			{
				CharacterData obj2 = ((Component)this).GetComponent<CharacterData>() ?? ((Component)this).GetComponentInParent<CharacterData>();
				CharacterData val2 = obj2;
				OwnerData = obj2;
			}
		}

		private void TryHookGun()
		{
			ResolveOwner();
			Gun val = OwnerData?.weaponHandler?.gun;
			if (val != null && !((Object)(object)val == (Object)(object)hookedGun))
			{
				UnhookGun();
				hookedGun = val;
				Gun? obj = hookedGun;
				obj.ShootPojectileAction = (Action<GameObject>)Delegate.Combine(obj.ShootPojectileAction, new Action<GameObject>(OnProjectileShot));
			}
		}

		private void UnhookGun()
		{
			if (hookedGun != null)
			{
				Gun? obj = hookedGun;
				obj.ShootPojectileAction = (Action<GameObject>)Delegate.Remove(obj.ShootPojectileAction, new Action<GameObject>(OnProjectileShot));
				hookedGun = null;
			}
		}
	}
	internal sealed class SelfDamageReductionEffect : MonoBehaviour
	{
		internal int Stacks { get; set; }

		internal float GetMultiplier()
		{
			if (Stacks <= 0)
			{
				return 1f;
			}
			return Mathf.Pow(0.01f, (float)Stacks);
		}
	}
}
namespace RoundsDolyMods.Cards
{
	internal sealed class AtchissonAa12Card : DolyCard
	{
		protected override string CardTitle => "Atchisson AA-12";

		protected override string CardDescription => "Full Auto Shotgun";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.numberOfProjectiles = 5;
			gun.projectileSpeed = 2f;
			gun.ammo = 15;
			gun.damage = 0.5f;
			gun.projectileSize = -0.3f;
			gun.spread = 0.4f;
			gun.destroyBulletAfter = 0.5f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[5]
			{
				CardStats.Positive("Bullets", "+5"),
				CardStats.Positive("Bullet Speed", "+100%"),
				CardStats.Positive("Max Ammo", "+15"),
				CardStats.Negative("Damage", "-50%"),
				CardStats.Negative("Bullet Size", "-30%")
			};
		}
	}
	internal sealed class CutDownCard : DolyCard
	{
		protected override string CardTitle => "Cut Down";

		protected override string CardDescription => "On hit, bullets deal bonus damage equal to 5% of the target's max health.";

		protected override string RarityName => "Exotic";

		protected override Rarity FallbackRarity => (Rarity)2;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.attackSpeedMultiplier = 1.25f;
			gun.damage = 0.75f;
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			((Component)player).gameObject.GetOrAddComponent<CutDownEffect>().Stacks++;
		}

		public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			CutDownEffect component = ((Component)player).gameObject.GetComponent<CutDownEffect>();
			if (component != null)
			{
				component.Stacks--;
				if (component.Stacks <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
			}
		}

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[3]
			{
				CardStats.Positive("Attack Speed", "+25%"),
				CardStats.Negative("Damage", "-25%"),
				CardStats.Positive("On Hit", "+5% target HP")
			};
		}
	}
	internal sealed class DamageCharmCard : DolyCard
	{
		protected override string CardTitle => "Damage Charm";

		protected override string RarityName => "Trinket";

		protected override Rarity FallbackRarity => (Rarity)0;

		protected override string CardDescription => "On hit, bullets deal 20 bonus damage.";

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

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			((Component)player).gameObject.GetOrAddComponent<DamageCharmEffect>().Stacks++;
		}

		public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			DamageCharmEffect component = ((Component)player).gameObject.GetComponent<DamageCharmEffect>();
			if (component != null)
			{
				component.Stacks--;
				if (component.Stacks <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
			}
		}

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[1] { CardStats.Positive("On Hit", "+20 damage") };
		}
	}
	internal abstract class DolyCard : CustomCard
	{
		protected virtual string CardDescription => string.Empty;

		protected virtual string RarityName => "Common";

		protected virtual Rarity FallbackRarity => (Rarity)0;

		protected virtual CardThemeColorType CardTheme => (CardThemeColorType)7;

		protected abstract string CardTitle { get; }

		protected override string GetTitle()
		{
			return CardTitle;
		}

		protected override string GetDescription()
		{
			return CardDescription;
		}

		protected override GameObject? GetCardArt()
		{
			return null;
		}

		protected override Rarity GetRarity()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			return DolyRarityHelper.Resolve(RarityName, FallbackRarity);
		}

		protected override CardThemeColorType GetTheme()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			return CardTheme;
		}

		public override string GetModName()
		{
			return "DOLY";
		}
	}
	internal sealed class DrumMagCard : DolyCard
	{
		protected override string CardTitle => "Drum Mag";

		protected override string RarityName => "Rare";

		protected override Rarity FallbackRarity => (Rarity)2;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.ammo = 15;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[1] { CardStats.Positive("Max Ammo", "+15") };
		}
	}
	internal sealed class DuctTaped12xScopeCard : DolyCard
	{
		protected override string CardTitle => "Duct-Taped 12x Scope";

		protected override string CardDescription => "I fired, and then I fired again. I missed both times.";

		protected override string RarityName => "Rare";

		protected override Rarity FallbackRarity => (Rarity)2;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.projectileSpeed = 13f;
			gun.damage = 1.8f;
			gun.spread = 0.3f;
			gun.ammo = -1;
			statModifiers.attackSpeedMultiplier = 0.7f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[5]
			{
				CardStats.Positive("Bullet Speed", "+1200%"),
				CardStats.Positive("Damage", "+80%"),
				CardStats.Negative("Spread", "+0.3"),
				CardStats.Negative("Attack Speed", "-30%"),
				CardStats.Negative("Max Ammo", "-1")
			};
		}
	}
	internal sealed class ExtendedMagazineCard : DolyCard
	{
		protected override string CardTitle => "Extended Magazine";

		protected override string RarityName => "Common";

		protected override Rarity FallbackRarity => (Rarity)0;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.ammo = 5;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[1] { CardStats.Positive("Max Ammo", "+5") };
		}
	}
	internal sealed class FriendliestOfFiresCard : DolyCard
	{
		protected override string CardTitle => "Friendliest of Fires";

		protected override string CardDescription => "Perhaps a hug?";

		protected override string RarityName => "Rare";

		protected override Rarity FallbackRarity => (Rarity)2;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			((Component)player).gameObject.GetOrAddComponent<SelfDamageReductionEffect>().Stacks++;
		}

		public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			SelfDamageReductionEffect component = ((Component)player).gameObject.GetComponent<SelfDamageReductionEffect>();
			if (component != null)
			{
				component.Stacks--;
				if (component.Stacks <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
			}
		}

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[1] { CardStats.Positive("Self Damage", "-99%") };
		}
	}
	internal sealed class GiantSlayerCard : DolyCard
	{
		protected override string CardTitle => "Giant Slayer";

		protected override string CardDescription => "Bullets deal double damage to targets with at least twice your max health.";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.damage = 0.8f;
			statModifiers.health = 0.8f;
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			((Component)player).gameObject.GetOrAddComponent<GiantSlayerEffect>().Stacks++;
		}

		public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			GiantSlayerEffect component = ((Component)player).gameObject.GetComponent<GiantSlayerEffect>();
			if (component != null)
			{
				component.Stacks--;
				if (component.Stacks <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
			}
		}

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[3]
			{
				CardStats.Positive("On Hit", "2x damage vs targets with 2x HP"),
				CardStats.Negative("Damage", "-20%"),
				CardStats.Negative("Health", "-20%")
			};
		}
	}
	internal sealed class GreviousWoundsCard : DolyCard
	{
		protected override string CardTitle => "Grievous Wounds";

		protected override string CardDescription => "On hit, disable healing for 4 seconds.";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			block.cdMultiplier = 1.2f;
			statModifiers.attackSpeedMultiplier = 0.8f;
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			((Component)player).gameObject.GetOrAddComponent<GreviousWoundsEffect>().Stacks++;
		}

		public override void OnRemoveCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			GreviousWoundsEffect component = ((Component)player).gameObject.GetComponent<GreviousWoundsEffect>();
			if (component != null)
			{
				component.Stacks--;
				if (component.Stacks <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
			}
		}

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[3]
			{
				CardStats.Negative("Block Cooldown", "+20%"),
				CardStats.Negative("Attack Speed", "-20%"),
				CardStats.Positive("On Hit", "no healing for 4s")
			};
		}
	}
	internal sealed class HealthCharmCard : DolyCard
	{
		protected override string CardTitle => "Health Charm";

		protected override string RarityName => "Trinket";

		protected override Rarity FallbackRarity => (Rarity)0;

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

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			data.maxHealth += 60f;
			data.health += 60f;
		}

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[1] { CardStats.Positive("Health", "+60") };
		}
	}
	internal sealed class Makeshift2xScopeCard : DolyCard
	{
		protected override string CardTitle => "Makeshift 2x Scope";

		protected override string CardDescription => "I fired. I missed.";

		protected override string RarityName => "Common";

		protected override Rarity FallbackRarity => (Rarity)0;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.projectileSpeed = 3f;
			gun.damage = 1.2f;
			gun.spread = 0.1f;
			gun.ammo = -1;
			statModifiers.attackSpeedMultiplier = 0.8f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[5]
			{
				CardStats.Positive("Bullet Speed", "+200%"),
				CardStats.Positive("Damage", "+20%"),
				CardStats.Negative("Spread", "+0.1"),
				CardStats.Negative("Attack Speed", "-20%"),
				CardStats.Negative("Max Ammo", "-1")
			};
		}
	}
	internal sealed class MegaCard : DolyCard
	{
		protected override string CardTitle => "MEGA";

		protected override string CardDescription => "Doctor... you're huge!";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			statModifiers.sizeMultiplier = 2f;
			statModifiers.health = 2.5f;
			statModifiers.jump = 1.3f;
			statModifiers.gravity = 1.3f;
			gun.damage = 1.5f;
			gun.projectileSize = 0.4f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[6]
			{
				CardStats.Positive("Size", "+100%"),
				CardStats.Positive("Health", "+150%"),
				CardStats.Positive("Damage", "+50%"),
				CardStats.Positive("Bullet Size", "+40%"),
				CardStats.Positive("Jump Height", "+30%"),
				CardStats.Negative("Gravity", "+30%")
			};
		}
	}
	internal sealed class ScopiestScopeCard : DolyCard
	{
		protected override string CardTitle => "Scopiest Scope";

		protected override string CardDescription => "*And then I had a popsicle.*";

		protected override string RarityName => "Rare";

		protected override Rarity FallbackRarity => (Rarity)2;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.projectileSpeed = 2f;
			gun.ammo = -1;
			statModifiers.attackSpeedMultiplier = 0.9f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[4]
			{
				CardStats.Positive("Bullet Speed", "+100%"),
				CardStats.Positive("Current Spread", "reset to 0"),
				CardStats.Negative("Attack Speed", "-10%"),
				CardStats.Negative("Max Ammo", "-1")
			};
		}
	}
	internal sealed class SuppressorCard : DolyCard
	{
		protected override string CardTitle => "Suppressor";

		protected override string CardDescription => "On pickup, converts current excess fire rate into damage, then sets fire delay to 0.20s.";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
		}

		public override void OnAddCard(Player player, Gun gun, GunAmmo gunAmmo, CharacterData data, HealthHandler health, Gravity gravity, Block block, CharacterStatModifiers characterStats)
		{
			float num = gun.attackSpeed / Mathf.Max(0.001f, characterStats.attackSpeedMultiplier);
			int num2 = Mathf.FloorToInt(Mathf.Max(0f, 0.2f - num) / 0.01f);
			if (num2 > 0)
			{
				gun.damage *= 1f + (float)num2 * 0.1f;
			}
			gun.attackSpeed = 0.2f;
		}

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[2]
			{
				CardStats.Positive("Fire Delay", "set to 0.20s"),
				CardStats.Positive("Damage", "bonus on pickup")
			};
		}
	}
	internal sealed class Wobbly6xScopeCard : DolyCard
	{
		protected override string CardTitle => "Wobbly 6x Scope";

		protected override string CardDescription => "So I fired again. I missed.";

		protected override string RarityName => "Uncommon";

		protected override Rarity FallbackRarity => (Rarity)1;

		public override void SetupCard(CardInfo cardInfo, Gun gun, ApplyCardStats cardStats, CharacterStatModifiers statModifiers, Block block)
		{
			gun.projectileSpeed = 7f;
			gun.damage = 1.4f;
			gun.spread = 0.2f;
			gun.ammo = -1;
			statModifiers.attackSpeedMultiplier = 0.7f;
		}

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

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

		protected override CardInfoStat[] GetStats()
		{
			return (CardInfoStat[])(object)new CardInfoStat[5]
			{
				CardStats.Positive("Bullet Speed", "+600%"),
				CardStats.Positive("Damage", "+40%"),
				CardStats.Negative("Spread", "+0.2"),
				CardStats.Negative("Attack Speed", "-30%"),
				CardStats.Negative("Max Ammo", "-1")
			};
		}
	}
}