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 cardsWithCustomDescriptions = new List(2) { "manachargedboots", "soulcollectinglantern" }; public static List cardsToAppendDescription = new List(); public static List cardsToPrependDescription = new List(4) { "thulsreworkinnate", "breenaturepaladininnnate", "reworkedvamprism", "laiareworkinnate" }; public static string NumFormatItem(int num, bool plus = false, bool percent = false) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(" "); if (num > 0) { stringBuilder.Append(""); if (plus) { stringBuilder.Append("+"); } } else { stringBuilder.Append(""); if (plus) { stringBuilder.Append("-"); } } stringBuilder.Append(Mathf.Abs(num)); if (percent) { stringBuilder.Append("%"); } stringBuilder.Append(""); return stringBuilder.ToString(); } public static void BinbinNormalizeDescription(ref CardData __instance, StringBuilder stringBuilder) { stringBuilder.Replace("", ""); stringBuilder.Replace("", ""); stringBuilder.Replace("", ""); stringBuilder.Replace("", ""); stringBuilder.Replace("", "

"); stringBuilder.Replace("", "

"); stringBuilder.Replace("", "

"); string input = stringBuilder.ToString(); input = Regex.Replace(input, "[,][ ]*(<(.*?)>)*(.)", (Match m) => m.ToString().ToLower()); input = Regex.Replace(input, "
\\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(""); break; case "piercing": stringBuilder.Append(""); break; case "bleed": stringBuilder.Append(""); break; case "bless": stringBuilder.Append(""); break; default: stringBuilder.Append(""); break; } stringBuilder.Append(" "); stringBuilder.Append(""); switch (text) { case "bleed": stringBuilder.Append(""); break; case "card": stringBuilder.Append(""); break; case "powerful": case "fury": stringBuilder.Append(""); break; default: stringBuilder.Append(""); break; case "reinforce": case "fire": break; } return stringBuilder.ToString(); } public static string ColorTextArray(string type, params string[] text) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(""); if (type == null || type.Length != 0) { switch (type) { case "damage": stringBuilder.Append(""); break; case "heal": stringBuilder.Append(""); break; case "aura": stringBuilder.Append(""); break; case "curse": stringBuilder.Append(""); break; case "system": stringBuilder.Append(""); break; default: stringBuilder.Append(""); break; } } int num = 0; foreach (string value in text) { if (num > 0) { stringBuilder.Append(" "); } stringBuilder.Append(value); num++; } if (type != "") { stringBuilder.Append(""); } stringBuilder.Append(" "); 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 heroHand, ref List 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 "
" + num + "/" + num2 + ""; } 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 list = new List(); List 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 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 list = new List(); List 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 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 list = new List(); 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 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(); 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().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().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(); 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 = ""; } } } [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; [HarmonyPrefix] [HarmonyPatch(typeof(AtOManager), "BeginAdventure")] public static void BeginAdventurePrefix(ref AtOManager __instance) { Hero[] value = Traverse.Create((object)__instance).Field("teamAtO").GetValue(); 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(); 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(); foreach (Hero hero in value) { HandleReloadofMulticlassPerks(hero); } } 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(); } } } public static void HandleMulticlassPerks(Hero _hero) { string text = ""; string id = ((Character)_hero).HeroData.HeroSubClass.Id; 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 subClassData2 = Globals.Instance.GetSubClassData(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(); ((Character)_hero).HeroData.HeroSubClass.Id = subClassData2.Id; ((Character)_hero).HeroData.HeroSubClass.SubClassName = subClassData2.SubClassName; } } public static void HandleReloadofMulticlassPerks(Hero _hero) { if (((Character)_hero).SubclassName == "naturepaladin") { ((Character)_hero).HeroData.HeroSubClass.Id = "warden"; } if (((Character)_hero).SubclassName == "seer") { ((Character)_hero).HeroData.HeroSubClass.Id = "prophet"; } if (((Character)_hero).SubclassName == "tracker") { ((Character)_hero).HeroData.HeroSubClass.Id = "ranger"; } 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 HandleSaveforMulticlassPerks(Hero _hero) { if (CustomFunctions.CharacterObjectHavePerk((Character)(object)_hero, "multiclass0")) { if (((Character)_hero).SubclassName == "warden") { ((Character)_hero).HeroData.HeroSubClass.Id = "naturepaladin"; } if (((Character)_hero).SubclassName == "prophet") { ((Character)_hero).HeroData.HeroSubClass.Id = "seer"; } if (((Character)_hero).SubclassName == "ranger") { ((Character)_hero).HeroData.HeroSubClass.Id = "tracker"; } } } 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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 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(new ConfigDefinition("HeroCustomization", "Enable Debugging"), false, new ConfigDescription("Enables debugging logs.", (AcceptableValueBase)null, Array.Empty())); string text = "custom_binbin_mainperk_"; Essentials.RegisterMod("Custom Perks", "Leif (binbin was very helpful)", "Hero Customization", "0.1", 20250220, "https://drive.google.com/file/d/1FWT_SUqpFH-S1d6QY8ONNiDKwpOcMA7J/view?usp=sharing", (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 list = new List(); List 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"; } }