Decompiled source of Storm Javelin The Mod v0.1.0

BepInEx/plugins/com.binbin.StormJavelin.dll

Decompiled a week ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Obeliskial_Essentials;
using TMPro;
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("com.binbin.StormJavelin")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: AssemblyInformationalVersion("0.1.0+63b8b3346603a96afb17be27d2ce8b7a77372697")]
[assembly: AssemblyProduct("StormJavelin")]
[assembly: AssemblyTitle("com.binbin.StormJavelin")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace StormJavelin
{
	public class CustomFunctions
	{
		public enum AppliesTo
		{
			None,
			Global,
			Monsters,
			Heroes,
			ThisHero
		}

		public enum CharacterHas
		{
			Perk,
			Item,
			Trait
		}

		public enum IsAuraOrCurse
		{
			Aura,
			Curse,
			Both
		}

		public static string perkBase = "<RenameThisForPerks>";

		public static void TraitHeal(ref Character _character, Character _target, int healAmount, string traitName)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			int num = healAmount;
			if (_target.GetHpLeftForMax() < healAmount)
			{
				num = _target.GetHpLeftForMax();
			}
			if (num > 0)
			{
				_target.ModifyHp(num, true, true);
				CastResolutionForCombatText val = new CastResolutionForCombatText();
				val.heal = num;
				if (_target.HeroItem != null)
				{
					((CharacterItem)_target.HeroItem).ScrollCombatTextDamageNew(val);
					EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)_target.HeroItem).CharImageT, false, 0f);
				}
				else
				{
					((CharacterItem)_target.NPCItem).ScrollCombatTextDamageNew(val);
					EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)_target.NPCItem).CharImageT, false, 0f);
				}
				_target.SetEvent((EventActivation)15, (Character)null, 0, "");
				_character.SetEvent((EventActivation)14, _target, 0, "");
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void TraitHealHero(ref Character _character, ref Hero _target, int healAmount, string traitName)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			if (_target == null || !((Character)_target).IsHero || !((Character)_target).Alive)
			{
				return;
			}
			int num = healAmount;
			if (((Character)_target).GetHpLeftForMax() < healAmount)
			{
				num = ((Character)_target).GetHpLeftForMax();
			}
			if (num > 0)
			{
				((Character)_target).ModifyHp(num, true, true);
				CastResolutionForCombatText val = new CastResolutionForCombatText();
				val.heal = num;
				if (((Character)_target).HeroItem != null)
				{
					((CharacterItem)((Character)_target).HeroItem).ScrollCombatTextDamageNew(val);
					EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)((Character)_target).HeroItem).CharImageT, false, 0f);
				}
				else
				{
					((CharacterItem)((Character)_target).NPCItem).ScrollCombatTextDamageNew(val);
					EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)((Character)_target).NPCItem).CharImageT, false, 0f);
				}
				((Character)_target).SetEvent((EventActivation)15, (Character)null, 0, "");
				_character.SetEvent((EventActivation)14, (Character)(object)_target, 0, "");
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void WhenYouGainXGainY(string ACGained, string targetAC, string ACtoApply, int nGained, int nToApply, float multiplier, ref Character _character, string traitName)
		{
			if ((!((Object)(object)MatchManager.Instance == (Object)null) || ACGained != null || IsLivingHero(_character)) && !(targetAC == ACtoApply) && ACGained == targetAC)
			{
				int num = Mathf.RoundToInt((float)(nGained + nToApply) * multiplier);
				_character.SetAuraTrait(_character, ACtoApply, num);
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void WhenYouPlayXGainY(CardType desiredCardType, string desiredAuraCurse, int n_charges, CardData castedCard, ref Character _character, string traitName)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)MatchManager.Instance != (Object)null && (Object)(object)castedCard != (Object)null && (Object)(object)_character.HeroData != (Object)null && castedCard.GetCardTypes().Contains(desiredCardType))
			{
				_character.SetAuraTrait(_character, desiredAuraCurse, n_charges);
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void ReduceCostByStacks(CardType cardType, string auraCurseName, int nCharges, ref Character _character, ref List<string> heroHand, ref List<CardData> cardDataList, string traitName, bool applyToAllCards)
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_character.HeroData != (Object)null))
			{
				return;
			}
			int num = Mathf.FloorToInt((float)(_character.EffectCharges(auraCurseName) / nCharges));
			if (num <= 0)
			{
				return;
			}
			for (int i = 0; i < heroHand.Count; i++)
			{
				CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
				if (cardData.GetCardFinalCost() > 0 && (cardData.GetCardTypes().Contains(cardType) || applyToAllCards))
				{
					cardDataList.Add(cardData);
				}
			}
			for (int j = 0; j < cardDataList.Count; j++)
			{
				CardData obj = cardDataList[j];
				obj.EnergyReductionTemporal += num;
				MatchManager.Instance.UpdateHandCards();
				CardItem cardFromTableByIndex = MatchManager.Instance.GetCardFromTableByIndex(cardDataList[j].InternalId);
				cardFromTableByIndex.PlayDissolveParticle();
				cardFromTableByIndex.ShowEnergyModification(-num);
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
				MatchManager.Instance.CreateLogCardModification(cardDataList[j].InternalId, MatchManager.Instance.GetHero(_character.HeroIndex));
			}
		}

		public static void ReduceCardTypeCostUntilDiscarded(CardType cardType, int amountToReduce, ref Character _character, ref List<string> heroHand, ref List<CardData> cardDataList, string traitName)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (_character.HeroData == null)
			{
				return;
			}
			if (amountToReduce <= 0)
			{
				return;
			}
			for (int i = 0; i < heroHand.Count; i++)
			{
				CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
				if (cardData != null && cardData.GetCardFinalCost() > 0 && cardData.HasCardType(cardType))
				{
					cardDataList.Add(cardData);
				}
			}
			for (int j = 0; j < cardDataList.Count; j++)
			{
				CardData val = cardDataList[j];
				if (val != null)
				{
					val.EnergyReductionTemporal += amountToReduce;
					MatchManager.Instance.UpdateHandCards();
					CardItem cardFromTableByIndex = MatchManager.Instance.GetCardFromTableByIndex(val.InternalId);
					cardFromTableByIndex.PlayDissolveParticle();
					cardFromTableByIndex.ShowEnergyModification(-amountToReduce);
					((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
					MatchManager.Instance.CreateLogCardModification(val.InternalId, MatchManager.Instance.GetHero(_character.HeroIndex));
				}
			}
		}

		public static void AddImmunityToHero(string immunity, ref Hero _character)
		{
			if (_character != null && !((Character)_character).AuracurseImmune.Contains(immunity))
			{
				((Character)_character).AuracurseImmune.Add(immunity);
			}
		}

		public static void IncreaseChargesByStacks(string auraCurseToModify, float stacks_per_bonus, string auraCurseDependent, ref Character _character)
		{
			int auraCharges = _character.GetAuraCharges(auraCurseDependent);
			int num = Mathf.FloorToInt((float)auraCharges / stacks_per_bonus);
			_character.ModifyAuraCurseQuantity(auraCurseToModify, num);
		}

		public static AuraCurseData GetAuraCurseData(string auraCurse)
		{
			return Globals.Instance.GetAuraCurseData(auraCurse);
		}

		public static string TextChargesLeft(int currentCharges, int chargesTotal)
		{
			int num = currentCharges;
			int num2 = chargesTotal;
			return "<br><color=#FFF>" + num + "/" + num2 + "</color>";
		}

		public static void Duality(ref Character _character, ref CardData _castedCard, CardClass class1, CardClass class2, string _trait)
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			if (MatchManager.Instance == null || _castedCard == null)
			{
				return;
			}
			TraitData traitData = Globals.Instance.GetTraitData(_trait);
			if (MatchManager.Instance.activatedTraits != null && MatchManager.Instance.activatedTraits.ContainsKey(_trait) && MatchManager.Instance.activatedTraits[_trait] > traitData.TimesPerTurn - 1)
			{
				return;
			}
			for (int i = 0; i < 2; i++)
			{
				CardClass val;
				CardClass val2;
				if (i == 0)
				{
					val = class1;
					val2 = class2;
				}
				else
				{
					val = class2;
					val2 = class1;
				}
				if (_castedCard.CardClass != val)
				{
					continue;
				}
				if (MatchManager.Instance.CountHeroHand(-1) == 0 || _character.HeroData == null)
				{
					break;
				}
				List<CardData> list = new List<CardData>();
				List<string> heroHand = MatchManager.Instance.GetHeroHand(_character.HeroIndex);
				int num = 0;
				for (int j = 0; j < heroHand.Count; j++)
				{
					CardData cardData = MatchManager.Instance.GetCardData(heroHand[j], true);
					if (cardData != null && cardData.CardClass == val2 && _character.GetCardFinalCost(cardData) > num)
					{
						num = _character.GetCardFinalCost(cardData);
					}
				}
				if (num <= 0)
				{
					break;
				}
				for (int k = 0; k < heroHand.Count; k++)
				{
					CardData cardData2 = MatchManager.Instance.GetCardData(heroHand[k], true);
					if (cardData2 != null && cardData2.CardClass == val2 && _character.GetCardFinalCost(cardData2) >= num)
					{
						list.Add(cardData2);
					}
				}
				if (list.Count <= 0)
				{
					break;
				}
				CardData val3 = ((list.Count != 1) ? list[MatchManager.Instance.GetRandomIntRange(0, list.Count, "trait", "")] : list[0]);
				if (val3 != null)
				{
					if (!MatchManager.Instance.activatedTraits.ContainsKey(_trait))
					{
						MatchManager.Instance.activatedTraits.Add(_trait, 1);
					}
					else
					{
						Dictionary<string, int> activatedTraits = MatchManager.Instance.activatedTraits;
						int value = activatedTraits[_trait] + 1;
						activatedTraits[_trait] = value;
					}
					MatchManager.Instance.SetTraitInfoText();
					int num2 = 1;
					val3.EnergyReductionTemporal += num2;
					MatchManager.Instance.GetCardFromTableByIndex(val3.InternalId).ShowEnergyModification(-num2);
					MatchManager.Instance.UpdateHandCards();
					((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitData.TraitName, "") + TextChargesLeft(MatchManager.Instance.activatedTraits[_trait], traitData.TimesPerTurn), (CombatScrollEffectType)7);
					MatchManager.Instance.CreateLogCardModification(val3.InternalId, MatchManager.Instance.GetHero(_character.HeroIndex));
				}
				break;
			}
		}

		public static void PermanentyReduceXWhenYouPlayY(ref Character _character, ref CardData _castedCard, CardType reduceThis, CardType whenYouPlayThis, int amountToReduce, string _trait)
		{
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Invalid comparison between Unknown and I4
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			if (MatchManager.Instance == null || _castedCard == null)
			{
				return;
			}
			TraitData traitData = Globals.Instance.GetTraitData(_trait);
			if ((MatchManager.Instance.activatedTraits != null && MatchManager.Instance.activatedTraits.ContainsKey(_trait) && MatchManager.Instance.activatedTraits[_trait] > traitData.TimesPerTurn - 1) || !_castedCard.GetCardTypes().Contains(whenYouPlayThis) || MatchManager.Instance.CountHeroHand(-1) == 0 || _character.HeroData == null)
			{
				return;
			}
			List<CardData> list = new List<CardData>();
			List<string> heroHand = MatchManager.Instance.GetHeroHand(_character.HeroIndex);
			if ((int)reduceThis == 0)
			{
				for (int i = 0; i < heroHand.Count; i++)
				{
					CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
					if (cardData != null)
					{
						list.Add(cardData);
					}
				}
			}
			else
			{
				for (int j = 0; j < heroHand.Count; j++)
				{
					CardData cardData2 = MatchManager.Instance.GetCardData(heroHand[j], true);
					if (cardData2 != null && cardData2.GetCardTypes().Contains(reduceThis))
					{
						list.Add(cardData2);
					}
				}
			}
			if (!MatchManager.Instance.activatedTraits.ContainsKey(_trait))
			{
				MatchManager.Instance.activatedTraits.Add(_trait, 1);
			}
			else
			{
				Dictionary<string, int> activatedTraits = MatchManager.Instance.activatedTraits;
				int value = activatedTraits[_trait] + 1;
				activatedTraits[_trait] = value;
			}
			CardData val = list[MatchManager.Instance.GetRandomIntRange(0, list.Count, "trait", "")];
			val.EnergyReductionPermanent += amountToReduce;
			MatchManager.Instance.GetCardFromTableByIndex(val.InternalId).ShowEnergyModification(-amountToReduce);
			MatchManager.Instance.UpdateHandCards();
			((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + _trait, "") + TextChargesLeft(MatchManager.Instance.activatedTraits[_trait], traitData.TimesPerTurn), (CombatScrollEffectType)7);
			MatchManager.Instance.CreateLogCardModification(val.InternalId, MatchManager.Instance.GetHero(_character.HeroIndex));
		}

		public static int CountAllStacks(string auraCurse, Hero[] teamHero = null, NPC[] teamNpc = null, bool includeHeroes = true, bool includeNpcs = true)
		{
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				return 0;
			}
			if (teamHero == null)
			{
				teamHero = MatchManager.Instance.GetTeamHero();
			}
			if (teamNpc == null)
			{
				teamNpc = MatchManager.Instance.GetTeamNPC();
			}
			int num = 0;
			if (includeHeroes)
			{
				for (int i = 0; i < teamHero.Length; i++)
				{
					if (IsLivingHero((Character)(object)teamHero[i]))
					{
						num += ((Character)teamHero[i]).GetAuraCharges(auraCurse);
					}
				}
			}
			if (includeNpcs)
			{
				for (int j = 0; j < teamNpc.Length; j++)
				{
					if (IsLivingNPC((Character)(object)teamNpc[j]))
					{
						num += ((Character)teamNpc[j]).GetAuraCharges(auraCurse);
					}
				}
			}
			return num;
		}

		public static void DealIndirectDamageToAllMonsters(DamageType damageType, int amount)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			Plugin.Log.LogDebug((object)(Plugin.debugBase + "Dealing Indirect Damage"));
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				return;
			}
			NPC[] teamNPC = MatchManager.Instance.GetTeamNPC();
			foreach (NPC val in teamNPC)
			{
				if (IsLivingNPC((Character)(object)val))
				{
					((Character)val).IndirectDamage(damageType, amount, (AudioClip)null, "", "", "");
				}
			}
		}

		public static List<int> GetValidCharacters(Character[] characters)
		{
			List<int> list = new List<int>();
			for (int i = 0; i < characters.Length; i++)
			{
				Character val = characters[i];
				if (val.Alive && val != null)
				{
					list.Add(i);
				}
			}
			return list;
		}

		public static Character GetFrontCharacter(Character[] characters)
		{
			List<int> validCharacters = GetValidCharacters(characters);
			int num = validCharacters.First();
			return characters[num];
		}

		public static Character GetBackCharacter(Character[] characters)
		{
			List<int> validCharacters = GetValidCharacters(characters);
			int num = validCharacters.Last();
			return characters[num];
		}

		public static Character GetRandomCharacter(Character[] array)
		{
			if (array == null)
			{
				Plugin.Log.LogDebug((object)(Plugin.debugBase + "Null Array"));
			}
			List<Character> list = new List<Character>();
			for (int i = 0; i < array.Length; i++)
			{
				if (array[i] == null)
				{
					Plugin.Log.LogDebug((object)(Plugin.debugBase + "Null index"));
					continue;
				}
				Character val = array[i];
				if (val.Alive && val != null)
				{
					list.Add(val);
				}
			}
			if (list.Count == 0)
			{
				return null;
			}
			int randomIntRange = MatchManager.Instance.GetRandomIntRange(0, list.Count, "default", "");
			if (randomIntRange < list.Count)
			{
				return list[randomIntRange];
			}
			if (list[randomIntRange] == null)
			{
				return null;
			}
			return list[0];
		}

		public static bool IsLivingHero(Character _character)
		{
			return _character != null && _character.Alive && _character.IsHero;
		}

		public static bool IsLivingNPC(Character _character)
		{
			return _character != null && _character.Alive && !_character.IsHero;
		}

		public static bool CharacterHasPerkForSet(string perkName, bool flag, AtOManager __instance, Character _characterTarget)
		{
			return flag && _characterTarget != null && __instance.CharacterHavePerk(_characterTarget.SubclassName, perkBase + perkName);
		}

		public static bool CharacterHasPerkForConsume(string perkName, bool flag, AtOManager __instance, Character _characterCaster)
		{
			return flag && _characterCaster != null && __instance.CharacterHavePerk(_characterCaster.SubclassName, perkBase + perkName);
		}

		public static bool TeamHasPerk(string perkName)
		{
			if ((Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			return AtOManager.Instance.TeamHavePerk(perkBase + perkName) || AtOManager.Instance.TeamHavePerk(perkName);
		}

		public static bool IfCharacterHas(Character characterOfInterest, CharacterHas characterHas, string id, AppliesTo appliesTo = AppliesTo.Global, string _type = "", string onlyThisType = "")
		{
			if (appliesTo == AppliesTo.None || characterOfInterest == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			if (_type != "" && onlyThisType != _type)
			{
				return false;
			}
			bool flag = (characterOfInterest.IsHero && appliesTo == AppliesTo.Heroes) || (!characterOfInterest.IsHero && appliesTo == AppliesTo.Monsters) || appliesTo == AppliesTo.Global || (appliesTo == AppliesTo.ThisHero && characterOfInterest.IsHero);
			bool flag2 = false;
			if (appliesTo == AppliesTo.ThisHero)
			{
				switch (characterHas)
				{
				case CharacterHas.Item:
					flag2 = AtOManager.Instance.CharacterHaveItem(characterOfInterest.SubclassName, perkBase + id) || AtOManager.Instance.CharacterHaveItem(characterOfInterest.SubclassName, id);
					break;
				case CharacterHas.Perk:
					flag2 = AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, perkBase + id) || AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, id);
					break;
				case CharacterHas.Trait:
					flag2 = AtOManager.Instance.CharacterHaveTrait(characterOfInterest.SubclassName, perkBase + id) || AtOManager.Instance.CharacterHaveTrait(characterOfInterest.SubclassName, id);
					break;
				}
			}
			else
			{
				switch (characterHas)
				{
				case CharacterHas.Item:
					flag2 = AtOManager.Instance.TeamHaveItem(perkBase + id, -1, false) || AtOManager.Instance.TeamHaveItem(id, -1, false);
					break;
				case CharacterHas.Perk:
					flag2 = AtOManager.Instance.TeamHavePerk(perkBase + id) || AtOManager.Instance.TeamHavePerk(id);
					break;
				case CharacterHas.Trait:
					flag2 = AtOManager.Instance.TeamHaveTrait(perkBase + id) || AtOManager.Instance.TeamHaveTrait(id);
					break;
				}
			}
			return flag2 && flag;
		}

		public static bool TeamHasPerkGACM(Character characterOfInterest, string perkName, AppliesTo appliesTo = AppliesTo.Global, string _type = "", string onlyThisType = "")
		{
			if (appliesTo == AppliesTo.None || characterOfInterest == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			if (_type != "" && onlyThisType != _type)
			{
				return false;
			}
			bool flag = (characterOfInterest.IsHero && appliesTo == AppliesTo.Heroes) || (!characterOfInterest.IsHero && appliesTo == AppliesTo.Monsters) || appliesTo == AppliesTo.Global;
			bool flag2 = AtOManager.Instance.TeamHavePerk(perkBase + perkName) || AtOManager.Instance.TeamHavePerk(perkName);
			return flag2 && flag;
		}

		public static bool CharacterHasPerkGACM(Character characterOfInterest, string perkName, AppliesTo appliesTo = AppliesTo.Global)
		{
			if (appliesTo == AppliesTo.None || characterOfInterest == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			bool flag = (characterOfInterest.IsHero && appliesTo == AppliesTo.Heroes) || (!characterOfInterest.IsHero && appliesTo == AppliesTo.Monsters) || appliesTo == AppliesTo.Global;
			bool flag2 = AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, perkBase + perkName) || AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, perkName);
			return flag2 && flag;
		}

		public static bool TeamHasTraitGACM(Character characterOfInterest, string perkName, AppliesTo appliesTo = AppliesTo.Global, string _type = "", string onlyThisType = "")
		{
			if (appliesTo == AppliesTo.None || characterOfInterest == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			if (_type != "" && onlyThisType != _type)
			{
				return false;
			}
			bool flag = (characterOfInterest.IsHero && appliesTo == AppliesTo.Heroes) || (!characterOfInterest.IsHero && appliesTo == AppliesTo.Monsters) || appliesTo == AppliesTo.Global;
			bool flag2 = AtOManager.Instance.TeamHaveTrait(perkBase + perkName) || AtOManager.Instance.TeamHavePerk(perkName);
			return flag2 && flag;
		}

		public static bool CharacterHasTraitGACM(Character characterOfInterest, string perkName, AppliesTo appliesTo = AppliesTo.Global, string _type = "", string onlyThisType = "")
		{
			if (appliesTo == AppliesTo.None || characterOfInterest == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			if (_type != "" && onlyThisType != _type)
			{
				return false;
			}
			bool flag = (characterOfInterest.IsHero && appliesTo == AppliesTo.Heroes) || (!characterOfInterest.IsHero && appliesTo == AppliesTo.Monsters) || appliesTo == AppliesTo.Global;
			bool flag2 = AtOManager.Instance.CharacterHaveTrait(characterOfInterest.SubclassName, perkBase + perkName) || AtOManager.Instance.TeamHavePerk(perkName);
			return flag2 && flag;
		}

		public static bool TeamHasPerkForSet(string perkName, bool flag, AtOManager __instance, Character _characterTarget)
		{
			return _characterTarget != null && __instance.TeamHavePerk(perkBase + perkName) && flag;
		}

		public static bool TeamHasPerkForConsume(string perkName, bool flag, AtOManager __instance, Character _characterCaster)
		{
			if ((Object)(object)__instance == (Object)null)
			{
				return false;
			}
			return _characterCaster != null && (__instance.TeamHavePerk(perkBase + perkName) || __instance.TeamHavePerk(perkName)) && flag;
		}

		public static bool CharacterObjectHavePerk(Character _character, string _perkID)
		{
			if (_character == null || (Object)(object)AtOManager.Instance == (Object)null)
			{
				return false;
			}
			return AtOManager.Instance.CharacterHavePerk(_character.SubclassName, perkBase + _perkID) || AtOManager.Instance.CharacterHavePerk(_character.SubclassName, _perkID);
		}

		public static void PlayCardForFree(string cardToCast)
		{
			if (cardToCast != null && !((Object)(object)Globals.Instance == (Object)null))
			{
				CardData cardData = Globals.Instance.GetCardData(cardToCast, true);
				if ((Object)(object)cardData == (Object)null)
				{
					Plugin.LogDebug("Invalid CardName");
				}
				else
				{
					((MonoBehaviour)MatchManager.Instance).StartCoroutine(MatchManager.Instance.CastCard((CardItem)null, true, cardData, 0, -1, true));
				}
			}
		}

		public static void PlaySoundEffect(Character _character, string ACeffect)
		{
			if ((Object)(object)_character.HeroItem != (Object)null)
			{
				EffectsManager.Instance.PlayEffectAC(ACeffect, true, ((CharacterItem)_character.HeroItem).CharImageT, false, 0f);
			}
		}

		public static void DisplayRemainingChargesForTrait(ref Character _character, TraitData traitData)
		{
			if ((Object)(object)_character.HeroItem != (Object)null)
			{
				((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitData.TraitName, "") + TextChargesLeft(MatchManager.Instance.activatedTraits[traitData.TraitName], traitData.TimesPerTurn), (CombatScrollEffectType)7);
			}
		}

		public static void DisplayTraitScroll(ref Character _character, TraitData traitData)
		{
			HeroItem heroItem = _character.HeroItem;
			if (heroItem != null)
			{
				((CharacterItem)heroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitData.TraitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void DisplayTraitScroll(ref Character _character, string traitName)
		{
			HeroItem heroItem = _character.HeroItem;
			if (heroItem != null)
			{
				((CharacterItem)heroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
			}
		}

		public static void IncrementTraitActivations(TraitData traitData)
		{
			string id = traitData.Id;
			if (!MatchManager.Instance.activatedTraits.ContainsKey(id))
			{
				MatchManager.Instance.activatedTraits.Add(id, 1);
			}
			else
			{
				MatchManager.Instance.activatedTraits[id]++;
			}
			MatchManager.Instance.SetTraitInfoText();
		}

		public static void IncrementTraitActivations(string traitId)
		{
			TraitData traitData = Globals.Instance.GetTraitData(traitId);
			IncrementTraitActivations(traitData);
		}

		public static bool CanIncrementTraitActivations(TraitData traitData, int bonusActivations = 0)
		{
			Plugin.LogDebug("canIncrementTraitActivations");
			if ((Object)(object)traitData == (Object)null)
			{
				return false;
			}
			string id = traitData.Id;
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				return false;
			}
			if (MatchManager.Instance.activatedTraits == null)
			{
				return false;
			}
			if (MatchManager.Instance.activatedTraits.ContainsKey(id) && MatchManager.Instance.activatedTraits[id] > traitData.TimesPerTurn - 1 + bonusActivations)
			{
				return false;
			}
			if (!MatchManager.Instance.activatedTraits.ContainsKey(id))
			{
				MatchManager.Instance.activatedTraits.Add(id, 0);
			}
			return true;
		}

		public static bool CanIncrementTraitActivations(string traitId, int bonusActivations = 0)
		{
			TraitData traitData = Globals.Instance.GetTraitData(traitId);
			return CanIncrementTraitActivations(traitData, bonusActivations);
		}

		public static void ModifyAllAurasOrCursesByPercent(int percentToModify, IsAuraOrCurse isAuraOrCurse, Character _characterTarget, Character _characterCaster)
		{
			if (percentToModify == 0 || _characterTarget == null || !_characterTarget.Alive)
			{
				return;
			}
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			int num4 = 0;
			if ((isAuraOrCurse == IsAuraOrCurse.Aura || isAuraOrCurse == IsAuraOrCurse.Both) && percentToModify > 0)
			{
				num = percentToModify;
			}
			if ((isAuraOrCurse == IsAuraOrCurse.Aura || isAuraOrCurse == IsAuraOrCurse.Both) && percentToModify < 0)
			{
				num2 = Math.Abs(percentToModify);
			}
			if ((isAuraOrCurse == IsAuraOrCurse.Curse || isAuraOrCurse == IsAuraOrCurse.Both) && percentToModify > 0)
			{
				num3 = percentToModify;
			}
			if ((isAuraOrCurse == IsAuraOrCurse.Curse || isAuraOrCurse == IsAuraOrCurse.Both) && percentToModify < 0)
			{
				num4 = Math.Abs(percentToModify);
			}
			if (_characterTarget == null || !_characterTarget.Alive)
			{
				return;
			}
			for (int i = 0; i < 4; i++)
			{
				if ((i == 0 && num <= 0) || (i == 1 && num3 <= 0) || (i == 2 && num2 <= 0) || (i == 3 && num4 <= 0))
				{
					continue;
				}
				List<string> list = new List<string>();
				List<int> list2 = new List<int>();
				for (int j = 0; j < _characterTarget.AuraList.Count; j++)
				{
					if (_characterTarget.AuraList[j] != null && (Object)(object)_characterTarget.AuraList[j].ACData != (Object)null && _characterTarget.AuraList[j].GetCharges() > 0 && !(_characterTarget.AuraList[j].ACData.Id == "furnace"))
					{
						bool flag = false;
						if ((i == 0 || i == 2) && _characterTarget.AuraList[j].ACData.IsAura)
						{
							flag = true;
						}
						else if ((i == 1 || i == 3) && !_characterTarget.AuraList[j].ACData.IsAura)
						{
							flag = true;
						}
						if (flag)
						{
							list.Add(_characterTarget.AuraList[j].ACData.Id);
							list2.Add(_characterTarget.AuraList[j].GetCharges());
						}
					}
				}
				if (list.Count <= 0)
				{
					continue;
				}
				for (int k = 0; k < list.Count; k++)
				{
					int num5 = i switch
					{
						0 => Functions.FuncRoundToInt((float)((double)list2[k] * (double)num / 100.0)), 
						1 => Functions.FuncRoundToInt((float)((double)list2[k] * (double)num3 / 100.0)), 
						2 => list2[k] - Functions.FuncRoundToInt((float)((double)list2[k] * (double)num2 / 100.0)), 
						_ => list2[k] - Functions.FuncRoundToInt((float)((double)list2[k] * (double)num4 / 100.0)), 
					};
					switch (i)
					{
					case 0:
					case 1:
					{
						AuraCurseData val = AtOManager.Instance.GlobalAuraCurseModificationByTraitsAndItems("set", list[k], _characterCaster, _characterTarget);
						if ((Object)(object)val != (Object)null)
						{
							int maxCharges = val.GetMaxCharges();
							if (maxCharges > -1 && list2[k] + num5 > maxCharges)
							{
								num5 = maxCharges - list2[k];
							}
							_characterTarget.SetAura(_characterCaster, val, num5, false, (CardClass)11, false, false);
						}
						break;
					}
					case 2:
					case 3:
						if (num5 <= 0)
						{
							num5 = 1;
						}
						_characterTarget.ModifyAuraCurseCharges(list[k], num5);
						_characterTarget.UpdateAuraCurseFunctions((AuraCurseData)null, 0, -1);
						break;
					}
				}
			}
		}

		public static void ApplyAuraCurseToAll(string acToApply, int nToApply, AppliesTo appliesTo, Character sourceCharacter = null, bool useCharacterMods = false, bool isPreventable = true)
		{
			Plugin.LogInfo("ApplyAuraCurseToAll");
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				Plugin.LogError("No MatchManager");
				return;
			}
			if (sourceCharacter == null && useCharacterMods)
			{
				Plugin.LogError("No Source Character");
				return;
			}
			AuraCurseData auraCurseData = GetAuraCurseData(acToApply);
			if ((Object)(object)auraCurseData == (Object)null)
			{
				Plugin.LogError("Improper AuraCurse");
				return;
			}
			Hero[] teamHero = MatchManager.Instance.GetTeamHero();
			NPC[] teamNPC = MatchManager.Instance.GetTeamNPC();
			switch (appliesTo)
			{
			case AppliesTo.Heroes:
			{
				Hero[] array2 = teamHero;
				foreach (Hero val2 in array2)
				{
					if (IsLivingHero((Character)(object)val2))
					{
						((Character)val2).SetAura(sourceCharacter, auraCurseData, nToApply, false, (CardClass)11, useCharacterMods, isPreventable);
					}
				}
				break;
			}
			case AppliesTo.Global:
			{
				Hero[] array3 = teamHero;
				foreach (Hero val3 in array3)
				{
					if (IsLivingHero((Character)(object)val3))
					{
						((Character)val3).SetAura(sourceCharacter, auraCurseData, nToApply, false, (CardClass)11, useCharacterMods, isPreventable);
					}
				}
				NPC[] array4 = teamNPC;
				foreach (NPC val4 in array4)
				{
					if (IsLivingNPC((Character)(object)val4))
					{
						((Character)val4).SetAura(sourceCharacter, auraCurseData, nToApply, false, (CardClass)11, useCharacterMods, isPreventable);
					}
				}
				break;
			}
			case AppliesTo.Monsters:
			{
				NPC[] array = teamNPC;
				foreach (NPC val in array)
				{
					if (IsLivingNPC((Character)(object)val))
					{
						((Character)val).SetAura(sourceCharacter, auraCurseData, nToApply, false, (CardClass)11, useCharacterMods, isPreventable);
					}
				}
				break;
			}
			}
		}

		public static string CollectionToString(Collection<object> values)
		{
			return string.Join(",", values);
		}

		public static string CollectionToString(Dictionary<string, int> dictionary)
		{
			return "{" + string.Join(",", dictionary.Select((KeyValuePair<string, int> kv) => kv.Key + "=" + kv.Value).ToArray()) + "}";
		}

		public static void DrawCards(int numToDraw)
		{
			MatchManager.Instance.NewCard(numToDraw, (CardFrom)0, "");
		}

		public static void GainEnergy(Character _character, int energyToGain, TraitData traitData = null)
		{
			if (!IsLivingHero(_character))
			{
				Plugin.LogDebug("GainEnergy - Invalid Character");
				return;
			}
			Plugin.LogDebug("GainEnergy - Modifying Energy");
			_character.ModifyEnergy(energyToGain, true);
			if (_character.HeroItem != null)
			{
				Plugin.LogDebug("GainEnergy - Setting Effect AC");
				EffectsManager.Instance.PlayEffectAC("energy", true, ((CharacterItem)_character.HeroItem).CharImageT, false, 0f);
				if (!((Object)(object)traitData == (Object)null))
				{
				}
			}
		}

		public static void StealAuraCurses(ref Character characterStealing, ref Character characterToStealFrom, int nToSteal, IsAuraOrCurse isAuraOrCurse = IsAuraOrCurse.Aura)
		{
			if (isAuraOrCurse == IsAuraOrCurse.Both)
			{
				Plugin.LogDebug("Must Specify Aura or Curse to Steal");
				return;
			}
			if (characterStealing == null || characterToStealFrom == null || !characterStealing.Alive || !characterToStealFrom.Alive)
			{
				Plugin.LogDebug("Character to Steal from or Character Stealing is not a valid living character");
				return;
			}
			List<string> list = new List<string>();
			List<int> list2 = new List<int>();
			int num = 0;
			if (characterToStealFrom != null)
			{
				for (int i = 0; i < characterToStealFrom.AuraList.Count; i++)
				{
					if (num >= nToSteal)
					{
						break;
					}
					bool flag = characterToStealFrom.AuraList[i] != null && (Object)(object)characterToStealFrom.AuraList[i].ACData != (Object)null;
					bool flag2 = ((isAuraOrCurse == IsAuraOrCurse.Aura) ? characterToStealFrom.AuraList[i].ACData.IsAura : (!characterToStealFrom.AuraList[i].ACData.IsAura));
					bool flag3 = characterToStealFrom.AuraList[i].ACData.Removable && characterToStealFrom.AuraList[i].GetCharges() > 0;
					if (flag && flag2 && flag3)
					{
						list.Add(characterToStealFrom.AuraList[i].ACData.Id);
						list2.Add(characterToStealFrom.AuraList[i].GetCharges());
						num++;
					}
				}
			}
			if (num <= 0)
			{
				return;
			}
			characterToStealFrom.HealCursesName(list, "");
			for (int j = 0; j < list.Count; j++)
			{
				if (characterStealing != null && characterStealing.Alive)
				{
					characterStealing.SetAura(characterToStealFrom, Globals.Instance.GetAuraCurseData(list[j]), list2[j], false, (CardClass)11, true, true);
				}
			}
		}

		public static List<string> GetDeck(Character character)
		{
			return character.Cards;
		}

		public static List<CardData> GetDeckCardData(Character character)
		{
			List<CardData> list = new List<CardData>();
			foreach (string card in character.Cards)
			{
				list.Add(Globals.Instance.GetCardData(card, true));
			}
			return list;
		}

		public static int CountAllACOnCharacter(Character character, IsAuraOrCurse isAuraOrCurse)
		{
			int num = 0;
			foreach (Aura aura in character.AuraList)
			{
				bool flag = true;
				switch (isAuraOrCurse)
				{
				case IsAuraOrCurse.Aura:
					flag = aura.ACData.IsAura;
					break;
				case IsAuraOrCurse.Curse:
					flag = !aura.ACData.IsAura;
					break;
				case IsAuraOrCurse.Both:
					flag = true;
					break;
				}
				if (flag)
				{
					num += aura.AuraCharges;
				}
			}
			return num;
		}

		public static void ReduceCardCost(ref CardData cardData, Character currentCharacter = null, int amountToReduce = 1, bool isPermanent = false)
		{
			if ((Object)(object)MatchManager.Instance == (Object)null || (Object)(object)cardData == (Object)null)
			{
				Plugin.LogError("Null MatchManager/card");
				return;
			}
			Plugin.LogDebug("Reducing card Cost");
			if (currentCharacter == null)
			{
				currentCharacter = (Character)(object)MatchManager.Instance.GetHeroHeroActive();
			}
			if (currentCharacter == null)
			{
				Plugin.LogError("Null Current Character");
				return;
			}
			if (isPermanent)
			{
				Plugin.LogDebug("Reducing card Cost - permanent");
				CardData obj = cardData;
				obj.EnergyReductionPermanent += amountToReduce;
			}
			else
			{
				Plugin.LogDebug("Reducing card Cost - temporary");
				CardData obj2 = cardData;
				obj2.EnergyReductionTemporal += amountToReduce;
			}
			Plugin.LogDebug("Reducing card Cost - updates");
			MatchManager.Instance.GetCardFromTableByIndex(cardData.InternalId).ShowEnergyModification(-amountToReduce);
			MatchManager.Instance.UpdateHandCards();
			MatchManager.Instance.CreateLogCardModification(cardData.InternalId, MatchManager.Instance.GetHero(currentCharacter.HeroIndex));
			Plugin.LogDebug("Reducing card Cost - END");
		}

		public static CardData GetRandomHighestCostCard(CardType cardType, List<string> heroHand = null)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				Plugin.LogError("Null MatchManager");
				return null;
			}
			if (heroHand == null)
			{
				heroHand = MatchManager.Instance.GetHeroHand(MatchManager.Instance.GetHeroActive());
			}
			int num = 0;
			List<CardData> list = new List<CardData>();
			for (int i = 0; i < heroHand.Count; i++)
			{
				CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
				if (cardData != null && (cardData.GetCardTypes().Contains(cardType) || (int)cardType == 0) && cardData.GetCardFinalCost() > num)
				{
					num = cardData.GetCardFinalCost();
				}
			}
			if (num <= 0)
			{
				return null;
			}
			for (int j = 0; j < heroHand.Count; j++)
			{
				CardData cardData2 = MatchManager.Instance.GetCardData(heroHand[j], true);
				if (cardData2 != null && (cardData2.GetCardTypes().Contains(cardType) || (int)cardType == 0) && cardData2.GetCardFinalCost() >= num)
				{
					list.Add(cardData2);
				}
			}
			if (list.Count <= 0)
			{
				return null;
			}
			return (list.Count != 1) ? list[MatchManager.Instance.GetRandomIntRange(0, list.Count, "default", "")] : list[0];
		}

		public static List<CardData> GetCardsFromHand(CardType cardType = 0, int equalOrAboveCertainCost = 0, int lessThanOrEqualToThisCost = 100)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			Character heroHeroActive = (Character)(object)MatchManager.Instance.GetHeroHeroActive();
			List<string> heroHand = MatchManager.Instance.GetHeroHand(heroHeroActive.HeroIndex);
			List<CardData> list = new List<CardData>();
			for (int i = 0; i < heroHand.Count; i++)
			{
				CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
				if ((Object)(object)cardData != (Object)null && cardData.GetCardFinalCost() > 0 && (cardData.GetCardTypes().Contains(cardType) || (int)cardType == 0) && cardData.GetCardFinalCost() >= equalOrAboveCertainCost && cardData.GetCardFinalCost() <= lessThanOrEqualToThisCost)
				{
					list.Add(cardData);
				}
			}
			return list;
		}

		public static List<CardData> GetCardsFromHand(List<string> heroHand, CardType cardType = 0, int equalOrAboveCertainCost = 0, int lessThanOrEqualToThisCost = 100)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			List<CardData> list = new List<CardData>();
			for (int i = 0; i < heroHand.Count; i++)
			{
				CardData cardData = MatchManager.Instance.GetCardData(heroHand[i], true);
				if ((Object)(object)cardData != (Object)null && cardData.GetCardFinalCost() > 0 && (cardData.GetCardTypes().Contains(cardType) || (int)cardType == 0) && cardData.GetCardFinalCost() >= equalOrAboveCertainCost && cardData.GetCardFinalCost() <= lessThanOrEqualToThisCost)
				{
					list.Add(cardData);
				}
			}
			return list;
		}

		public static CardData GetRightmostCard(List<string> heroHand)
		{
			return MatchManager.Instance.GetCardData(heroHand.Last(), true);
		}
	}
	[BepInPlugin("com.binbin.StormJavelin", "StormJavelin", "0.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("AcrossTheObelisk.exe")]
	public class Plugin : BaseUnityPlugin
	{
		internal int ModDate = int.Parse(DateTime.Today.ToString("yyyyMMdd"));

		private readonly Harmony harmony = new Harmony("com.binbin.StormJavelin");

		internal static ManualLogSource Log;

		public static string debugBase = "com.binbin.StormJavelin ";

		public static ConfigEntry<bool> EnableMod { get; set; }

		public static ConfigEntry<bool> EnableDebugging { get; set; }

		public static ConfigEntry<bool> EnableRandomJavelins { get; set; }

		public static ConfigEntry<bool> EnableBonusJavelins { get; set; }

		public static ConfigEntry<bool> ChangeAllNames { get; set; }

		private void Awake()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_0047: Expected O, but got Unknown
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Expected O, but got Unknown
			//IL_0078: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Expected O, but got Unknown
			//IL_00a9: Expected O, but got Unknown
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Expected O, but got Unknown
			//IL_00da: Expected O, but got Unknown
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Expected O, but got Unknown
			//IL_010b: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogInfo((object)"com.binbin.StormJavelin 0.1.0 has loaded!");
			EnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("StormJavelin", "EnableMod"), true, new ConfigDescription("Enables the mod. If false, the mod will not work then next time you load the game.", (AcceptableValueBase)null, Array.Empty<object>()));
			EnableDebugging = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("StormJavelin", "EnableDebugging"), true, new ConfigDescription("Enables the debugging", (AcceptableValueBase)null, Array.Empty<object>()));
			EnableRandomJavelins = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("StormJavelin", "Random Javelins"), true, new ConfigDescription("Storm Javelin is now a card reward for all.", (AcceptableValueBase)null, Array.Empty<object>()));
			EnableBonusJavelins = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("StormJavelin", "Bonus Javelins"), true, new ConfigDescription("Chace to shuffle Javelins into your deck each turn.", (AcceptableValueBase)null, Array.Empty<object>()));
			ChangeAllNames = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("StormJavelin", "ChangeAllNames"), false, new ConfigDescription("Makes it so that all cards are named Storm Javelin. Restart the game upon changing this.", (AcceptableValueBase)null, Array.Empty<object>()));
			Essentials.RegisterMod("StormJavelin", "binbin", "Storm Javelin", "0.1.0", ModDate, "https://github.com/binbinmods/StormJavelin", (string[])null, "StormJavelin", 100, (string[])null, "", true);
			string text = CardDescriptionNew.medsSpriteText("sharp") + " on heroes increases " + CardDescriptionNew.medsSpriteText("lightning") + " damage by 2% per charge";
			string text2 = "javringofsparks";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = CardDescriptionNew.medsSpriteText("sharp") + " on heroes increases " + CardDescriptionNew.medsSpriteText("lightning") + " damage by 4% per charge";
			text2 = "javringofsparksrare";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = CardDescriptionNew.medsSpriteText("spark") + " on monsters heals heroes by 1 when attacked";
			text2 = "javsacredsparks";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, true);
			text = CardDescriptionNew.medsSpriteText("spark") + " on monsters reduces " + CardDescriptionNew.medsSpriteText("piercing") + " resistance by 0.5% per charge";
			text2 = "javrodsfromgod";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = CardDescriptionNew.medsSpriteText("spark") + " on monsters reduces " + CardDescriptionNew.medsSpriteText("piercing") + " resistance by 1% per charge";
			text2 = "javrodsfromgodrare";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = "+5% All Damage and Healing Done for each Storm Javelin in your Draw Pile";
			text2 = "javthundershield";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)9, text2, false, false);
			text = "+10% All Damage and Healing Done for each Storm Javelin in your Draw Pile";
			text2 = "javthundershieldrare";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = CardDescriptionNew.medsSpriteText("powerful") + " on heroes have -15 Max. charges and +1 Max. charge for each card in their Draw Pile";
			text2 = "javcracklinggauntlet";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			text = CardDescriptionNew.medsSpriteText("powerful") + " on heroes have -10 Max. charges and +1 Max. charge for each card in their Draw Pile";
			text2 = "javcracklinggauntletrare";
			CardDescriptionNew.AddTextToCardDescription(text, (TextLocation)28, text2, false, false);
			if (EnableMod.Value)
			{
				harmony.PatchAll();
			}
		}

		internal static void LogDebug(string msg)
		{
			if (EnableDebugging.Value)
			{
				Log.LogDebug((object)(debugBase + msg));
			}
		}

		internal static void LogInfo(string msg)
		{
			Log.LogInfo((object)(debugBase + msg));
		}

		internal static void LogError(string msg)
		{
			Log.LogError((object)(debugBase + msg));
		}
	}
	public class StormJavelinFunctions
	{
		public enum Corruptors
		{
			ImpedingDoom,
			Decadence,
			RestrictedPower,
			ResistantMonsters,
			Equalizer,
			Poverty,
			OverchargedMonsters,
			RandomCombats,
			Despair
		}

		public static bool HasCorruptor(Corruptors corruptor)
		{
			return MadnessManager.Instance.IsMadnessTraitActive(corruptor.ToString().ToLower());
		}

		public static float GetFishPercent()
		{
			return 0f;
		}

		public static int SafeRandomInt(int min, int max, string type = "default", string seed = "")
		{
			if (Object.op_Implicit((Object)(object)MatchManager.Instance))
			{
				return MatchManager.Instance.GetRandomIntRange(min, max, type, seed);
			}
			if (Object.op_Implicit((Object)(object)MapManager.Instance))
			{
				return MapManager.Instance.GetRandomIntRange(min, max);
			}
			Random.InitState(Functions.GetDeterministicHashCode(seed));
			return Random.Range(min, max);
		}

		public static string GetRandomStringFromDict(Dictionary<string, int> dict, string defaultString = "", string seed = "")
		{
			int max = Math.Max(100, dict.Values.Sum());
			int num = SafeRandomInt(0, max, "default", seed);
			foreach (KeyValuePair<string, int> item in dict)
			{
				num -= item.Value;
				if (num <= 0)
				{
					return item.Key;
				}
			}
			return defaultString;
		}

		public static string GetStormJavelinUpgraded(string seed = "", int randInt = 0)
		{
			string text = "stormjavelin";
			Random.InitState(Functions.GetDeterministicHashCode(seed));
			randInt = ((randInt == 0) ? Random.Range(0, 100) : randInt);
			if (randInt < 10)
			{
				text += "rare";
			}
			else if (randInt < 30)
			{
				text += "a";
			}
			else if (randInt < 50)
			{
				text += "b";
			}
			return text;
		}

		public static int GetStormJavelinCount(Character character)
		{
			if (!CustomFunctions.IsLivingHero(character) || (Object)(object)MatchManager.Instance == (Object)null)
			{
				Plugin.LogError("GetStormJavelinCount called with invalid character or MatchManager not initialized.");
				return 0;
			}
			int num = 0;
			int heroIndex = character.HeroIndex;
			return MatchManager.Instance.GetHeroDeck(heroIndex)?.Count((string c) => c.StartsWith("stormjavelin") || c.StartsWith("javthunderjavelin")) ?? 0;
		}
	}
	[HarmonyPatch]
	public class StormJavelinPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(Character), "SetEvent")]
		public static void SetEventPostfix(ref Character __instance, EventActivation theEvent, Character target = null, int auxInt = 0, string auxString = "")
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Invalid comparison between Unknown and I4
			if (__instance == null || (Object)(object)MatchManager.Instance == (Object)null)
			{
				return;
			}
			int num = 10;
			bool flag = Plugin.EnableBonusJavelins.Value && MatchManager.Instance.GetRandomIntRange(0, 100, "default", "") < num;
			if (flag && (int)theEvent == 2)
			{
				Character val = __instance;
				if (!CustomFunctions.IsLivingHero(val))
				{
					return;
				}
				int heroIndex = val.HeroIndex;
				int randomIntRange = MatchManager.Instance.GetRandomIntRange(0, 100, "default", "");
				string stormJavelinUpgraded = StormJavelinFunctions.GetStormJavelinUpgraded("", randomIntRange);
				Plugin.LogDebug("Adding " + stormJavelinUpgraded + " to " + val.SourceName);
				string text = MatchManager.Instance.CreateCardInDictionary(stormJavelinUpgraded, "", false);
				MatchManager.Instance.GetCardData(text, true);
				MatchManager.Instance.GenerateNewCard(1, text, false, (CardPlace)3, (CardData)null, (CardData)null, heroIndex, true, 0);
			}
			if ((int)theEvent == 1)
			{
				Character val2 = __instance;
				if (CustomFunctions.IsLivingHero(val2) && flag)
				{
					int heroIndex2 = val2.HeroIndex;
					int randomIntRange2 = MatchManager.Instance.GetRandomIntRange(0, 100, "default", "");
					string stormJavelinUpgraded2 = StormJavelinFunctions.GetStormJavelinUpgraded("", randomIntRange2);
					Plugin.LogDebug("Adding " + stormJavelinUpgraded2 + " to " + ((val2 != null) ? val2.SourceName : null));
					string text2 = MatchManager.Instance.CreateCardInDictionary(stormJavelinUpgraded2, "", false);
					MatchManager.Instance.GetCardData(text2, true);
					MatchManager.Instance.GenerateNewCard(1, text2, false, (CardPlace)3, (CardData)null, (CardData)null, heroIndex2, true, 0);
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(AtOManager), "GlobalAuraCurseModificationByTraitsAndItems")]
		public static void GlobalAuraCurseModificationByTraitsAndItemsPostfix(ref AtOManager __instance, ref AuraCurseData __result, string _type, string _acId, Character _characterCaster, Character _characterTarget)
		{
			Character val = ((_type == "set") ? _characterTarget : _characterCaster);
			switch (_acId)
			{
			case "sharp":
			{
				string id = "javringofsparks";
				string id2 = "javringofsparksrare";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id2, CustomFunctions.AppliesTo.Heroes))
				{
					__result = AtOManager.Instance.GlobalAuraCurseModifyDamage(__result, (DamageType)6, 0, 0, 4);
				}
				else if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Heroes))
				{
					__result = AtOManager.Instance.GlobalAuraCurseModifyDamage(__result, (DamageType)6, 0, 0, 2);
				}
				break;
			}
			case "powerful":
			{
				string id = "javcracklinggauntlet";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id + "rare", CustomFunctions.AppliesTo.ThisHero))
				{
					int heroIndex = val.HeroIndex;
					List<string> heroDeck = MatchManager.Instance.GetHeroDeck(heroIndex);
					int count = heroDeck.Count;
					int num = -15 + count;
					__result.MaxCharges = Mathf.Max(2, __result.MaxCharges + num);
					__result.MaxMadnessCharges = Mathf.Max(2, __result.MaxMadnessCharges + num);
				}
				else if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Heroes))
				{
					int heroIndex2 = val.HeroIndex;
					List<string> heroDeck2 = MatchManager.Instance.GetHeroDeck(heroIndex2);
					int count2 = heroDeck2.Count;
					int num2 = -10 + count2;
					__result.MaxCharges = Mathf.Max(2, __result.MaxCharges + num2);
					__result.MaxMadnessCharges = Mathf.Max(2, __result.MaxMadnessCharges + num2);
				}
				break;
			}
			case "spark":
			{
				string id = "javstormnecklacerare";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Monsters))
				{
					AuraCurseData obj = __result;
					obj.MaxMadnessCharges += 100;
				}
				id = "javelectricarmorrare";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Monsters))
				{
					AuraCurseData obj2 = __result;
					obj2.MaxMadnessCharges += 100;
				}
				id = "javsacredsparks";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id + "rare", CustomFunctions.AppliesTo.Heroes))
				{
					__result.HealAttackerConsumeCharges = 1;
					__result.HealAttackerPerStack = 1;
				}
				else if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Heroes))
				{
					__result.HealAttackerConsumeCharges = 1;
					__result.HealAttackerPerStack = 1;
				}
				id = "javsacredsparks";
				if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id + "rare", CustomFunctions.AppliesTo.Heroes))
				{
					__result.ResistModified2 = (DamageType)3;
					__result.ResistModifiedPercentagePerStack2 = -0.5f;
				}
				else if (CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Item, id, CustomFunctions.AppliesTo.Heroes))
				{
					__result.ResistModified2 = (DamageType)3;
					__result.ResistModifiedPercentagePerStack2 = -1f;
				}
				break;
			}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(CardItem), "SetCard")]
		public static void SetCardPostfix(string id, ref TMP_Text ___titleTextTM, ref TMP_Text ___titleTextTBlue, ref TMP_Text ___titleTextTGold, ref TMP_Text ___titleTextTRed, ref TMP_Text ___titleTextTPurple, bool deckScale = true, Hero _theHero = null, NPC _theNPC = null, bool GetFromGlobal = false, bool _generated = false)
		{
			if (Plugin.ChangeAllNames.Value)
			{
				___titleTextTM.text = "Storm Javelin";
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(CardCraftManager), "ShowElements")]
		public static void ShowElementsPostfix(ref CardCraftManager __instance, string direction, ref BotonGeneric ___BG_Remove, string cardId = "")
		{
			if ((Object)(object)__instance == (Object)null)
			{
				Plugin.LogDebug("__instance == null");
				return;
			}
			CardData cardData = Globals.Instance.GetCardData(cardId, false);
			if (((cardData == null) ? null : cardData.Id?.StartsWith("stormjavelin")).GetValueOrDefault() && __instance.craftType == 1)
			{
				Plugin.LogDebug("Preventing stormjavelin from being removed");
				___BG_Remove.Disable();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Character), "DamageBonus")]
		public static void DamageBonus(Character __instance, ref float[] __result, DamageType DT, int energyCost = 0)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Invalid comparison between Unknown and I4
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Invalid comparison between Unknown and I4
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			if (CustomFunctions.IsLivingHero(__instance) && ((int)DT == 6 || (int)DT == 3))
			{
				float num = 0f;
				if (__instance.HaveItem("javthundershield", -1, false))
				{
					num = 5f;
				}
				if (__instance.HaveItem("javthundershieldrare", -1, false))
				{
					num = 10f;
				}
				if (num != 0f)
				{
					int stormJavelinCount = StormJavelinFunctions.GetStormJavelinCount(__instance);
					float num2 = num * (float)stormJavelinCount;
					Plugin.LogDebug($"Bonus Damage from ThunderShield {__instance.SourceName} {DT} {energyCost} {num2}");
					__result[1] += num2;
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Functions), "GetCardByRarity")]
		public static void GetCardByRarityPostfix(ref string __result, int rarity, CardData _cardData, bool isChallenge = false)
		{
			if (Plugin.EnableRandomJavelins.Value)
			{
				Plugin.LogDebug($"GetCardByRarityPostfix {rarity} {__result}");
				int num = 5;
				string text = AtOManager.Instance?.currentMapNode ?? (AtOManager.Instance.GetGameId() + __result);
				Random.InitState(Functions.GetDeterministicHashCode(text));
				if (Random.Range(0, 100) < num)
				{
					text += "1";
					string stormJavelinUpgraded = StormJavelinFunctions.GetStormJavelinUpgraded(text);
					__result = stormJavelinUpgraded;
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Hero), "SetInitialCards")]
		public static void SetInitialCardsPostfix(ref Hero __instance, HeroData heroData)
		{
			Plugin.LogDebug("SetInitialCardsPostfix");
			Hero obj = __instance;
			List<string> list = ((obj != null) ? ((Character)obj).Cards : null);
			list?.Add("stormjavelin");
			list?.Add("stormjavelin");
			((Character)__instance).Cards = list;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "com.binbin.StormJavelin";

		public const string PLUGIN_NAME = "StormJavelin";

		public const string PLUGIN_VERSION = "0.1.0";
	}
}