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")
};
}
}
}