Decompiled source of Hero Customizations Perks v0.1.1

BepInEx/plugins/com.binbinAndLeif.PerkManager.dll

Decompiled 3 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Obeliskial_Content;
using Obeliskial_Essentials;
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.binbinAndLeif.PerkManager")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("0.1.0.0")]
[assembly: AssemblyInformationalVersion("0.1")]
[assembly: AssemblyProduct("Custom Perks")]
[assembly: AssemblyTitle("com.binbinAndLeif.PerkManager")]
[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 PerkManager
{
	public class DescriptionFunctions
	{
		public static List<string> cardsWithCustomDescriptions = new List<string>(2) { "manachargedboots", "soulcollectinglantern" };

		public static List<string> cardsToAppendDescription = new List<string>();

		public static List<string> cardsToPrependDescription = new List<string>(4) { "thulsreworkinnate", "breenaturepaladininnnate", "reworkedvamprism", "laiareworkinnate" };

		public static string NumFormatItem(int num, bool plus = false, bool percent = false)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(" <nobr>");
			if (num > 0)
			{
				stringBuilder.Append("<color=#263ABC><size=+.1>");
				if (plus)
				{
					stringBuilder.Append("+");
				}
			}
			else
			{
				stringBuilder.Append("<color=#720070><size=+.1>");
				if (plus)
				{
					stringBuilder.Append("-");
				}
			}
			stringBuilder.Append(Mathf.Abs(num));
			if (percent)
			{
				stringBuilder.Append("%");
			}
			stringBuilder.Append("</color></size></nobr>");
			return stringBuilder.ToString();
		}

		public static void BinbinNormalizeDescription(ref CardData __instance, StringBuilder stringBuilder)
		{
			stringBuilder.Replace("<c>", "<color=#5E3016>");
			stringBuilder.Replace("</c>", "</color>");
			stringBuilder.Replace("<nb>", "<nobr>");
			stringBuilder.Replace("</nb>", "</nobr>");
			stringBuilder.Replace("<br1>", "<br><line-height=15%><br></line-height>");
			stringBuilder.Replace("<br2>", "<br><line-height=30%><br></line-height>");
			stringBuilder.Replace("<br3>", "<br><line-height=50%><br></line-height>");
			string input = stringBuilder.ToString();
			input = Regex.Replace(input, "[,][ ]*(<(.*?)>)*(.)", (Match m) => m.ToString().ToLower());
			input = Regex.Replace(input, "<br>\\w", (Match m) => m.ToString().ToUpper());
			Globals.Instance.CardsDescriptionNormalized[__instance.Id] = stringBuilder.ToString();
			__instance.DescriptionNormalized = input;
			Traverse.Create((object)__instance).Field("descriptionNormalized").SetValue((object)input);
		}

		public static void HandleDamagePercentDescription(ref StringBuilder stringBuilder, ItemData itemData, DamageType damageType, float percentIncrease)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			if (itemData.Id == "battleaxerare")
			{
				Plugin.LogDebug(" battleaxerare");
			}
			if ((int)damageType != 0 && (int)damageType != 10 && percentIncrease != 0f)
			{
				string text = ((object)(DamageType)(ref damageType)).ToString().ToLower();
				int num = Functions.FuncRoundToInt(itemData.DamagePercentBonusValue);
				Plugin.LogDebug("damage type - " + text);
				string text2 = "item" + text + "Damages";
				Plugin.LogDebug("medsText - " + Essentials.medsTexts[text2]);
				Plugin.LogDebug("GetText - " + Texts.Instance.GetText(text2, ""));
				string value = string.Format(Essentials.medsTexts[text2], NumFormatItem(num, plus: true, percent: true)) + "\n";
				stringBuilder.Insert(0, value);
			}
		}

		public static void HandleAllDamagePercentDescriptions(ref CardData __instance)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Invalid comparison between Unknown and I4
			//IL_0071: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
			StringBuilder stringBuilder = new StringBuilder();
			if (!((Object)(object)__instance.Item == (Object)null))
			{
				ItemData item = __instance.Item;
				if ((int)item.DamagePercentBonus != 0 || (int)item.DamagePercentBonus2 != 0 || (int)item.DamagePercentBonus3 != 0)
				{
					stringBuilder.Append(Globals.Instance.CardsDescriptionNormalized[__instance.Id]);
					HandleDamagePercentDescription(ref stringBuilder, item, __instance.Item.DamagePercentBonus, __instance.Item.DamagePercentBonusValue);
					HandleDamagePercentDescription(ref stringBuilder, item, __instance.Item.DamagePercentBonus2, __instance.Item.DamagePercentBonusValue2);
					HandleDamagePercentDescription(ref stringBuilder, item, __instance.Item.DamagePercentBonus3, __instance.Item.DamagePercentBonusValue3);
					BinbinNormalizeDescription(ref __instance, stringBuilder);
				}
			}
		}

		public static void UpdateMaxMadnessChargesByItem(ref AuraCurseData __result, Character characterOfInterest, string itemID)
		{
			if ((Object)(object)__result == (Object)null)
			{
				Plugin.LogDebug("null AuraCurse");
				return;
			}
			CustomFunctions.AppliesTo appliesTo = (__result.IsAura ? CustomFunctions.AppliesTo.Heroes : CustomFunctions.AppliesTo.Monsters);
			if (CustomFunctions.IfCharacterHas(characterOfInterest, CustomFunctions.CharacterHas.Item, itemID + "rare", appliesTo))
			{
				Plugin.LogDebug("UpdateChargesByItem: " + itemID + "rare");
				ItemData itemData = Globals.Instance.GetItemData(itemID + "rare");
				if (!((Object)(object)itemData == (Object)null))
				{
					if (__result.MaxCharges != -1)
					{
						AuraCurseData obj = __result;
						obj.MaxCharges += itemData.AuracurseCustomModValue1;
					}
					if (__result.MaxMadnessCharges != -1)
					{
						AuraCurseData obj2 = __result;
						obj2.MaxMadnessCharges += itemData.AuracurseCustomModValue1;
					}
				}
			}
			else
			{
				if (!CustomFunctions.IfCharacterHas(characterOfInterest, CustomFunctions.CharacterHas.Item, itemID, appliesTo))
				{
					return;
				}
				Plugin.LogDebug("UpdateChargesByItem: " + itemID);
				ItemData itemData2 = Globals.Instance.GetItemData(itemID);
				if (!((Object)(object)itemData2 == (Object)null))
				{
					if (__result.MaxCharges != -1)
					{
						AuraCurseData obj3 = __result;
						obj3.MaxCharges += itemData2.AuracurseCustomModValue1;
					}
					if (__result.MaxMadnessCharges != -1)
					{
						AuraCurseData obj4 = __result;
						obj4.MaxMadnessCharges += itemData2.AuracurseCustomModValue1;
					}
					Plugin.LogDebug($"UpdateChargesByItem: {itemID} - post update max charges {__result.MaxMadnessCharges}");
				}
			}
		}

		public static string SpriteText(string sprite)
		{
			StringBuilder stringBuilder = new StringBuilder();
			string text = sprite.ToLower().Replace(" ", "");
			switch (text)
			{
			case "block":
			case "card":
				stringBuilder.Append("<space=.2>");
				break;
			case "piercing":
				stringBuilder.Append("<space=.4>");
				break;
			case "bleed":
				stringBuilder.Append("<space=.1>");
				break;
			case "bless":
				stringBuilder.Append("<space=.1>");
				break;
			default:
				stringBuilder.Append("<space=.3>");
				break;
			}
			stringBuilder.Append(" <space=-.2>");
			stringBuilder.Append("<size=+.1><sprite name=");
			stringBuilder.Append(text);
			stringBuilder.Append("></size>");
			switch (text)
			{
			case "bleed":
				stringBuilder.Append("<space=-.4>");
				break;
			case "card":
				stringBuilder.Append("<space=-.2>");
				break;
			case "powerful":
			case "fury":
				stringBuilder.Append("<space=-.1>");
				break;
			default:
				stringBuilder.Append("<space=-.2>");
				break;
			case "reinforce":
			case "fire":
				break;
			}
			return stringBuilder.ToString();
		}

		public static string ColorTextArray(string type, params string[] text)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append("<nobr>");
			if (type == null || type.Length != 0)
			{
				switch (type)
				{
				case "damage":
					stringBuilder.Append("<color=#B00A00>");
					break;
				case "heal":
					stringBuilder.Append("<color=#1E650F>");
					break;
				case "aura":
					stringBuilder.Append("<color=#263ABC>");
					break;
				case "curse":
					stringBuilder.Append("<color=#720070>");
					break;
				case "system":
					stringBuilder.Append("<color=#5E3016>");
					break;
				default:
					stringBuilder.Append("<color=#5E3016");
					stringBuilder.Append(">");
					break;
				}
			}
			int num = 0;
			foreach (string value in text)
			{
				if (num > 0)
				{
					stringBuilder.Append(" ");
				}
				stringBuilder.Append(value);
				num++;
			}
			if (type != "")
			{
				stringBuilder.Append("</color>");
			}
			stringBuilder.Append("</nobr> ");
			return stringBuilder.ToString();
		}

		public static void AppendDescriptionsToCards(CardData __instance, ref StringBuilder stringBuilder1)
		{
			if (cardsToAppendDescription.Contains(__instance.Id))
			{
				Plugin.LogDebug("Creating description for " + __instance.Id);
				Plugin.LogDebug($"Current description {__instance.Id}: {stringBuilder1}");
				string text = "hcperks" + __instance.Id;
				stringBuilder1.Append(Functions.FormatStringCard(Texts.Instance.GetText(text, "")));
			}
		}

		public static void PrependDescriptionsToCards(CardData __instance, ref StringBuilder stringBuilder1)
		{
			if (cardsToPrependDescription.Contains(__instance.Id))
			{
				Plugin.LogDebug("Creating description for " + __instance.Id);
				Plugin.LogDebug($"Current description {__instance.Id}: {stringBuilder1}");
				string text = "hcperks" + __instance.Id;
				stringBuilder1.Insert(0, Functions.FormatStringCard(Texts.Instance.GetText(text, "")));
			}
		}
	}
	public class CharacterFunctions
	{
	}
	public class CustomFunctions
	{
		public enum AppliesTo
		{
			None,
			Global,
			Monsters,
			Heroes,
			ThisHero
		}

		public enum CharacterHas
		{
			Perk,
			Item,
			Trait
		}

		public static void PLog(string s)
		{
			Plugin.Log.LogDebug((object)(Plugin.debugBase + s));
		}

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

		public static void WhenYouPlayXRefund1Energy(CardType cardType, ref Character _character, string traitName, string traitID)
		{
		}

		public static void ApplyAuraCurseTo(string auraCurse, int amount, bool allHeroFlag, bool allNpcFlag, bool randomHeroFlag, bool randomNpcFlag, ref Character _character, ref Hero[] teamHeroes, ref NPC[] teamNpc, string traitName, string soundEffect)
		{
			if (allNpcFlag)
			{
				for (int i = 0; i < teamNpc.Length; i++)
				{
					if (teamNpc[i] != null && ((Character)teamNpc[i]).Alive)
					{
						((Character)teamNpc[i]).SetAuraTrait(_character, auraCurse, amount);
						if (((Character)teamNpc[i]).NPCItem != null)
						{
							((CharacterItem)((Character)teamNpc[i]).NPCItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
							EffectsManager.Instance.PlayEffectAC(soundEffect, true, ((CharacterItem)((Character)teamNpc[i]).NPCItem).CharImageT, false, 0f, false);
						}
					}
				}
			}
			if (!allHeroFlag)
			{
				return;
			}
			for (int j = 0; j < teamHeroes.Length; j++)
			{
				if (teamHeroes[j] != null && ((Character)teamHeroes[j]).Alive)
				{
					((Character)teamHeroes[j]).SetAuraTrait(_character, auraCurse, amount);
					if (((Character)teamHeroes[j]).NPCItem != null)
					{
						((CharacterItem)((Character)teamHeroes[j]).HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
						EffectsManager.Instance.PlayEffectAC(soundEffect, true, ((CharacterItem)((Character)teamHeroes[j]).NPCItem).CharImageT, false, 0f, false);
					}
				}
			}
		}

		public static void WhenYouGainXGainY(string gainedAuraCurse, string desiredAuraCurse, string appliedAuraCurse, int n_charges_incoming, int n_bonus_charges, float multiplier, ref Character _character, string traitName)
		{
			if ((Object)(object)MatchManager.Instance != (Object)null && gainedAuraCurse != null && (Object)(object)_character.HeroData != (Object)null && gainedAuraCurse == desiredAuraCurse)
			{
				int num = Mathf.RoundToInt((float)(n_charges_incoming + n_bonus_charges) * multiplier);
				_character.SetAuraTrait(_character, appliedAuraCurse, 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 n_charges, 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) / n_charges));
			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 AddImmunityToHero(string immunity, ref Hero _character)
		{
			if (!((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, string traitName)
		{
			int auraCharges = _character.GetAuraCharges(auraCurseDependent);
			int num = Mathf.FloorToInt((float)auraCharges / stacks_per_bonus);
			_character.ModifyAuraCurseQuantity(auraCurseToModify, num);
		}

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

		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 traitName)
		{
			//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(traitName);
			if (MatchManager.Instance.activatedTraits != null && MatchManager.Instance.activatedTraits.ContainsKey(traitName) && MatchManager.Instance.activatedTraits[traitName] > 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(traitName))
					{
						MatchManager.Instance.activatedTraits.Add(traitName, 1);
					}
					else
					{
						Dictionary<string, int> activatedTraits = MatchManager.Instance.activatedTraits;
						int value = activatedTraits[traitName] + 1;
						activatedTraits[traitName] = 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_" + traitName, "") + TextChargesLeft(MatchManager.Instance.activatedTraits[traitName], 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 traitName)
		{
			//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(traitName);
			if ((MatchManager.Instance.activatedTraits != null && MatchManager.Instance.activatedTraits.ContainsKey(traitName) && MatchManager.Instance.activatedTraits[traitName] > 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(traitName))
			{
				MatchManager.Instance.activatedTraits.Add(traitName, 1);
			}
			else
			{
				Dictionary<string, int> activatedTraits = MatchManager.Instance.activatedTraits;
				int value = activatedTraits[traitName] + 1;
				activatedTraits[traitName] = 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_" + traitName, "") + TextChargesLeft(MatchManager.Instance.activatedTraits[traitName], traitData.TimesPerTurn), (CombatScrollEffectType)7);
			MatchManager.Instance.CreateLogCardModification(val.InternalId, MatchManager.Instance.GetHero(_character.HeroIndex));
		}

		public static int CountAllStacks(string auraCurse, Hero[] teamHero, NPC[] teamNpc)
		{
			int num = 0;
			for (int i = 0; i < teamHero.Length; i++)
			{
				if (teamHero[i] != null && (Object)(object)((Character)teamHero[i]).HeroData != (Object)null && ((Character)teamHero[i]).Alive)
				{
					num += ((Character)teamHero[i]).GetAuraCharges(auraCurse);
				}
			}
			for (int j = 0; j < teamNpc.Length; j++)
			{
				if (teamNpc[j] != null && ((Character)teamNpc[j]).Alive)
				{
					num += ((Character)teamNpc[j]).GetAuraCharges(auraCurse);
				}
			}
			return 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, Plugin.perkBase + perkName);
		}

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

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

		public static bool TeamHasPerk(string perkName)
		{
			return AtOManager.Instance.TeamHavePerk(Plugin.perkBase + perkName);
		}

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

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

		public static bool CharacterObjectHaveTrait(Character _character, string _perk_id)
		{
			if (_character == null)
			{
				return false;
			}
			return AtOManager.Instance.CharacterHaveTrait(_character.SubclassName, _perk_id);
		}

		public static void CastTargetCard(string cardToCast)
		{
			CardData cardData = Globals.Instance.GetCardData(cardToCast, true);
			((MonoBehaviour)MatchManager.Instance).StartCoroutine(MatchManager.Instance.CastCard((CardItem)null, true, cardData, 0, -1, true, (Hero)null));
		}

		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, Plugin.perkBase + id) || AtOManager.Instance.CharacterHaveItem(characterOfInterest.SubclassName, id);
					break;
				case CharacterHas.Perk:
					flag2 = AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, Plugin.perkBase + id) || AtOManager.Instance.CharacterHavePerk(characterOfInterest.SubclassName, id);
					break;
				case CharacterHas.Trait:
					flag2 = AtOManager.Instance.CharacterHaveTrait(characterOfInterest.SubclassName, Plugin.perkBase + id) || AtOManager.Instance.CharacterHaveTrait(characterOfInterest.SubclassName, id);
					break;
				}
			}
			else
			{
				switch (characterHas)
				{
				case CharacterHas.Item:
					flag2 = AtOManager.Instance.TeamHaveItem(Plugin.perkBase + id, -1, false) || AtOManager.Instance.TeamHaveItem(id, -1, false);
					break;
				case CharacterHas.Perk:
					flag2 = AtOManager.Instance.TeamHavePerk(Plugin.perkBase + id) || AtOManager.Instance.TeamHavePerk(id);
					break;
				case CharacterHas.Trait:
					flag2 = AtOManager.Instance.TeamHaveTrait(Plugin.perkBase + id) || AtOManager.Instance.TeamHaveTrait(id);
					break;
				}
			}
			if (flag2 && flag)
			{
				Plugin.LogDebug("Applying Perk - " + id);
			}
			return flag2 && flag;
		}

		public static bool CanIncrementTraitActivations(TraitData traitData, int bonusActivations = 0, bool useRound = false)
		{
			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;
			}
			int num;
			if (useRound)
			{
				num = traitData.TimesPerRound - 1 + bonusActivations;
				if (MatchManager.Instance.activatedTraitsRound != null && MatchManager.Instance.activatedTraitsRound.ContainsKey(id) && MatchManager.Instance.activatedTraitsRound[id] > num)
				{
					return false;
				}
				return true;
			}
			num = traitData.TimesPerTurn - 1 + bonusActivations;
			if (MatchManager.Instance.activatedTraits.ContainsKey(id) && MatchManager.Instance.activatedTraits[id] > num)
			{
				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, bool useRound = false)
		{
			TraitData traitData = Globals.Instance.GetTraitData(traitId);
			return CanIncrementTraitActivations(traitData, bonusActivations, useRound);
		}

		public static void IncrementTraitActivations(TraitData traitData, bool useRound = false)
		{
			string id = traitData.Id;
			if (useRound)
			{
				if (!MatchManager.Instance.activatedTraitsRound.ContainsKey(id))
				{
					MatchManager.Instance.activatedTraitsRound.Add(id, 1);
				}
				else
				{
					Dictionary<string, int> activatedTraitsRound = MatchManager.Instance.activatedTraitsRound;
					string key = id;
					int value = activatedTraitsRound[key] + 1;
					activatedTraitsRound[key] = value;
				}
			}
			else 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, bool useRound = false)
		{
			TraitData traitData = Globals.Instance.GetTraitData(traitId);
			IncrementTraitActivations(traitData, useRound);
		}

		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;
			}
			}
		}
	}
	[HarmonyPatch]
	public class PerkBackgroundExtension
	{
		public static string subclassidstring = "";

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PerkNodeAmplify), "SetForNodes")]
		public static bool SetForNodesPrefix(PerkNodeAmplify __instance, int _numNodes)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			PolygonCollider2D component = ((Component)__instance).GetComponent<PolygonCollider2D>();
			float num = -0.7f * (float)(_numNodes - 1);
			switch (_numNodes)
			{
			case 2:
				((Component)__instance.bg2).gameObject.SetActive(true);
				((Component)__instance.bg3).gameObject.SetActive(false);
				((Component)__instance.bg4).gameObject.SetActive(false);
				__instance.amplifyNodes.localPosition = new Vector3(num, __instance.amplifyNodes.localPosition.y, __instance.amplifyNodes.localPosition.z);
				component.points = ((Component)__instance.bg2).GetComponent<PolygonCollider2D>().points;
				break;
			case 3:
				((Component)__instance.bg2).gameObject.SetActive(false);
				((Component)__instance.bg3).gameObject.SetActive(true);
				((Component)__instance.bg4).gameObject.SetActive(false);
				__instance.amplifyNodes.localPosition = new Vector3(num, __instance.amplifyNodes.localPosition.y, __instance.amplifyNodes.localPosition.z);
				component.points = ((Component)__instance.bg3).GetComponent<PolygonCollider2D>().points;
				break;
			default:
			{
				((Component)__instance.bg2).gameObject.SetActive(false);
				((Component)__instance.bg3).gameObject.SetActive(false);
				((Component)__instance.bg4).gameObject.SetActive(true);
				__instance.amplifyNodes.localPosition = new Vector3(num, __instance.amplifyNodes.localPosition.y, __instance.amplifyNodes.localPosition.z);
				float num2 = (float)_numNodes / 4f;
				((Component)__instance.bg4).transform.localScale = new Vector3(num2, 1f, 1f);
				PolygonCollider2D component2 = ((Component)__instance.bg4).GetComponent<PolygonCollider2D>();
				Vector2[] points = component2.points;
				for (int i = 0; i < points.Length; i++)
				{
					points[i] = new Vector2(points[i].x * num2, points[i].y);
				}
				component.points = points;
				break;
			}
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PerkTree), "DrawTree")]
		public static void DrawTreePrefix()
		{
			Plugin.Log.LogDebug((object)(Plugin.debugBase + "Draw Tree"));
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(PerkTree), "Show")]
		public static void ShowPostfix(string _subClassId, int currentHeroIndex)
		{
			if (_subClassId != null)
			{
				subclassidstring = _subClassId;
				if (subclassidstring == "naturepaladin")
				{
					subclassidstring = "warden";
				}
				if (subclassidstring == "naturepaladin")
				{
					subclassidstring = "prophet";
				}
				if (subclassidstring == "tracker")
				{
					subclassidstring = "ranger";
				}
				Plugin.reworkPerkDesc = "No 'rework' setup for this character. There's no need to take this perk";
				Plugin.multiclassPerkDesc = "No 'multiclass' setup for this character. There's no need to take this perk";
				if (subclassidstring == "warlock")
				{
					Plugin.reworkPerkDesc = "Zek's soul lantern increases Zek's max hp for every kill. Vampirism instead buffs Zek's damage based on his max hp (1% more damage per 4 max hp Zek has).";
				}
				if (subclassidstring == "warden")
				{
					Plugin.multiclassPerkDesc = "Bree becomes a Nature Paladin (Warrior/Healer) with a new innate ability and starting deck. Perhaps more changes in the future";
				}
				if (subclassidstring == "engineer")
				{
					Plugin.reworkPerkDesc = "Nenukil starts with 'Mana Charged Boots', which allows fast to stack on Nenukil but removes fast at the END of Nenukil's turn. Note: Your mana charged boots may not appear until you enter combat.";
				}
				if (subclassidstring == "assassin")
				{
					Plugin.reworkPerkDesc = "Replaces Thuls' innate ability with 'Sneaky Sneaky' which increases stealth charges applied by 1";
				}
				if (subclassidstring == "paladin")
				{
					Plugin.reworkPerkDesc = "Replaces Laia's innate ability with 'Protecter' which heals allies whenever Laia applies 'block'";
				}
				if (subclassidstring == "minstrel")
				{
					Plugin.reworkPerkDesc = "Replaces Gustav's starting deck with a deck with more healing and speed support";
				}
				if (subclassidstring == "prophet")
				{
					Plugin.multiclassPerkDesc = "Nezglekt gets different starting stats, a new starting deck and a scout secondary class";
				}
				if (subclassidstring == "ranger")
				{
					Plugin.multiclassPerkDesc = "Andrin becomes a Scout/Warrior, getting a different starting deck but losing 1 speed to gain some max hp";
				}
				Essentials.medsTexts["custom_binbin_mainperk_rework0"] = Plugin.reworkPerkDesc;
				Essentials.medsTexts["custom_binbin_mainperk_multiclass0"] = Plugin.multiclassPerkDesc;
			}
			else
			{
				subclassidstring = "";
			}
		}
	}
	public struct Whatapain
	{
		public Hero hero;

		public string subclassname;

		public string subclassid;
	}
	[HarmonyPatch]
	public class PerkPatches
	{
		public static int[] paralyzeCounters = new int[4];

		public static bool blockShieldFlag = false;

		public static int blockCount = 0;

		public static int shieldCount = 0;

		public static bool mark1dFlag = true;

		public static bool poison2gFlag = true;

		public static bool bleed2gFlag = true;

		public static bool thorns1eFlag = true;

		public static bool shackle1fFlag = false;

		public static bool insulate1dFlag = false;

		public static bool isDamagePreviewActive = false;

		public static bool isCalculateDamageActive = false;

		public static int infiniteProctection = 0;

		public static int infiniteProctectionPowerful = 0;

		public static bool applyAuraAfter = false;

		public static Whatapain fingerscrossed;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(AtOManager), "BeginAdventure")]
		public static void BeginAdventurePostfix(ref AtOManager __instance)
		{
			Hero[] value = Traverse.Create((object)__instance).Field("teamAtO").GetValue<Hero[]>();
			foreach (Hero hero in value)
			{
				HandleExpPerks(hero);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(AtOManager), "BeginAdventure")]
		public static void BeginAdventurePrefix(ref AtOManager __instance)
		{
			Hero[] value = Traverse.Create((object)__instance).Field("teamAtO").GetValue<Hero[]>();
			for (int i = 0; i < value.Length; i++)
			{
				Hero hero = value[i];
				HandleMulticlassPerks(hero);
				HandleReworkPerks(hero, i);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CharacterReward), "Init")]
		public static void InitPrefix()
		{
			Hero[] value = Traverse.Create((object)RewardsManager.Instance).Field("theTeam").GetValue<Hero[]>();
			foreach (Hero hero in value)
			{
				HandleReloadofMulticlassPerks(hero);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(AtOManager), "DoCardCraft")]
		public static void DoCardCraftPostfix()
		{
			Hero[] value = Traverse.Create((object)AtOManager.Instance).Field("teamAtO").GetValue<Hero[]>();
			foreach (Hero hero in value)
			{
				HandleReloadofMulticlassPerks(hero);
			}
		}

		public static void HandleExpPerks(Hero _hero)
		{
			int num = 0;
			int num2 = 10;
			int num3 = 40;
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "exp0"))
			{
				num += num2;
			}
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "exp1"))
			{
				num += num2;
			}
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "exp2"))
			{
				num += num2;
			}
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "exp3"))
			{
				num += num3;
			}
			((Character)_hero).GrantExperience(num);
		}

		public static void HandleReworkPerks(Hero _hero, int thisisanindex)
		{
			Plugin.LogDebug("BeginofAdvent handling of perks");
			for (int i = 0; i < ((Character)_hero).Traits.Length; i++)
			{
				Plugin.LogDebug(((Character)_hero).Traits[i] ?? "");
			}
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "rework0"))
			{
				if (((Character)_hero).SubclassName == "assassin")
				{
					ApplyTraitsViaPerks(_hero);
				}
				if (((Character)_hero).SubclassName == "engineer")
				{
					HandleSettingItemsViaPerks(_hero, thisisanindex);
				}
				if (((Character)_hero).SubclassName == "warlock")
				{
					ApplyTraitsViaPerks(_hero);
					HandleSettingItemsViaPerks(_hero, thisisanindex);
				}
				if (((Character)_hero).SubclassName == "paladin")
				{
					ApplyTraitsViaPerks(_hero);
				}
				if (((Character)_hero).SubclassName == "minstrel")
				{
					SubClassData subClassData = Globals.Instance.GetSubClassData("bard");
					((Character)_hero).HeroData.HeroSubClass.Cards = subClassData.Cards;
					((Character)_hero).InitData();
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Hero), "SetInitialItems")]
		public static void SetInitialItemsPrefix(ref Hero __instance, ref CardData _cardData, ref int _rankLevel)
		{
			Plugin.LogDebug("SetInitialItemsPrefix " + _cardData.Id);
		}

		public static void HandleMulticlassPerks(Hero _hero)
		{
			string text = "";
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "multiclass0"))
			{
				if (((Character)_hero).SubclassName == "warden")
				{
					text = "naturepaladin";
				}
				if (((Character)_hero).SubclassName == "prophet")
				{
					text = "seer";
				}
				if (((Character)_hero).SubclassName == "ranger")
				{
					text = "tracker";
				}
			}
			if (text != "")
			{
				SubClassData subClassData = Globals.Instance.GetSubClassData(text);
				subClassData.SubClassName = ((Object)((Character)_hero).HeroData.HeroSubClass).name;
				subClassData.Id = ((Character)_hero).HeroData.HeroSubClass.Id;
				subClassData.Sprite = ((Character)_hero).HeroData.HeroSubClass.Sprite;
				subClassData.SpriteBorder = ((Character)_hero).HeroData.HeroSubClass.SpriteBorder;
				subClassData.SpriteBorderSmall = ((Character)_hero).HeroData.HeroSubClass.SpriteBorderSmall;
				subClassData.SpritePortrait = ((Character)_hero).HeroData.HeroSubClass.SpritePortrait;
				subClassData.SpriteSpeed = ((Character)_hero).HeroData.HeroSubClass.SpriteSpeed;
				((Character)_hero).HeroData.HeroSubClass = subClassData;
				((Character)_hero).InitData();
			}
		}

		public static void HandleReloadofMulticlassPerks(Hero _hero)
		{
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "multiclass0"))
			{
				if (((Character)_hero).SubclassName == "warden")
				{
					((Character)_hero).HeroData.HeroSubClass.HeroClassSecondary = (HeroClass)2;
				}
				if (((Character)_hero).SubclassName == "prophet")
				{
					((Character)_hero).HeroData.HeroSubClass.HeroClassSecondary = (HeroClass)3;
				}
				if (((Character)_hero).SubclassName == "ranger")
				{
					((Character)_hero).HeroData.HeroSubClass.HeroClassSecondary = (HeroClass)0;
				}
			}
		}

		public static void ApplyTraitsViaPerks(Hero _hero)
		{
			Plugin.LogDebug("ApplyInnateTraitsViaPerks for " + ((Character)_hero).SubclassName);
			if (((Character)_hero).SubclassName == "assassin")
			{
				((Character)_hero).Traits[0] = "thulsreworkinnate";
				((Character)_hero).HeroData.HeroSubClass.Trait0 = Globals.Instance.GetTraitData("thulsreworkinnate");
			}
			if (((Character)_hero).SubclassName == "warlock")
			{
				((Character)_hero).HeroData.HeroSubClass.Trait4B = Globals.Instance.GetTraitData("reworkedvampirism");
			}
			if (((Character)_hero).SubclassName == "paladin")
			{
				((Character)_hero).Traits[0] = "laiareworkinnate";
				((Character)_hero).HeroData.HeroSubClass.Trait0 = Globals.Instance.GetTraitData("laiareworkinnate");
			}
		}

		public static void HandleSettingItemsViaPerks(Hero _hero, int thisisanindex)
		{
			if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "rework0"))
			{
				if (((Character)_hero).SubclassName == "engineer")
				{
					TryingToReassignStartingItemsWithPerks(_hero, thisisanindex, 1, "rocketboots", "manachargedboots");
				}
				if (((Character)_hero).SubclassName == "warlock")
				{
					TryingToReassignStartingItemsWithPerks(_hero, thisisanindex, 3, "soullantern", "soulcollectinglantern");
				}
			}
		}

		public static void TryingToReassignStartingItemsWithPerks(Hero _hero, int thisisanindex, int slotnumber, string replaceitemname, string newitemname)
		{
			ItemData itemDataBySlot = ((Character)_hero).GetItemDataBySlot(slotnumber, false);
			if (!((Object)(object)itemDataBySlot == (Object)null))
			{
				if (Object.op_Implicit((Object)(object)itemDataBySlot) && itemDataBySlot.Id == replaceitemname)
				{
					AtOManager.Instance.AddItemToHero(thisisanindex, newitemname, "");
				}
				else if (Object.op_Implicit((Object)(object)itemDataBySlot) && itemDataBySlot.Id == replaceitemname + "a")
				{
					AtOManager.Instance.AddItemToHero(thisisanindex, newitemname + "a", "");
				}
				else if (Object.op_Implicit((Object)(object)itemDataBySlot) && itemDataBySlot.Id == replaceitemname + "b")
				{
					AtOManager.Instance.AddItemToHero(thisisanindex, newitemname + "b", "");
				}
				else if (Object.op_Implicit((Object)(object)itemDataBySlot) && itemDataBySlot.Id == replaceitemname + "rare")
				{
					AtOManager.Instance.AddItemToHero(thisisanindex, newitemname + "rare", "");
				}
				else if (!Object.op_Implicit((Object)(object)itemDataBySlot))
				{
					Plugin.LogDebug(itemDataBySlot.Id);
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(MatchManager), "GenerateHeroes")]
		public static void GenerateHeroesPostfix(ref MatchManager __instance)
		{
			Hero[] teamHero = MatchManager.Instance.GetTeamHero();
			for (int i = 0; i < teamHero.Length; i++)
			{
				if (teamHero[i] != null)
				{
					Hero val = teamHero[i];
					Plugin.LogDebug(" PerkList for " + ((Character)val).SubclassName + ": " + string.Join(",", ((Character)val).PerkList.ToArray()));
					if (CustomFunctions.CharacterObjectHavePerk((Character)(object)val, "rework0"))
					{
						HandleSettingItemsViaPerks(val, i);
					}
					Traverse.Create((object)MatchManager.Instance).Field("teamHero").SetValue((object)teamHero);
					for (int j = 0; j < ((Character)val).Traits.Length; j++)
					{
						Plugin.LogDebug($"Trait {j + 1} - {((Character)val).Traits[j]}");
					}
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Character), "SetEvent")]
		public static void SetEventPrefix(ref Character __instance, EventActivation theEvent, ref int auxInt, Character target = null, string auxString = "")
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Invalid comparison between Unknown and I4
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Invalid comparison between Unknown and I4
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Invalid comparison between Unknown and I4
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Invalid comparison between Unknown and I4
			if ((int)theEvent == 18 || (int)theEvent == 26 || __instance == null || (int)theEvent == 0)
			{
				return;
			}
			Hero[] teamHero = MatchManager.Instance.GetTeamHero();
			NPC[] teamNPC = MatchManager.Instance.GetTeamNPC();
			string name = Enum.GetName(typeof(EventActivation), theEvent);
			Plugin.LogDebug("SETEVENTPREFIX - START - " + name);
			if ((int)theEvent == 1)
			{
				infiniteProctection = 0;
				paralyzeCounters = new int[4];
				mark1dFlag = true;
			}
			if ((int)theEvent == 35 && !target.IsHero && target != null && CustomFunctions.IsLivingHero(__instance) && (CustomFunctions.IfCharacterHas(__instance, CustomFunctions.CharacterHas.Item, "soulcollectinglantern", CustomFunctions.AppliesTo.ThisHero) || CustomFunctions.IfCharacterHas(__instance, CustomFunctions.CharacterHas.Item, "soulcollectinglanterna", CustomFunctions.AppliesTo.ThisHero) || CustomFunctions.IfCharacterHas(__instance, CustomFunctions.CharacterHas.Item, "soulcollectinglanternb", CustomFunctions.AppliesTo.ThisHero) || CustomFunctions.IfCharacterHas(__instance, CustomFunctions.CharacterHas.Item, "soulcollectinglanternrare", CustomFunctions.AppliesTo.ThisHero)) && CustomFunctions.IfCharacterHas(__instance, CustomFunctions.CharacterHas.Perk, "rework0") && __instance.SubclassName == "warlock")
			{
				ItemData itemDataBySlot = __instance.GetItemDataBySlot(3, true);
				if (!((Object)(object)itemDataBySlot == (Object)null) && Object.op_Implicit((Object)(object)itemDataBySlot))
				{
					if (itemDataBySlot.Id == "soullantern" || itemDataBySlot.Id == "soullanterna" || itemDataBySlot.Id == "soullanternb" || itemDataBySlot.Id == "soullanternrare")
					{
						for (int i = 0; i < 4; i++)
						{
							if (teamHero[i] != null && teamHero[i] == __instance)
							{
								AtOManager.Instance.AddItemToHero(i, "soulcollectinglantern", "");
							}
						}
					}
					if (itemDataBySlot.Id == "soulcollectinglantern" || itemDataBySlot.Id == "soulcollectinglanterna" || itemDataBySlot.Id == "soulcollectinglanternb" || itemDataBySlot.Id == "soulcollectinglanternrare")
					{
						itemDataBySlot.MaxHealth += 1;
						for (int j = 0; j < 4; j++)
						{
							if (teamHero[j] != null && teamHero[j] == __instance)
							{
								AtOManager.Instance.AddItemToHero(j, "soulcollectinglantern", "");
							}
						}
					}
				}
			}
			if ((int)theEvent == 7)
			{
				Traits.infiniteProctectionThorns = false;
				Traits.infiniteProctectionVitality = false;
				Traits.posiblytemporaryflatnumberofthornstodo = 0;
				Traits.yougotthorns = null;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Character), "GetTraitDamagePercentModifiers")]
		public static void GetTraitDamagePercentModifiersPostfix(ref Character __instance, ref float __result)
		{
			if (CustomFunctions.CharacterObjectHaveTrait(__instance, "reworkedvampirism"))
			{
				int maxHP = __instance.GetMaxHP();
				int num = Mathf.FloorToInt((float)(maxHP / 4));
				__result += num;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(MatchManager), "SetDamagePreview")]
		public static void SetDamagePreviewPrefix()
		{
			isDamagePreviewActive = true;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(MatchManager), "SetDamagePreview")]
		public static void SetDamagePreviewPostfix()
		{
			isDamagePreviewActive = false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(CharacterItem), "CalculateDamagePrePostForThisCharacter")]
		public static void CalculateDamagePrePostForThisCharacterPrefix()
		{
			isCalculateDamageActive = true;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(CharacterItem), "CalculateDamagePrePostForThisCharacter")]
		public static void CalculateDamagePrePostForThisCharacterPostfix()
		{
			isCalculateDamageActive = false;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(AtOManager), "GlobalAuraCurseModificationByTraitsAndItems")]
		public static void GlobalAuraCurseModificationByTraitsAndItemsPostfixGeneral(ref AtOManager __instance, ref AuraCurseData __result, string _type, string _acId, Character _characterCaster, Character _characterTarget)
		{
			Character val = ((_type == "set") ? _characterTarget : _characterCaster);
			Character val2 = ((_type == "set") ? _characterCaster : _characterTarget);
			if (val == null)
			{
				return;
			}
			if (_acId == "fast" && CustomFunctions.IfCharacterHas(val, CustomFunctions.CharacterHas.Perk, "rework0", CustomFunctions.AppliesTo.Heroes) && val.SubclassName == "engineer")
			{
				ItemData itemDataBySlot = val.GetItemDataBySlot(1, false);
				if (!((Object)(object)itemDataBySlot == (Object)null) && Object.op_Implicit((Object)(object)itemDataBySlot) && (itemDataBySlot.Id == "manachargedboots" || itemDataBySlot.Id == "manachargedbootsa" || itemDataBySlot.Id == "manachargedbootsb" || itemDataBySlot.Id == "manachargedbootsrare"))
				{
					__result.GainCharges = true;
					__result.ConsumeAll = true;
					__result.ConsumedAtTurn = true;
					__result.ConsumedAtTurnBegin = false;
				}
			}
		}
	}
	[HarmonyPatch]
	public class PerkRewrites
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(Functions), "GetCardByRarity")]
		public static bool GetCardByRarityPrefix(ref string __result, int rarity, CardData _cardData, bool isChallenge = false)
		{
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Invalid comparison between Unknown and I4
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Invalid comparison between Unknown and I4
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Invalid comparison between Unknown and I4
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Invalid comparison between Unknown and I4
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Invalid comparison between Unknown and I4
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			int num = 78;
			int num2 = 88;
			int num3 = 98;
			int num4 = 0;
			if (!GameManager.Instance.IsObeliskChallenge())
			{
				num4 = AtOManager.Instance.GetMadnessDifficulty();
				if (num4 > 0)
				{
					num = 75;
					num2 = 85;
					num3 = 95;
				}
			}
			else
			{
				num4 = AtOManager.Instance.GetObeliskMadness();
			}
			CustomFunctions.PLog("GetCardByRarityPrefix - CardDataId - " + _cardData.Id);
			if (AtOManager.Instance.TeamHavePerk(Plugin.perkBase + "shards5c"))
			{
				int num5 = 2;
				num -= num5;
				num2 -= num5;
				num3 -= num5;
				Plugin.Log.LogDebug((object)(Plugin.debugBase + "Testing Perk shards5c: Modified value " + num3));
			}
			if (num4 > 0)
			{
				num -= num4;
				num2 -= Functions.FuncRoundToInt((float)num4 * 0.5f);
			}
			if (rarity < num)
			{
				__result = (((int)_cardData.CardUpgraded == 0 || !(_cardData.UpgradedFrom != "")) ? _cardData.Id.ToLower() : _cardData.UpgradedFrom.ToLower());
				CustomFunctions.PLog("GetCardByRarityPrefix Exit 1");
				return false;
			}
			if (rarity >= num && rarity < num2)
			{
				if ((int)_cardData.CardUpgraded == 1)
				{
					__result = _cardData.Id.ToLower();
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 2");
					return false;
				}
				if ((int)_cardData.CardUpgraded == 0)
				{
					__result = _cardData.UpgradesTo1.ToLower();
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 3");
					return false;
				}
				if ((int)_cardData.CardUpgraded == 2)
				{
					__result = (_cardData.UpgradedFrom + "A").ToLower();
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 4");
					return false;
				}
			}
			else
			{
				if (rarity >= num2 && rarity < num3)
				{
					if ((int)_cardData.CardUpgraded == 2)
					{
						__result = _cardData.Id.ToLower();
						CustomFunctions.PLog("GetCardByRarityPrefix Exit 5");
						return false;
					}
					__result = (((int)_cardData.CardUpgraded == 0) ? _cardData.UpgradesTo2.ToLower() : (_cardData.UpgradedFrom + "B").ToLower());
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 6");
					return false;
				}
				if ((int)_cardData.CardUpgraded == 0)
				{
					__result = (((Object)(object)_cardData.UpgradesToRare != (Object)null) ? _cardData.UpgradesToRare.Id.ToLower() : _cardData.Id.ToLower());
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 7");
					return false;
				}
				CardData cardData = Globals.Instance.GetCardData(_cardData.UpgradedFrom, false);
				if ((Object)(object)cardData != (Object)null && (Object)(object)cardData.UpgradesToRare != (Object)null)
				{
					__result = cardData.UpgradesToRare.Id.ToLower();
					CustomFunctions.PLog("GetCardByRarityPrefix Exit 8");
					return false;
				}
			}
			__result = _cardData.Id.ToLower();
			CustomFunctions.PLog("GetCardByRarityPrefix - END");
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Character), "BonusResists")]
		public static bool BonusResistsPrefix(ref Character __instance, ref int __result, DamageType damageType, string acId = "", bool countChargesConsumedPre = false, bool countChargesConsumedPost = false)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected I4, but got Unknown
			//IL_041a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0423: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			switch (damageType - 1)
			{
			case 0:
				if (__instance.IsImmune((DamageType)1))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistSlashing").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("reinforcedmonsters"))
				{
					num += 10;
				}
				break;
			case 1:
				if (__instance.IsImmune((DamageType)2))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistBlunt").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("reinforcedmonsters"))
				{
					num += 10;
				}
				break;
			case 2:
				if (__instance.IsImmune((DamageType)3))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistPiercing").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("reinforcedmonsters"))
				{
					num += 10;
				}
				break;
			case 3:
				if (__instance.IsImmune((DamageType)4))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistFire").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("elementalmonsters"))
				{
					num += 10;
				}
				break;
			case 4:
				if (__instance.IsImmune((DamageType)5))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistCold").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("elementalmonsters"))
				{
					num += 10;
				}
				break;
			case 5:
				if (__instance.IsImmune((DamageType)6))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistLightning").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("elementalmonsters"))
				{
					num += 10;
				}
				break;
			case 6:
				if (__instance.IsImmune((DamageType)7))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistMind").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("spiritualmonsters"))
				{
					num += 10;
				}
				break;
			case 7:
				if (__instance.IsImmune((DamageType)8))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistHoly").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("spiritualmonsters"))
				{
					num += 10;
				}
				break;
			case 8:
				if (__instance.IsImmune((DamageType)9))
				{
					num = 1000;
					break;
				}
				num += Traverse.Create((object)__instance).Field("resistShadow").GetValue<int>();
				if (!__instance.IsHero && AtOManager.Instance.IsChallengeTraitActive("spiritualmonsters"))
				{
					num += 10;
				}
				break;
			}
			if (num < 1000)
			{
				if (!__instance.IsHero)
				{
					if (MadnessManager.Instance.IsMadnessTraitActive("resistantmonsters") || AtOManager.Instance.IsChallengeTraitActive("resistantmonsters"))
					{
						num += 10;
					}
					if (AtOManager.Instance.IsChallengeTraitActive("vulnerablemonsters"))
					{
						num -= 15;
					}
				}
				num = num + __instance.GetItemResistModifiers(damageType) + __instance.GetAuraResistModifiers(damageType, acId, countChargesConsumedPre, countChargesConsumedPost, (CardData)null);
			}
			if (AtOManager.Instance.TeamHavePerk(Plugin.perkBase + "resistance5d"))
			{
				Plugin.Log.LogDebug((object)(Plugin.debugBase + "Attemting to change max resists"));
			}
			int num2 = (AtOManager.Instance.TeamHavePerk(Plugin.perkBase + "resistance5d") ? 97 : 95);
			__result = Mathf.Clamp(num, -95, num2);
			return false;
		}
	}
	[BepInPlugin("com.binbinAndLeif.PerkManager", "Custom Perks", "0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("AcrossTheObelisk.exe")]
	public class Plugin : BaseUnityPlugin
	{
		internal const int ModDate = 20250220;

		private readonly Harmony harmony = new Harmony("com.binbinAndLeif.PerkManager");

		internal static ManualLogSource Log;

		public static string debugBase = "Leif - Testing Perks - ";

		public static string perkBase = "binbin_mainperk_";

		public static string reworkPerkDesc = "A mini rework for applicable characters";

		public static string multiclassPerkDesc = "A multiclass option for applicable characters";

		public static ConfigEntry<bool> EnableDebugging { 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
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogInfo((object)"com.binbinAndLeif.PerkManager 0.1 has loaded!");
			EnableDebugging = ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("TooManyPerks", "Enable Debugging"), false, new ConfigDescription("Enables debugging logs.", (AcceptableValueBase)null, Array.Empty<object>()));
			string text = "custom_binbin_mainperk_";
			Essentials.RegisterMod("Custom Perks", "Leif (and binbin)", "Hero Customization", "0.1", 20250220, "https://github.com/binbinmods/AtO-Perk-Manager", (string[])null, "Hero Customization", 100, new string[4] { "content", "perk", "perkNode", "trait" }, "", true);
			Essentials.medsTexts[text + "rework0"] = reworkPerkDesc;
			Essentials.medsTexts[text + "multiclass0"] = multiclassPerkDesc;
			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));
		}
	}
	[HarmonyPatch]
	internal class Traits
	{
		public static string[] simpleTraitList = new string[9] { "trait0", "trait1a", "trait1b", "trait2a", "trait2b", "trait3a", "trait3b", "trait4a", "trait4b" };

		public static string[] myTraitList = new string[4] { "breenaturepaladininnate", "thulsreworkinnate", "reworkedvamprism", "laiareworkinnate" };

		public static bool isDamagePreviewActive = false;

		public static bool isCalculateDamageActive = false;

		public static bool infiniteProctectionThorns = false;

		public static bool infiniteProctectionVitality = false;

		public static int posiblytemporaryflatnumberofthornstodo = 0;

		public static Character yougotthorns;

		public static string debugBase = "Leif - Testing Traits - ";

		public static void DoCustomTrait(string _trait, ref Trait __instance, ref EventActivation _theEvent, ref Character _character, ref Character _target, ref int _auxInt, ref string _auxString, ref CardData _castedCard)
		{
			//IL_031e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0325: Expected O, but got Unknown
			TraitData traitData = Globals.Instance.GetTraitData(_trait);
			List<CardData> list = new List<CardData>();
			List<string> heroHand = MatchManager.Instance.GetHeroHand(_character.HeroIndex);
			Hero[] teamHero = MatchManager.Instance.GetTeamHero();
			NPC[] teamNPC = MatchManager.Instance.GetTeamNPC();
			if (!CustomFunctions.IsLivingHero(_character))
			{
				return;
			}
			switch (_trait)
			{
			case "breenaturepaladininnate":
			{
				string traitName2 = traitData.TraitName;
				if (_auxString == "thorns" && !infiniteProctectionThorns)
				{
					infiniteProctectionVitality = true;
				}
				if (_auxString == "vitality" && !infiniteProctectionVitality)
				{
					infiniteProctectionThorns = true;
				}
				if (CustomFunctions.CanIncrementTraitActivations(_trait) && _auxString == "thorns" && CustomFunctions.IsLivingHero(_target) && CustomFunctions.IsLivingHero(_character) && !infiniteProctectionThorns)
				{
					Plugin.LogDebug("Handling Trait " + _trait + ": " + traitName2);
					_target.SetAuraTrait(_character, "vitality", 1);
					if (CustomFunctions.IfCharacterHas(_character, CustomFunctions.CharacterHas.Item, "heartofthorns") || CustomFunctions.IfCharacterHas(_character, CustomFunctions.CharacterHas.Item, "heartofthornsrare"))
					{
						posiblytemporaryflatnumberofthornstodo++;
						if (posiblytemporaryflatnumberofthornstodo > 3)
						{
							infiniteProctectionThorns = true;
						}
						if (yougotthorns != null && _target == yougotthorns)
						{
							infiniteProctectionThorns = true;
						}
						yougotthorns = _target;
					}
				}
				if (CustomFunctions.CanIncrementTraitActivations(_trait) && _auxString == "vitality" && CustomFunctions.IsLivingHero(_target) && CustomFunctions.IsLivingHero(_character) && !infiniteProctectionVitality)
				{
					Plugin.LogDebug("Handling Trait " + _trait + ": " + traitName2);
					_target.SetAuraTrait(_character, "thorns", 1);
				}
				break;
			}
			case "thulsreworkinnate":
			{
				string traitName3 = traitData.TraitName;
				break;
			}
			case "reworkedvampirism":
			{
				string traitName4 = traitData.TraitName;
				break;
			}
			case "laiareworkinnate":
			{
				string traitName = traitData.TraitName;
				if (!(_auxString == "block") || !CustomFunctions.IsLivingHero(_target) || !CustomFunctions.IsLivingHero(_character))
				{
					break;
				}
				int num = _target.HealReceivedFinal(Functions.FuncRoundToInt((float)_auxInt * 0.25f), false, (CardData)null);
				int num2 = num;
				if (_target.GetHpLeftForMax() < num2)
				{
					num2 = _target.GetHpLeftForMax();
				}
				if (num2 > 0)
				{
					_target.ModifyHp(num2, false, true, _character);
					CastResolutionForCombatText val = new CastResolutionForCombatText();
					val.heal = num2;
					if ((Object)(object)_target.HeroItem != (Object)null)
					{
						((CharacterItem)_target.HeroItem).ScrollCombatTextDamageNew(val);
						EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)_target.HeroItem).CharImageT, false, 0f, false);
					}
					else
					{
						((CharacterItem)_target.NPCItem).ScrollCombatTextDamageNew(val);
						EffectsManager.Instance.PlayEffectAC("healimpactsmall", true, ((CharacterItem)_target.NPCItem).CharImageT, false, 0f, false);
					}
					_target.SetEvent((EventActivation)15, (Character)null, 0, "", (Character)null);
					_character.SetEvent((EventActivation)14, _target, 0, "", (Character)null);
					((CharacterItem)_character.HeroItem).ScrollCombatText(Texts.Instance.GetText("traits_" + traitName, ""), (CombatScrollEffectType)7);
				}
				break;
			}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(Trait), "DoTrait")]
		public static bool DoTrait(EventActivation _theEvent, string _trait, Character _character, Character _target, int _auxInt, string _auxString, CardData _castedCard, ref Trait __instance)
		{
			if ((Object)(object)MatchManager.Instance == (Object)null)
			{
				return false;
			}
			if (Content.medsCustomTraitsSource.Contains(_trait) && myTraitList.Contains(_trait))
			{
				DoCustomTrait(_trait, ref __instance, ref _theEvent, ref _character, ref _target, ref _auxInt, ref _auxString, ref _castedCard);
				return false;
			}
			return true;
		}
	}
	public class PerkUnused
	{
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "com.binbinAndLeif.PerkManager";

		public const string PLUGIN_NAME = "Custom Perks";

		public const string PLUGIN_VERSION = "0.1";
	}
}