Decompiled source of API v2.22.2
monomod/Assembly-CSharp.APIPatcher.mm.dll
Decompiled 6 days agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx.Logging; using InscryptionAPI; using Microsoft.CodeAnalysis; using MonoMod; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("APIPatcher")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+186cd592a3143da46b84b4f0937a00aa17c6fd3b")] [assembly: AssemblyProduct("APIPatcher")] [assembly: AssemblyTitle("APIPatcher")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace APIPatcher { [MonoModPatch("global::ScriptableObjectLoader`1")] internal class patch_ScriptableObjectLoader<T> : ScriptableObjectLoader<T> where T : Object { public static List<T> AllData { get { InscryptionAPIPlugin.InvokeSOLEvent(typeof(T)); ScriptableObjectLoader<T>.LoadData(""); return ScriptableObjectLoader<T>.allData; } } } [MonoModPatch("global::Singleton`1")] internal class patch_Singleton<T> : Singleton<T> where T : ManagedBehaviour { protected static void FindInstance() { if ((Object)(object)Singleton<T>.m_Instance == (Object)null) { T val = Object.FindObjectOfType<T>(); if ((Object)(object)val == (Object)null) { Singleton.SingletonLogSource.LogWarning((object)("Got null in Singleton<" + typeof(T).FullName + ">.FindInstance")); } Singleton<T>.m_Instance = val; } } } internal static class Singleton { internal static readonly ManualLogSource SingletonLogSource = Logger.CreateLogSource("Singleton"); } }
plugins/InscryptionAPI.dll
Decompiled 6 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using DiskCardGame; using GBC; using HarmonyLib; using InscryptionAPI; using InscryptionAPI.Boons; using InscryptionAPI.Card; using InscryptionAPI.Card.CostProperties; using InscryptionAPI.CardCosts; using InscryptionAPI.Dialogue; using InscryptionAPI.Encounters; using InscryptionAPI.Guid; using InscryptionAPI.Helpers; using InscryptionAPI.Helpers.Extensions; using InscryptionAPI.Items; using InscryptionAPI.Items.Extensions; using InscryptionAPI.Masks; using InscryptionAPI.Nodes; using InscryptionAPI.Pelts; using InscryptionAPI.PixelCard; using InscryptionAPI.Regions; using InscryptionAPI.RuleBook; using InscryptionAPI.Saves; using InscryptionAPI.Slots; using InscryptionAPI.Sound; using InscryptionAPI.TalkingCards.Animation; using InscryptionAPI.TalkingCards.Create; using InscryptionAPI.TalkingCards.Helpers; using InscryptionAPI.Totems; using InscryptionAPI.Triggers; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.Utils; using Pixelplacement; using Sirenix.Serialization.Utilities; using Sirenix.Utilities; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.SceneManagement; using VolumetricFogAndMist; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("Assembly-CSharp")] [assembly: InternalsVisibleTo("Assembly-CSharp.APIPatcher.mm")] [assembly: InternalsVisibleTo("APIPatcher")] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("InscryptionAPI")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.22.2.0")] [assembly: AssemblyInformationalVersion("2.22.2+186cd592a3143da46b84b4f0937a00aa17c6fd3b")] [assembly: AssemblyProduct("InscryptionAPI")] [assembly: AssemblyTitle("InscryptionAPI")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.22.2.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] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsUnmanagedAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace APIPlugin { [Obsolete("Use AbilityManager instead", true)] public class AbilityIdentifier { internal string guid; private string name; public Ability id; internal Ability realID; private AbilityIdentifier(string guid, string name) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) this.guid = guid; this.name = name; realID = (id = GuidManager.GetEnumValue<Ability>(guid, name)); } public static AbilityIdentifier GetAbilityIdentifier(string guid, string name) { return GetID(guid, name); } public static AbilityIdentifier GetID(string guid, string name) { return new AbilityIdentifier(guid, name); } public override string ToString() { return guid + "(" + name + ")"; } } [Obsolete("Use AbilityManager and extension methods instead", true)] public class AbilityInfoUtils { public static AbilityInfo CreateInfoWithDefaultSettings(string rulebookName, string rulebookDescription) { AbilityInfo obj = ScriptableObject.CreateInstance<AbilityInfo>(); obj.powerLevel = 0; obj.rulebookName = rulebookName; obj.rulebookDescription = rulebookDescription; obj.metaCategories = new List<AbilityMetaCategory> { (AbilityMetaCategory)1, (AbilityMetaCategory)0 }; return obj; } } [Obsolete("Use CardManager and extension methods instead", true)] public static class CardUtils { public static readonly Vector2 DefaultVector2 = new Vector2(0.5f, 0.5f); public static readonly Rect DefaultCardArtRect = new Rect(0f, 0f, 114f, 94f); public static readonly Rect DefaultCardPixelArtRect = new Rect(0f, 0f, 41f, 28f); public static Predicate<CardInfo> IsNonLivingCard = (CardInfo card) => card.traits.Exists((Trait t) => t - 12 <= 1); public static List<CardMetaCategory> getNormalCardMetadata = new List<CardMetaCategory> { (CardMetaCategory)0, (CardMetaCategory)1 }; public static List<CardMetaCategory> getRareCardMetadata = new List<CardMetaCategory> { (CardMetaCategory)0, (CardMetaCategory)1, (CardMetaCategory)3 }; public static List<CardMetaCategory> getGBCCardMetadata = new List<CardMetaCategory> { (CardMetaCategory)4, (CardMetaCategory)5 }; public static List<CardMetaCategory> getGBCRareCardMetadata = new List<CardMetaCategory> { (CardMetaCategory)4, (CardMetaCategory)5, (CardMetaCategory)3 }; public static List<CardMetaCategory> getAllActsCardMetadata = new List<CardMetaCategory> { (CardMetaCategory)0, (CardMetaCategory)3, (CardMetaCategory)1, (CardMetaCategory)3, (CardMetaCategory)4, (CardMetaCategory)5, (CardMetaCategory)2 }; public static List<Appearance> getRareAppearance = new List<Appearance> { (Appearance)7 }; public static List<Appearance> getTerrainBackgroundAppearance = new List<Appearance> { (Appearance)2 }; public static List<Appearance> getTerrainLayoutAppearance = new List<Appearance> { (Appearance)9 }; public static List<Appearance> getTerrainAppearance = new List<Appearance> { (Appearance)2, (Appearance)9 }; public static List<Appearance> getHologramAppearance = new List<Appearance> { (Appearance)12 }; public static List<Appearance> getAnimatedAppearance = new List<Appearance> { (Appearance)5 }; public static List<Appearance> getGoldAppearance = new List<Appearance> { (Appearance)6 }; public static List<Appearance> getBloodDecalAppearance = new List<Appearance> { (Appearance)8 }; public static List<Appearance> getDynamicAppearance = new List<Appearance> { (Appearance)10 }; public static byte[] ReadArtworkFileAsBytes(string nameOfCardArt) { return File.ReadAllBytes(Directory.GetFiles(Paths.PluginPath, nameOfCardArt, SearchOption.AllDirectories)[0]); } public static Texture2D getAndloadImageAsTexture(string pathCardArt) { return TextureHelper.GetImageAsTexture(pathCardArt, (FilterMode)0); } } [Obsolete("Use CardManager instead", true)] public class CustomCard { public static List<CustomCard> cards = new List<CustomCard>(); public static Dictionary<int, List<AbilityIdentifier>> abilityIds = new Dictionary<int, List<AbilityIdentifier>>(); public static Dictionary<int, List<SpecialAbilityIdentifier>> specialAbilityIds = new Dictionary<int, List<SpecialAbilityIdentifier>>(); public static Dictionary<int, EvolveIdentifier> evolveIds = new Dictionary<int, EvolveIdentifier>(); public static Dictionary<int, IceCubeIdentifier> iceCubeIds = new Dictionary<int, IceCubeIdentifier>(); public static Dictionary<int, TailIdentifier> tailIds = new Dictionary<int, TailIdentifier>(); public static Dictionary<string, Sprite> emissions = new Dictionary<string, Sprite>(); public string name; public List<CardMetaCategory> metaCategories; public CardComplexity? cardComplexity; public CardTemple? temple; public string displayedName; public int? baseAttack; public int? baseHealth; public string description; public bool? hideAttackAndHealth; public int? cost; public int? bonesCost; public int? energyCost; public List<GemType> gemsCost; public SpecialStatIcon? specialStatIcon; public List<Tribe> tribes; public List<Trait> traits; public List<SpecialTriggeredAbility> specialAbilities; public List<Ability> abilities; public EvolveParams evolveParams; public string defaultEvolutionName; public TailParams tailParams; public IceCubeParams iceCubeParams; public bool? flipPortraitForStrafe; public bool? onePerDeck; public List<Appearance> appearanceBehaviour; [IgnoreMapping] public Texture2D tex; [IgnoreMapping] public Texture2D altTex; public Texture titleGraphic; [IgnoreMapping] public Texture2D pixelTex; [IgnoreMapping] public Texture2D emissionTex; public GameObject animatedPortrait; public List<Texture> decals; [IgnoreMapping] private List<AbilityIdentifier> abilityIdParam; [IgnoreMapping] private List<SpecialAbilityIdentifier> specialAbilityIdParam; [IgnoreMapping] private EvolveIdentifier evolveId; [IgnoreMapping] private IceCubeIdentifier iceCubeId; [IgnoreMapping] private TailIdentifier tailId; public CustomCard(string name, List<AbilityIdentifier> abilityIdParam = null, List<SpecialAbilityIdentifier> specialAbilityIdParam = null, EvolveIdentifier evolveId = null, IceCubeIdentifier iceCubeId = null, TailIdentifier tailId = null) { this.name = name; this.abilityIdParam = abilityIdParam; this.specialAbilityIdParam = specialAbilityIdParam; this.evolveId = evolveId; this.iceCubeId = iceCubeId; this.tailId = tailId; CardManager.ModifyCardList += delegate(List<CardInfo> cards) { CardInfo val = cards.CardByName(this.name); if ((Object)(object)val != (Object)null) { AdjustCard(val, cards); } return cards; }; } public CardInfo AdjustCard(CardInfo card, List<CardInfo> cardsToSearch) { TypeMapper<CustomCard, CardInfo>.Convert(this, card); if (tex != null) { card.SetPortrait(tex); } if (altTex != null) { card.SetAltPortrait(altTex); } if (pixelTex != null) { card.SetPixelPortrait(pixelTex); } if (decals != null) { card.AddDecal(decals.ToArray()); } if (abilityIdParam != null) { card.AddAbilities(abilityIdParam.Select((AbilityIdentifier ai) => ai.realID).ToArray()); } if (specialAbilityIdParam != null) { card.AssignSpecialAbilities(specialAbilityIdParam); } if (evolveId != null) { CardInfo val = cardsToSearch.CardByName(evolveId.name); if ((Object)(object)val != (Object)null) { card.SetEvolve(val, evolveId.turnsToEvolve, new List<CardModificationInfo> { evolveId.mods }); } } if (tailId != null) { CardInfo val2 = cardsToSearch.CardByName(tailId.name); if ((Object)(object)val2 != (Object)null) { Texture2D tailLostTex = tailId.tailLostTex; IEnumerable<CardModificationInfo> mods = new List<CardModificationInfo> { tailId.mods }; card.SetTail(val2, tailLostTex, null, mods); } } if (iceCubeId != null) { CardInfo val3 = cardsToSearch.CardByName(iceCubeId.name); if ((Object)(object)val3 != (Object)null) { card.SetIceCube(val3, new List<CardModificationInfo> { iceCubeId.mods }); } } return card; } } [Obsolete("Use RegionManager instead", true)] public class CustomRegion { public string name; public int? tier; public List<CardInfo> terrainCards; public List<ConsumableItemData> consumableItems; public List<EncounterBlueprintData> encounters; public List<Type> bosses; public List<CardInfo> likelyCards; public List<Tribe> dominantTribes; public PredefinedNodes predefinedNodes; public EncounterBlueprintData bossPrepEncounter; public StoryEventCondition bossPrepCondition; public List<ScarceSceneryEntry> scarceScenery; public List<FillerSceneryEntry> fillerScenery; public PredefinedScenery predefinedScenery; public string ambientLoopId; public bool? silenceCabinAmbience; public Color? boardLightColor; public Color? cardsLightColor; public bool? dustParticlesDisabled; public bool? fogEnabled; public VolumetricFogProfile fogProfile; public float? fogAlpha; public Texture mapAlbedo; public Texture mapEmission; public Color? mapEmissionColor; public List<GameObject> mapParticlesPrefabs; public CustomRegion(string name) { this.name = name; RegionManager.ModifyRegionsList += ModifyRegions; } public List<RegionData> ModifyRegions(List<RegionData> regions) { RegionData val = ((IEnumerable<RegionData>)regions).FirstOrDefault((Func<RegionData, bool>)((RegionData r) => ((Object)r).name.Equals(name))); if ((Object)(object)val != (Object)null) { AdjustRegion(val); } return regions; } public RegionData AdjustRegion(RegionData region) { TypeMapper<CustomRegion, RegionData>.Convert(this, region); return region; } } [Obsolete("Use CardManager and CardInfo extension methods instead", true)] public class EvolveIdentifier { internal string name; internal int turnsToEvolve; internal CardModificationInfo mods; private EvolveParams evolution; public EvolveParams Evolution { get { if (evolution == null) { SetParams(CardLoader.GetCardByName(name)); } return evolution; } } public EvolveIdentifier(string name, int turnsToEvolve, CardModificationInfo mods = null) { this.name = name; this.turnsToEvolve = turnsToEvolve; this.mods = mods; } private void SetParams(CardInfo card) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown evolution = new EvolveParams(); evolution.turnsToEvolve = turnsToEvolve; evolution.evolution = card; if (mods != null) { evolution.evolution.mods.Add(mods); } } public override string ToString() { return name; } } [Obsolete("Use CardManager and CardInfo extension methods instead", true)] public class IceCubeIdentifier { internal string name; internal CardModificationInfo mods; private IceCubeParams iceCube; public IceCubeParams IceCube { get { if (iceCube == null) { SetParams(CardLoader.GetCardByName(name)); } return iceCube; } } public IceCubeIdentifier(string name, CardModificationInfo mods = null) { this.name = name; this.mods = mods; } private void SetParams(CardInfo card) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown iceCube = new IceCubeParams(); iceCube.creatureWithin = card; if (mods != null) { iceCube.creatureWithin.mods.Add(mods); } } public override string ToString() { return name; } } [Obsolete("Use AbilityManager instead", true)] public class NewAbility { public Ability ability; public AbilityInfo info; public Type abilityBehaviour; public Texture tex; public AbilityIdentifier id; public NewAbility(AbilityInfo info, Type abilityBehaviour, Texture tex, AbilityIdentifier id = null) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) string guid = ((id == null) ? abilityBehaviour.Namespace : id.guid); AbilityManager.FullAbility fullAbility = AbilityManager.Add(guid, info, abilityBehaviour, tex); ability = fullAbility.Id; this.info = fullAbility.Info; this.abilityBehaviour = fullAbility.AbilityBehavior; this.tex = fullAbility.Texture; this.id = AbilityIdentifier.GetID(guid, fullAbility.Info.rulebookName); } } [Obsolete("Use CardManager instead", true)] public static class NewCard { public static List<CardInfo> cards = new List<CardInfo>(); public static Dictionary<int, List<AbilityIdentifier>> abilityIds = new Dictionary<int, List<AbilityIdentifier>>(); public static Dictionary<int, List<SpecialAbilityIdentifier>> specialAbilityIds = new Dictionary<int, List<SpecialAbilityIdentifier>>(); public static Dictionary<int, EvolveIdentifier> evolveIds = new Dictionary<int, EvolveIdentifier>(); public static Dictionary<int, IceCubeIdentifier> iceCubeIds = new Dictionary<int, IceCubeIdentifier>(); public static Dictionary<int, TailIdentifier> tailIds = new Dictionary<int, TailIdentifier>(); public static Dictionary<string, Sprite> emissions = new Dictionary<string, Sprite>(); public static void Add(CardInfo card, List<AbilityIdentifier> abilityIdsParam = null, List<SpecialAbilityIdentifier> specialAbilitiesIdsParam = null, EvolveIdentifier evolveId = null, IceCubeIdentifier iceCubeId = null, TailIdentifier tailId = null) { if (abilityIdsParam != null) { card.AddAbilities(abilityIdsParam.Select((AbilityIdentifier a) => a.realID).ToArray()); } if (specialAbilitiesIdsParam != null) { card.AssignSpecialAbilities(specialAbilitiesIdsParam); } if (evolveId != null) { card.evolveParams = evolveId.Evolution; } if (iceCubeId != null) { card.iceCubeParams = iceCubeId.IceCube; } if (tailId != null) { card.tailParams = tailId.Tail; } CardManager.Add(card); } public static void Add(string name, string displayedName, int baseAttack, int baseHealth, List<CardMetaCategory> metaCategories, CardComplexity cardComplexity, CardTemple temple, string description = null, bool hideAttackAndHealth = false, int bloodCost = 0, int bonesCost = 0, int energyCost = 0, List<GemType> gemsCost = null, SpecialStatIcon specialStatIcon = 0, List<Tribe> tribes = null, List<Trait> traits = null, List<SpecialTriggeredAbility> specialAbilities = null, List<Ability> abilities = null, List<AbilityIdentifier> abilityIdsParam = null, List<SpecialAbilityIdentifier> specialAbilitiesIdsParam = null, EvolveParams evolveParams = null, string defaultEvolutionName = null, TailParams tailParams = null, IceCubeParams iceCubeParams = null, bool flipPortraitForStrafe = false, bool onePerDeck = false, List<Appearance> appearanceBehaviour = null, Texture2D defaultTex = null, Texture2D altTex = null, Texture titleGraphic = null, Texture2D pixelTex = null, Texture2D emissionTex = null, GameObject animatedPortrait = null, List<Texture> decals = null, EvolveIdentifier evolveId = null, IceCubeIdentifier iceCubeId = null, TailIdentifier tailId = null) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) CardInfo val = ScriptableObject.CreateInstance<CardInfo>(); val.SetOldApiCard(); ((Object)val).name = name; val.displayedName = displayedName; val.baseAttack = baseAttack; val.baseHealth = baseHealth; val.description = description; val.SetCost(bloodCost, bonesCost, energyCost, gemsCost); val.hideAttackAndHealth = hideAttackAndHealth; val.cardComplexity = cardComplexity; val.temple = temple; val.AddMetaCategories(metaCategories.ToArray()); val.specialStatIcon = specialStatIcon; if (tribes != null) { val.AddTribes(tribes.ToArray()); } if (traits != null) { val.AddTraits(traits.ToArray()); } if (specialAbilities != null) { val.AddSpecialAbilities(specialAbilities.ToArray()); } if (specialAbilitiesIdsParam != null) { val.AssignSpecialAbilities(specialAbilitiesIdsParam); } if (abilities != null) { val.AddAbilities(abilities.ToArray()); } if (abilityIdsParam != null) { val.AddAbilities(abilityIdsParam.Select((AbilityIdentifier a) => a.realID).ToArray()); } val.evolveParams = evolveParams; val.tailParams = tailParams; val.iceCubeParams = iceCubeParams; val.defaultEvolutionName = defaultEvolutionName; val.flipPortraitForStrafe = flipPortraitForStrafe; val.onePerDeck = onePerDeck; if (appearanceBehaviour != null) { val.AddAppearances(appearanceBehaviour.ToArray()); } if ((Object)(object)defaultTex != (Object)null) { val.SetPortrait(defaultTex); } if ((Object)(object)altTex != (Object)null) { val.SetAltPortrait(altTex); } val.titleGraphic = titleGraphic; if ((Object)(object)pixelTex != (Object)null) { val.SetPixelPortrait(pixelTex); } if ((Object)(object)emissionTex != (Object)null) { val.SetEmissivePortrait(emissionTex); } val.animatedPortrait = animatedPortrait; if (decals != null) { val.decals = new List<Texture>(decals); } if (evolveId != null) { val.SetEvolve(evolveId.name, evolveId.turnsToEvolve, new List<CardModificationInfo> { evolveId.mods }); } if (iceCubeId != null) { val.SetIceCube(iceCubeId.name, new List<CardModificationInfo> { iceCubeId.mods }); } if (tailId != null) { string name2 = tailId.name; Texture2D tailLostTex = tailId.tailLostTex; IEnumerable<CardModificationInfo> mods = new List<CardModificationInfo> { tailId.mods }; val.SetTail(name2, tailLostTex, null, mods); } CardManager.Add(val); } internal static void AssignSpecialAbilities(this CardInfo info, IEnumerable<SpecialAbilityIdentifier> ids) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) info.AddSpecialAbilities((from a in ids where !a.ForStatIcon select a.specialTriggerID).ToArray()); SpecialAbilityIdentifier specialAbilityIdentifier = ids.FirstOrDefault((SpecialAbilityIdentifier a) => a.ForStatIcon); if (specialAbilityIdentifier != null) { info.specialStatIcon = specialAbilityIdentifier.statIconID; } } } [Obsolete("Use CardAppearanceBehaviourManager instead", true)] public class NewCardAppearanceBehaviour { public static Dictionary<Appearance, NewCardAppearanceBehaviour> behaviours = new Dictionary<Appearance, NewCardAppearanceBehaviour>(); public static List<NewCardAppearanceBehaviour> allBehaviours = new List<NewCardAppearanceBehaviour>(); public Appearance Appearance; public string Name; public Type Behaviour; public static NewCardAppearanceBehaviour AddNewBackground(Type type, string name) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) CardAppearanceBehaviourManager.FullCardAppearanceBehaviour fullCardAppearanceBehaviour = CardAppearanceBehaviourManager.Add(type.Namespace, name, type); return new NewCardAppearanceBehaviour { Appearance = fullCardAppearanceBehaviour.Id, Name = name, Behaviour = type }; } } [Obsolete("Use EncounterManager instead", true)] public class NewEncounter { public static List<NewEncounter> encounters = new List<NewEncounter>(); public string name; public string regionName; public bool regular; public bool bossPrep; public EncounterBlueprintData encounterBlueprintData; private List<RegionData> SyncRegion(List<RegionData> region) { EncounterBlueprintData curClone = ((IEnumerable<EncounterBlueprintData>)EncounterManager.AllEncountersCopy).FirstOrDefault((Func<EncounterBlueprintData, bool>)((EncounterBlueprintData e) => ((Object)e).name.Equals(((Object)encounterBlueprintData).name))); if ((Object)(object)curClone == (Object)null) { InscryptionAPIPlugin.Logger.LogDebug((object)("Could not attach encounter named " + ((Object)encounterBlueprintData).name)); return region; } if (curClone.regionSpecific) { if (!string.IsNullOrEmpty(regionName)) { RegionData val = ((IEnumerable<RegionData>)region).FirstOrDefault((Func<RegionData, bool>)((RegionData r) => ((Object)r).name.Equals(regionName))); if ((Object)(object)val != (Object)null) { if (!bossPrep && !val.encounters.Any((EncounterBlueprintData e) => ((Object)e).name.Equals(((Object)curClone).name))) { InscryptionAPIPlugin.Logger.LogDebug((object)("Attaching encounter named " + ((Object)encounterBlueprintData).name + " to region " + ((Object)val).name)); val.encounters.Add(curClone); } if (bossPrep) { val.bossPrepEncounter = curClone; } } } } else { foreach (RegionData item in region) { if (!item.encounters.Any((EncounterBlueprintData e) => ((Object)e).name.Equals(((Object)curClone).name))) { InscryptionAPIPlugin.Logger.LogDebug((object)("Attaching encounter named " + ((Object)encounterBlueprintData).name + " to region " + ((Object)item).name)); item.encounters.Add(curClone); } } } return region; } public NewEncounter(string name, EncounterBlueprintData encounterBlueprintData, string regionName, bool regular, bool bossPrep) { this.name = name; this.encounterBlueprintData = encounterBlueprintData; ((Object)this.encounterBlueprintData).name = name; this.regionName = regionName; this.bossPrep = bossPrep; this.regular = regular; EncounterManager.Add(encounterBlueprintData); RegionManager.ModifyRegionsList += SyncRegion; RegionManager.SyncRegionList(); } public static void Add(string name, string regionName, List<TurnModBlueprint> turnMods = null, List<Tribe> dominantTribes = null, List<Ability> redundantAbilities = null, List<CardInfo> unlockedCardPrerequisites = null, bool regionSpecific = true, int minDifficulty = 0, int maxDifficulty = 30, List<CardInfo> randomReplacementCards = null, List<List<CardBlueprint>> turns = null, bool regular = true, bool bossPrep = false, int oldPreviewDifficulty = 0) { EncounterBlueprintData val = ScriptableObject.CreateInstance<EncounterBlueprintData>(); if (turnMods != null) { val.turnMods = turnMods; } if (dominantTribes != null) { val.dominantTribes = dominantTribes; } if (redundantAbilities != null) { val.redundantAbilities = redundantAbilities; } if (unlockedCardPrerequisites != null) { val.unlockedCardPrerequisites = unlockedCardPrerequisites; } val.regionSpecific = regionSpecific; val.minDifficulty = minDifficulty; val.maxDifficulty = maxDifficulty; if (randomReplacementCards != null) { val.randomReplacementCards = randomReplacementCards; } if (turns != null) { val.turns = turns; } val.oldPreviewDifficulty = oldPreviewDifficulty; new NewEncounter(name, val, regionName, regular, bossPrep); } } [Obsolete("Use RegionManager instead", true)] public class NewRegion { public NewRegion(RegionData region, int tier) { RegionManager.Add(region, tier); } } [Obsolete("Use SpecialTriggeredAbilityManager instead", true)] public class NewSpecialAbility { public static List<NewSpecialAbility> specialAbilities = new List<NewSpecialAbility>(); public SpecialTriggeredAbility specialTriggeredAbility; public StatIconInfo statIconInfo; public Type abilityBehaviour; public SpecialAbilityIdentifier id; public NewSpecialAbility(Type abilityBehaviour, SpecialAbilityIdentifier id, StatIconInfo statIconInfo = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)statIconInfo == (Object)null) { SpecialTriggeredAbilityManager.FullSpecialTriggeredAbility fullSpecialTriggeredAbility = SpecialTriggeredAbilityManager.Add(id.guid, id.name, abilityBehaviour); specialTriggeredAbility = fullSpecialTriggeredAbility.Id; this.abilityBehaviour = abilityBehaviour; this.id = id; } if ((Object)(object)statIconInfo != (Object)null) { StatIconManager.Add(id.guid, statIconInfo, abilityBehaviour); id.ForStatIcon = true; this.statIconInfo = statIconInfo; this.abilityBehaviour = abilityBehaviour; } } } [Obsolete("Use SpecialTriggeredAbilityManager instead", true)] public class SpecialAbilityIdentifier { internal string guid; internal string name; public SpecialTriggeredAbility id; internal SpecialTriggeredAbility specialTriggerID; internal SpecialStatIcon statIconID; internal bool ForStatIcon; private SpecialAbilityIdentifier(string guid, string name) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) this.guid = guid; this.name = name; specialTriggerID = (id = GuidManager.GetEnumValue<SpecialTriggeredAbility>(guid, name)); statIconID = GuidManager.GetEnumValue<SpecialStatIcon>(guid, name); } public static SpecialAbilityIdentifier GetID(string guid, string name) { return new SpecialAbilityIdentifier(guid, name); } public override string ToString() { return guid + "(" + name + ")"; } } [Obsolete("Use CardManager and CardInfo extension methods", true)] public class TailIdentifier { internal string name; internal CardModificationInfo mods; internal Texture2D tailLostTex; private TailParams tail; public TailParams Tail { get { if (tail == null) { SetParams(CardLoader.GetCardByName(name)); } return tail; } } public TailIdentifier(string name, Texture2D tailLostTex = null, CardModificationInfo mods = null) { this.name = name; this.mods = mods; this.tailLostTex = tailLostTex; } private void SetParams(CardInfo card) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown TailParams val = new TailParams(); if (tailLostTex != null) { ((Object)tailLostTex).name = name; ((Texture)tailLostTex).filterMode = (FilterMode)0; val.tailLostPortrait = tailLostTex.ConvertTexture(TextureHelper.SpriteType.CardPortrait, (FilterMode)0); ((Object)val.tailLostPortrait).name = name; } val.tail = card; if (mods != null) { val.tail.mods.Add(mods); } tail = val; } public override string ToString() { return name; } } [Obsolete("Unncessary", true)] [AttributeUsage(AttributeTargets.Field)] public class IgnoreMappingAttribute : Attribute { } [Obsolete("Unnecessary", true)] public static class TypeMapper<S, D> where S : class where D : class { private static Dictionary<string, MethodInfo> _accessors; private static Dictionary<string, MethodInfo> _setters; private static Dictionary<string, MethodInfo> FieldAccessors { get { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) if (_accessors == null) { _accessors = new Dictionary<string, MethodInfo>(); foreach (FieldInfo item in from x in AccessTools.GetDeclaredFields(typeof(S)) where !x.GetCustomAttributes(typeof(IgnoreMappingAttribute), inherit: false).Any() select x) { DynamicMethodDefinition val = new DynamicMethodDefinition("get_" + item.Name, typeof(object), new Type[1] { typeof(S) }); ILProcessor iLProcessor = val.GetILProcessor(); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldfld, val.Module.ImportReference(item)); if (item.FieldType.IsValueType) { Extensions.Emit(iLProcessor, OpCodes.Box, item.FieldType); } iLProcessor.Emit(OpCodes.Ret); _accessors.Add(item.Name, val.Generate()); } } return _accessors; } } private static Dictionary<string, MethodInfo> FieldSetters { get { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if (_setters == null) { _setters = new Dictionary<string, MethodInfo>(); foreach (FieldInfo declaredField in AccessTools.GetDeclaredFields(typeof(D))) { DynamicMethodDefinition val = new DynamicMethodDefinition("set_" + declaredField.Name, typeof(void), new Type[2] { typeof(D), typeof(object) }); ILProcessor iLProcessor = val.GetILProcessor(); iLProcessor.Emit(OpCodes.Ldarg_0); iLProcessor.Emit(OpCodes.Ldarg_1); iLProcessor.Emit(OpCodes.Unbox_Any, val.Module.ImportReference(declaredField.FieldType)); iLProcessor.Emit(OpCodes.Stfld, val.Module.ImportReference(declaredField)); iLProcessor.Emit(OpCodes.Ret); _setters.Add(declaredField.Name, val.Generate()); } } return _setters; } } public static D Convert(S source, D destination) { foreach (KeyValuePair<string, MethodInfo> fieldAccessor in FieldAccessors) { object obj = fieldAccessor.Value.Invoke(null, new object[1] { source }); if (obj != null && FieldSetters.ContainsKey(fieldAccessor.Key)) { FieldSetters[fieldAccessor.Key].Invoke(null, new object[2] { destination, obj }); } } return destination; } } } namespace InscryptionAPI { [BepInPlugin("cyantist.inscryption.api", "InscryptionAPI", "2.22.2")] [HarmonyPatch] public class InscryptionAPIPlugin : BaseUnityPlugin { public const string ModGUID = "cyantist.inscryption.api"; public const string ModName = "InscryptionAPI"; public const string ModVer = "2.22.2"; public static string Directory; internal static ConfigEntry<bool> configOverrideArrows; internal static ConfigEntry<bool> configRandomChoiceOrder; internal static ConfigEntry<bool> configHideAct1BossScenery; internal static ConfigEntry<TotemManager.TotemTopState> configCustomTotemTopTypes; internal static ConfigEntry<ConsumableItemManager.ConsumableState> configCustomItemTypes; internal static ManualLogSource Logger; private readonly Harmony HarmonyInstance = new Harmony("cyantist.inscryption.api"); public static event Action<Type> ScriptableObjectLoaderLoad; static InscryptionAPIPlugin() { Directory = ""; AppDomain.CurrentDomain.AssemblyResolve += (object _, ResolveEventArgs e) => e.Name.StartsWith("API, Version=1") ? typeof(InscryptionAPIPlugin).Assembly : null; } internal static void InvokeSOLEvent(Type type) { InscryptionAPIPlugin.ScriptableObjectLoaderLoad?.Invoke(type); } private void OnEnable() { Logger = ((BaseUnityPlugin)this).Logger; Directory = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); HarmonyInstance.PatchAll(typeof(InscryptionAPIPlugin).Assembly); } private void OnDisable() { HarmonyInstance.UnpatchSelf(); } internal static void ResyncAll() { CardManager.SyncCardList(); CardCostManager.SyncCustomCostList(); CardModificationInfoManager.SyncCardMods(); AbilityManager.SyncAbilityList(); SlotModificationManager.SyncSlotModificationList(); EncounterManager.SyncEncounterList(); RegionManager.SyncRegionList(); RuleBookManager.SyncRuleBookList(); } internal static void CheckForOutdatedPlugins() { string text = ""; foreach (Assembly item in Chainloader.PluginInfos.Values.Select((PluginInfo p) => ((object)p.Instance).GetType().Assembly).Distinct()) { AssemblyName[] referencedAssemblies = item.GetReferencedAssemblies(); for (int i = 0; i < referencedAssemblies.Length; i++) { if (referencedAssemblies[i].Name.Equals("API")) { text = text + " - " + item.GetName().Name + "\n"; } } } if (text != "") { Logger.LogWarning((object)("The following mods use an outdated version of the API:\n" + text + "\nThese mods may not work correctly. If problems arise, please update or disable them!")); } } private void Awake() { configCustomTotemTopTypes = ((BaseUnityPlugin)this).Config.Bind<TotemManager.TotemTopState>("Totems", "Top Types", TotemManager.TotemTopState.CustomTribes, "If Vanilla, don't change totem tops; if CustomTribes, added custom tribes will use custom totem tops; if AllTribes then all totem tops will use a custom top."); configCustomItemTypes = ((BaseUnityPlugin)this).Config.Bind<ConsumableItemManager.ConsumableState>("Items", "Types", ConsumableItemManager.ConsumableState.Custom, "If Vanilla, only vanilla items will be used; if Custom, added custom items will use custom models; if All then all items will use a custom model."); configOverrideArrows = ((BaseUnityPlugin)this).Config.Bind<bool>("Menus", "Override Arrows", false, "When true, forces the challenge screen arrows to appear at the top of the screen instead of the sides."); configRandomChoiceOrder = ((BaseUnityPlugin)this).Config.Bind<bool>("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); configHideAct1BossScenery = ((BaseUnityPlugin)this).Config.Bind<bool>("Optimization", "Hide Act 1 Scenery", false, "When true bosses will not spawn their scenery. (eg: Prospector's trees) This can improve performance on low-end machines."); } private void Start() { CheckForOutdatedPlugins(); DeathCardManager.AddCustomDeathCards(); CardManager.ActivateEvents(); CardManager.ResolveMissingModPrefixes(); ResyncAll(); CardManager.AuditCardList(); PixelCardManager.Initialise(); PeltManager.CreateDialogueEvents(); DialogueManager.CustomDialogue.Exists((DialogueManager.Dialogue x) => x.DialogueEvent.id == "Hint_NotEnoughSameColourGemsHint"); Logger.LogDebug((object)$"Inserted {DialogueManager.CustomDialogue.Count} dialogue event(s)!"); } [HarmonyPatch(typeof(AscensionMenuScreens), "TransitionToGame")] [HarmonyPrefix] private static void SyncCardsAndAbilitiesWhenTransitioningToAscensionGame() { ResyncAll(); } [HarmonyPatch(typeof(MenuController), "TransitionToGame")] [HarmonyPrefix] private static void SyncCardsAndAbilitiesWhenTransitioningToGame() { ResyncAll(); } } } namespace InscryptionAPI.Triggers { public static class CustomTriggerFinder { public static IEnumerator CustomTriggerSequence(this TriggerReceiver receiver, IEnumerator triggerCoroutine) { GlobalTriggerHandler self = Singleton<GlobalTriggerHandler>.Instance; if ((Object)(object)self != (Object)null) { self.NumTriggersThisBattle += 1; self.StackSize += 1; receiver.Activating = true; yield return triggerCoroutine; self.StackSize -= 1; receiver.Activating = false; if (receiver.DestroyAfterActivation) { receiver.Destroy(); } } } public static IEnumerator TriggerAll<T>(bool triggerFacedown, Func<T, bool> respond, Func<T, IEnumerator> trigger) { IEnumerable<T> enumerable = FindGlobalTriggers<T>(triggerFacedown); foreach (T item in enumerable) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; yield return ((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)).CustomTriggerSequence(trigger(item)); } } _ = triggerFacedown; } public static IEnumerator Trigger<T>(this CardTriggerHandler handler, Func<T, bool> respond, Func<T, IEnumerator> trigger) { IEnumerable<T> enumerable = handler.FindTriggersOnCard<T>(); foreach (T item in enumerable) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; yield return ((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)).CustomTriggerSequence(trigger(item)); } } } public static IEnumerator Trigger<T>(this PlayableCard card, Func<T, bool> respond, Func<T, IEnumerator> trigger) { yield return card.TriggerHandler.Trigger(respond, trigger); } public static IEnumerator TriggerOnBoard<T>(bool triggerFacedown, Func<T, bool> respond, Func<T, IEnumerator> trigger) { IEnumerable<T> enumerable = FindTriggersOnBoard<T>(triggerFacedown); foreach (T item in enumerable) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; yield return ((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)).CustomTriggerSequence(trigger(item)); } } } public static IEnumerator TriggerInHand<T>(Func<T, bool> respond, Func<T, IEnumerator> trigger) { IEnumerable<T> enumerable = FindTriggersInHand<T>(); foreach (T item in enumerable) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; yield return ((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)).CustomTriggerSequence(trigger(item)); } } } public static List<(TriggerReceiver, T2)> CollectDataAll<T, T2>(bool collectFromFacedown, Func<T, bool> respond, Func<T, T2> collect) { List<(TriggerReceiver, T2)> list = new List<(TriggerReceiver, T2)>(); foreach (T item in FindGlobalTriggers<T>(collectFromFacedown)) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add(((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null), collect(item))); } } return list; } public static List<(TriggerReceiver, T2)> CollectDataOnBoard<T, T2>(bool collectFromFacedown, Func<T, bool> respond, Func<T, T2> collect) { List<(TriggerReceiver, T2)> list = new List<(TriggerReceiver, T2)>(); foreach (T item in FindTriggersOnBoard<T>(collectFromFacedown)) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add(((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null), collect(item))); } } return list; } public static List<(TriggerReceiver, T2)> CollectDataInHand<T, T2>(Func<T, bool> respond, Func<T, T2> collect) { List<(TriggerReceiver, T2)> list = new List<(TriggerReceiver, T2)>(); foreach (T item in FindTriggersInHand<T>()) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add(((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null), collect(item))); } } return list; } public static List<(TriggerReceiver, T2)> CollectData<T, T2>(this PlayableCard self, Func<T, bool> respond, Func<T, T2> collect) { return self.TriggerHandler.CollectData(respond, collect); } public static List<(TriggerReceiver, T2)> CollectData<T, T2>(this CardTriggerHandler self, Func<T, bool> respond, Func<T, T2> collect) { List<(TriggerReceiver, T2)> list = new List<(TriggerReceiver, T2)>(); foreach (T item in self.FindTriggersOnCard<T>()) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add(((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null), collect(item))); } } return list; } public static List<TriggerReceiver> CallAll<T>(bool triggerFacedown, Func<T, bool> respond, Action<T> call) { List<TriggerReceiver> list = new List<TriggerReceiver>(); foreach (T item in FindGlobalTriggers<T>(triggerFacedown)) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)); call(item); } } return list; } public static List<TriggerReceiver> CallOnBoard<T>(bool triggerFacedown, Func<T, bool> respond, Action<T> call) { List<TriggerReceiver> list = new List<TriggerReceiver>(); foreach (T item in FindTriggersOnBoard<T>(triggerFacedown)) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)); call(item); } } return list; } public static List<TriggerReceiver> CallInHand<T>(Func<T, bool> respond, Action<T> call) { List<TriggerReceiver> list = new List<TriggerReceiver>(); foreach (T item in FindTriggersInHand<T>()) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)); call(item); } } return list; } public static List<TriggerReceiver> Call<T>(this PlayableCard self, Func<T, bool> respond, Action<T> call) { return self.TriggerHandler.Call(respond, call); } public static List<TriggerReceiver> Call<T>(this CardTriggerHandler self, Func<T, bool> respond, Action<T> call) { List<TriggerReceiver> list = new List<TriggerReceiver>(); foreach (T item in self.FindTriggersOnCard<T>()) { object obj = item; if ((Object)((obj is TriggerReceiver) ? obj : null) != (Object)null && respond(item)) { object obj2 = item; list.Add((TriggerReceiver)((obj2 is TriggerReceiver) ? obj2 : null)); call(item); } } return list; } public static IEnumerable<T> FindGlobalTriggers<T>(bool findFacedown, PlayableCard excluding = null) { IEnumerable<T> enumerable = Enumerable.Empty<T>(); if (Object.op_Implicit((Object)(object)Singleton<BoardManager>.Instance)) { enumerable = enumerable.Concat(FindTriggersOnBoard<T>(findFacedown)); } if (Object.op_Implicit((Object)(object)Singleton<PlayerHand>.Instance)) { enumerable = enumerable.Concat(FindTriggersInHandExcluding<T>(excluding)); } return enumerable; } public static IEnumerable<T> FindGlobalTriggers<T>(PlayableCard excluding = null) { return FindGlobalTriggers<T>(findFacedown: true, excluding); } public static IEnumerable<T> FindTriggersInHand<T>() { return new List<PlayableCard>(Singleton<PlayerHand>.Instance.CardsInHand).Where((PlayableCard c) => (Object)(object)c != (Object)null && c.InHand).SelectMany(FindTriggersOnCard<T>); } public static IEnumerable<T> FindTriggersOnBoard<T>() { return FindTriggersOnBoard<T>(findFacedown: true); } public static IEnumerable<T> FindTriggersOnBoard<T>(bool findFacedown) { List<PlayableCard> source = new List<PlayableCard>(Singleton<BoardManager>.Instance.CardsOnBoard); List<NonCardTriggerReceiver> source2 = new List<NonCardTriggerReceiver>(Singleton<GlobalTriggerHandler>.Instance.nonCardReceivers); List<SlotModificationBehaviour> source3 = new List<SlotModificationBehaviour>(SlotModificationManager.Instance?.SlotReceivers?.Select((KeyValuePair<CardSlot, Tuple<SlotModificationManager.ModificationType, SlotModificationBehaviour>> kvp) => kvp.Value.Item2) ?? Enumerable.Empty<SlotModificationBehaviour>()); return (from x in source2 where !UnityExtensions.SafeIsUnityNull((Object)(object)x) where x.TriggerBeforeCards select x).OfType<T>().Concat(source3.Where((SlotModificationBehaviour x) => !UnityExtensions.SafeIsUnityNull((Object)(object)x)).OfType<T>()).Concat(source.Where((PlayableCard x) => (Object)(object)x != (Object)null && x.OnBoard && (!((Card)x).FaceDown || findFacedown)).SelectMany(FindTriggersOnCard<T>)) .Concat((from x in source2 where !UnityExtensions.SafeIsUnityNull((Object)(object)x) where !x.TriggerBeforeCards select x).OfType<T>()) .Concat(from x in source.Where((PlayableCard x) => (Object)(object)x != (Object)null && x.OnBoard && ((Card)x).FaceDown && !findFacedown).SelectMany(FindTriggersOnCard<T>) where x is IActivateWhenFacedown && (x as IActivateWhenFacedown).ShouldTriggerCustomWhenFaceDown(typeof(T)) select x); } public static IEnumerable<T> FindTriggersInHandExcluding<T>(PlayableCard card) { return new List<PlayableCard>(Singleton<PlayerHand>.Instance.CardsInHand).Where((PlayableCard x) => (Object)(object)x != (Object)null && x.InHand && (Object)(object)x != (Object)(object)card).SelectMany(FindTriggersOnCard<T>); } public static IEnumerable<T> FindTriggersOnCard<T>(this PlayableCard card) { foreach (T item in card.TriggerHandler.GetAllReceivers().OfType<T>()) { yield return item; } } public static IEnumerable<T> FindTriggersOnCard<T>(this CardTriggerHandler card) { foreach (T item in card.GetAllReceivers().OfType<T>()) { yield return item; } } public static IEnumerable<T> FindTriggersInQueue<T>() { TurnManager instance = Singleton<TurnManager>.Instance; object obj; if (instance == null) { obj = null; } else { Opponent opponent = instance.Opponent; T val = default(T); obj = ((opponent != null) ? (from card in opponent.Queue where ((Component)card).TryGetComponent<T>(ref val) select ((Component)card).GetComponent<T>()) : null); } if (obj == null) { obj = new T[0]; } return (IEnumerable<T>)obj; } } [HarmonyPatch] internal static class CustomTriggerPatches { private static Type scaleChangedCoroutine; private static FieldInfo scaleChangedDamage; private static FieldInfo scaleChangedToPlayer; private static FieldInfo scaleChangedNumWeights; private static FieldInfo triggerField; private static readonly Type triggerType = AccessTools.TypeByName("DiskCardGame.GlobalTriggerHandler+<TriggerCardsOnBoard>d__16"); [HarmonyPatch(typeof(PlayerHand), "AddCardToHand")] [HarmonyPostfix] private static IEnumerator TriggerOnAddedToHand(IEnumerator result, PlayableCard card) { yield return result; yield return card.TriggerHandler.Trigger((IOnAddedToHand x) => x.RespondsToAddedToHand(), (IOnAddedToHand x) => x.OnAddedToHand()); yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnOtherCardAddedToHand x) => x.RespondsToOtherCardAddedToHand(card), (IOnOtherCardAddedToHand x) => x.OnOtherCardAddedToHand(card)); } [HarmonyPatch(typeof(CombatPhaseManager), "DoCombatPhase")] [HarmonyPostfix] private static IEnumerator TriggerOnBellRung(IEnumerator result, bool playerIsAttacker) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnBellRung x) => x.RespondsToBellRung(playerIsAttacker), (IOnBellRung x) => x.OnBellRung(playerIsAttacker)); yield return result; } [HarmonyPatch(typeof(CombatPhaseManager), "SlotAttackSequence")] [HarmonyPostfix] private static IEnumerator TriggerOnSlotAttackSequence(IEnumerator result, CardSlot slot) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPreSlotAttackSequence x) => x.RespondsToPreSlotAttackSequence(slot), (IOnPreSlotAttackSequence x) => x.OnPreSlotAttackSequence(slot)); yield return result; yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPostSlotAttackSequence x) => x.RespondsToPostSlotAttackSequence(slot), (IOnPostSlotAttackSequence x) => x.OnPostSlotAttackSequence(slot)); } [HarmonyPatch(typeof(CombatPhaseManager), "SlotAttackSlot")] [HarmonyPostfix] private static IEnumerator TriggerOnPostSingularSlotAttackSlot(IEnumerator result, CardSlot attackingSlot, CardSlot opposingSlot) { yield return result; yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPostSingularSlotAttackSlot x) => x.RespondsToPostSingularSlotAttackSlot(attackingSlot, opposingSlot), (IOnPostSingularSlotAttackSlot x) => x.OnPostSingularSlotAttackSlot(attackingSlot, opposingSlot)); } [HarmonyPatch(typeof(LifeManager), "ShowDamageSequence")] [HarmonyPostfix] private static IEnumerator TriggerOnScalesChanged(IEnumerator result, int damage, int numWeights, bool toPlayer) { int initialDamage = damage; bool initialToPlayer = toPlayer; CustomTriggerFinder.CollectDataAll(collectFromFacedown: false, (IOnPreScalesChangedRef x) => x.RespondsToPreScalesChangedRef(damage, numWeights, toPlayer), delegate(IOnPreScalesChangedRef x) { damage = x.CollectPreScalesChangedRef(damage, ref numWeights, ref toPlayer); if (damage < 0) { damage = -damage; toPlayer = !toPlayer; } return damage; }); yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPreScalesChanged x) => x.RespondsToPreScalesChanged(damage, toPlayer, initialDamage, initialToPlayer), (IOnPreScalesChanged x) => x.OnPreScalesChanged(damage, toPlayer, initialDamage, initialToPlayer)); (scaleChangedDamage ?? (scaleChangedDamage = (scaleChangedCoroutine ?? (scaleChangedCoroutine = result?.GetType()))?.GetField("damage")))?.SetValue(result, damage); (scaleChangedToPlayer ?? (scaleChangedToPlayer = (scaleChangedCoroutine ?? (scaleChangedCoroutine = result?.GetType()))?.GetField("toPlayer")))?.SetValue(result, toPlayer); (scaleChangedNumWeights ?? (scaleChangedNumWeights = (scaleChangedCoroutine ?? (scaleChangedCoroutine = result?.GetType()))?.GetField("numWeights")))?.SetValue(result, numWeights); yield return result; yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPostScalesChanged x) => x.RespondsToPostScalesChanged(damage, toPlayer, initialDamage, initialToPlayer), (IOnPostScalesChanged x) => x.OnPostScalesChanged(damage, toPlayer, initialDamage, initialToPlayer)); } [HarmonyPatch(typeof(TurnManager), "DoUpkeepPhase")] [HarmonyPostfix] private static IEnumerator TriggerOnUpkeepInHand(IEnumerator result, bool playerUpkeep) { yield return result; yield return CustomTriggerFinder.TriggerInHand((IOnUpkeepInHand x) => x.RespondsToUpkeepInHand(playerUpkeep), (IOnUpkeepInHand x) => x.OnUpkeepInHand(playerUpkeep)); } [HarmonyPatch(typeof(BoardManager), "ResolveCardOnBoard")] [HarmonyPostfix] private static IEnumerator TriggerOnOtherCardResolveInHand(IEnumerator result, PlayableCard card, bool resolveTriggers = true) { yield return result; if (resolveTriggers) { yield return CustomTriggerFinder.TriggerInHand((IOnOtherCardResolveInHand x) => x.RespondsToOtherCardResolveInHand(card), (IOnOtherCardResolveInHand x) => x.OnOtherCardResolveInHand(card)); } } [HarmonyPatch(typeof(TurnManager), "PlayerTurn")] [HarmonyPostfix] private static IEnumerator TriggerOnTurnEndInHandPlayer(IEnumerator result) { yield return result; yield return CustomTriggerFinder.TriggerInHand((IOnTurnEndInHand x) => x.RespondsToTurnEndInHand(playerTurn: true), (IOnTurnEndInHand x) => x.OnTurnEndInHand(playerTurn: true)); } [HarmonyPatch(typeof(TurnManager), "OpponentTurn")] [HarmonyPostfix] private static IEnumerator TriggerOnTurnEndInHandOpponent(IEnumerator result, TurnManager __instance) { bool turnSkipped = __instance.Opponent.SkipNextTurn; yield return result; if (!turnSkipped) { yield return CustomTriggerFinder.TriggerInHand((IOnTurnEndInHand x) => x.RespondsToTurnEndInHand(playerTurn: false), (IOnTurnEndInHand x) => x.OnTurnEndInHand(playerTurn: false)); } } [HarmonyPatch(typeof(BoardManager), "AssignCardToSlot")] [HarmonyPostfix] private static IEnumerator TriggerOnOtherCardAssignedToSlotInHand(IEnumerator result, PlayableCard card, bool resolveTriggers) { CardSlot slot2 = card.Slot; yield return result; if (resolveTriggers && (Object)(object)slot2 != (Object)(object)card.Slot) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnCardAssignedToSlotContext x) => x.RespondsToCardAssignedToSlotContext(card, slot2, card.Slot), (IOnCardAssignedToSlotContext x) => x.OnCardAssignedToSlotContext(card, slot2, card.Slot)); } if (resolveTriggers && (Object)(object)slot2 != (Object)(object)card.Slot) { yield return CustomTriggerFinder.TriggerInHand((IOnOtherCardAssignedToSlotInHand x) => x.RespondsToOtherCardAssignedToSlotInHand(card), (IOnOtherCardAssignedToSlotInHand x) => x.OnOtherCardAssignedToSlotInHand(card)); } if (resolveTriggers && (Object)(object)slot2 != (Object)(object)card.Slot && (Object)(object)slot2 != (Object)null) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnCardAssignedToSlotNoResolve x) => x.RespondsToCardAssignedToSlotNoResolve(card), (IOnCardAssignedToSlotNoResolve x) => x.OnCardAssignedToSlotNoResolve(card)); } } [HarmonyPatch(typeof(PlayableCard), "Die")] [HarmonyPostfix] private static IEnumerator TriggerDeathTriggers(IEnumerator result, PlayableCard __instance, bool wasSacrifice, PlayableCard killer = null) { CardSlot slotBeforeDeath = __instance.Slot; while (result.MoveNext()) { yield return result.Current; if (!(result.Current.GetType() == triggerType)) { continue; } Trigger val = (Trigger)21; try { val = (Trigger)(triggerField ?? (triggerField = triggerType.GetField("trigger"))).GetValue(result.Current); } catch { } if ((int)val == 17) { yield return CustomTriggerFinder.TriggerInHand((IOnOtherCardPreDeathInHand x) => x.RespondsToOtherCardPreDeathInHand(slotBeforeDeath, !wasSacrifice, killer), (IOnOtherCardPreDeathInHand x) => x.OnOtherCardPreDeathInHand(slotBeforeDeath, !wasSacrifice, killer)); } else if ((int)val == 11) { yield return CustomTriggerFinder.TriggerInHand((IOnOtherCardDieInHand x) => x.RespondsToOtherCardDieInHand(__instance, slotBeforeDeath, !wasSacrifice, killer), (IOnOtherCardDieInHand x) => x.OnOtherCardDieInHand(__instance, slotBeforeDeath, !wasSacrifice, killer)); } } } [HarmonyPatch(typeof(ConsumableItemSlot), "ConsumeItem")] [HarmonyPostfix] private static IEnumerator TriggerItemUse(IEnumerator result, ConsumableItemSlot __instance) { bool itemCanBeUsed = true; ConsumableItemSlot obj = __instance; object obj2; if (obj == null) { obj2 = null; } else { ConsumableItem consumable = obj.Consumable; if (consumable == null) { obj2 = null; } else { ItemData data = ((Item)consumable).Data; obj2 = ((data != null) ? ((Object)data).name : null); } } string consumableName = (string)obj2; if (!string.IsNullOrEmpty(consumableName)) { CustomTriggerFinder.CollectDataAll(collectFromFacedown: false, (IItemCanBeUsed x) => x.RespondsToItemCanBeUsed(consumableName, itemCanBeUsed), (IItemCanBeUsed x) => itemCanBeUsed = x.CollectItemCanBeUsed(consumableName, itemCanBeUsed)); } if (itemCanBeUsed) { bool successInActivation = false; Type activationtype = __instance.Consumable.ActivateSequence().GetType(); if (!string.IsNullOrEmpty(consumableName)) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPreItemUsed x) => x.RespondsToPreItemUsed(consumableName, __instance is HammerItemSlot), (IOnPreItemUsed x) => x.OnPreItemUsed(consumableName, __instance is HammerItemSlot)); } while (result.MoveNext()) { yield return result.Current; if (result.Current.GetType() == activationtype && !string.IsNullOrEmpty(consumableName) && (Object)(object)__instance.Consumable != (Object)null) { successInActivation = !__instance.Consumable.ActivationCancelled; } } if (!string.IsNullOrEmpty(consumableName)) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnPostItemUsed x) => x.RespondsToPostItemUsed(consumableName, successInActivation, __instance is HammerItemSlot), (IOnPostItemUsed x) => x.OnPostItemUsed(consumableName, successInActivation, __instance is HammerItemSlot)); } yield break; } ConsumableItemSlot obj3 = __instance; if (obj3 != null) { ConsumableItem consumable2 = obj3.Consumable; if (consumable2 != null) { consumable2.PlayShakeAnimation(); } } if (!string.IsNullOrEmpty(consumableName)) { yield return CustomTriggerFinder.TriggerAll(triggerFacedown: false, (IOnItemPreventedFromUse x) => x.RespondsToItemPreventedFromUse(consumableName), (IOnItemPreventedFromUse x) => x.OnItemPreventedFromUse(consumableName)); } } [HarmonyPatch(typeof(PlayableCard), "GetPassiveAttackBuffs")] [HarmonyPostfix] private static void PassiveAttackBuffs(PlayableCard __instance, ref int __result) { int dummyResult = __result; CustomTriggerFinder.CollectDataAll(collectFromFacedown: true, (IOnCardPassiveAttackBuffs x) => x.RespondsToCardPassiveAttackBuffs(__instance, dummyResult), (IOnCardPassiveAttackBuffs x) => dummyResult = x.CollectCardPassiveAttackBuffs(__instance, dummyResult)); if (__instance.OnBoard) { CustomTriggerFinder.CollectDataAll(collectFromFacedown: true, (IPassiveAttackBuff x) => true, (IPassiveAttackBuff x) => dummyResult += x.GetPassiveAttackBuff(__instance)); } __result = dummyResult; } [HarmonyPatch(typeof(PlayableCard), "GetPassiveHealthBuffs")] [HarmonyPostfix] private static void PassiveHealthBuffs(PlayableCard __instance, ref int __result) { int dummyResult = __result; CustomTriggerFinder.CollectDataAll(collectFromFacedown: true, (IOnCardPassiveHealthBuffs x) => x.RespondsToCardPassiveHealthBuffs(__instance, dummyResult), (IOnCardPassiveHealthBuffs x) => dummyResult = x.CollectCardPassiveHealthBuffs(__instance, dummyResult)); if (__instance.OnBoard) { CustomTriggerFinder.CollectDataAll(collectFromFacedown: true, (IPassiveHealthBuff x) => true, (IPassiveHealthBuff x) => dummyResult += x.GetPassiveHealthBuff(__instance)); } __result = dummyResult; } [HarmonyPatch(typeof(PlayableCard), "GetOpposingSlots")] [HarmonyPrefix] private static bool OpposingSlotsPrefix(PlayableCard __instance, ref List<CardSlot> __result, ref int __state) { List<ISetupAttackSequence> list = CustomTriggerFinder.FindGlobalTriggers<ISetupAttackSequence>(findFacedown: true).ToList(); list.RemoveAll((ISetupAttackSequence x) => (Object)((x is TriggerReceiver) ? x : null) == (Object)null); list.Sort((ISetupAttackSequence x, ISetupAttackSequence x2) => x.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.ReplacesDefaultOpposingSlot, new List<CardSlot>(), new List<CardSlot>(), 0, didRemoveDefaultSlot: false) - x2.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.ReplacesDefaultOpposingSlot, new List<CardSlot>(), new List<CardSlot>(), 0, didRemoveDefaultSlot: false)); bool flag = false; bool didRemoveDefaultSlot = false; __state = 1; foreach (ISetupAttackSequence item in list) { if (item.RespondsToModifyAttackSlots(__instance, OpposingSlotTriggerPriority.ReplacesDefaultOpposingSlot, new List<CardSlot>(), __result ?? new List<CardSlot>(), __state, didRemoveDefaultSlot: false)) { flag = true; __result = item.CollectModifyAttackSlots(__instance, OpposingSlotTriggerPriority.ReplacesDefaultOpposingSlot, new List<CardSlot>(), __result ?? new List<CardSlot>(), ref __state, ref didRemoveDefaultSlot); didRemoveDefaultSlot = false; } } if (!flag && __instance.HasAbility((Ability)33)) { __state = Mathf.Max(1, (__instance.OpponentCard ? Singleton<BoardManager>.Instance.PlayerSlotsCopy : Singleton<BoardManager>.Instance.OpponentSlotsCopy).FindAll((CardSlot x) => (Object)(object)x.Card != (Object)null && !__instance.CanAttackDirectly(x)).Count); } if (flag) { if (__instance.HasAbility((Ability)24)) { ProgressionData.SetAbilityLearned((Ability)24); __result.Remove(__instance.Slot.opposingSlot); __result.AddRange(Singleton<BoardManager>.Instance.GetAdjacentSlots(__instance.Slot.opposingSlot)); } if (__instance.HasTriStrike()) { ProgressionData.SetAbilityLearned((Ability)25); __result.AddRange(Singleton<BoardManager>.Instance.GetAdjacentSlots(__instance.Slot.opposingSlot)); if (!__result.Contains(__instance.Slot.opposingSlot)) { __result.Add(__instance.Slot.opposingSlot); } } if (__instance.HasAbility((Ability)100)) { ProgressionData.SetAbilityLearned((Ability)100); __result.Add(__instance.slot.opposingSlot); } } if (__instance.HasAbility((Ability)24)) { __state++; } if (__instance.HasTriStrike()) { __state += 2; if (__instance.HasAbility((Ability)24)) { __state++; } } if (__instance.HasAbility((Ability)100)) { __state++; } __result?.Sort((CardSlot a, CardSlot b) => a.Index - b.Index); return !flag; } [HarmonyPatch(typeof(PlayableCard), "GetOpposingSlots")] [HarmonyPostfix] private static void OpposingSlots(PlayableCard __instance, ref List<CardSlot> __result, int __state) { List<CardSlot> original = new List<CardSlot>(__result); bool flag = !__instance.HasTriStrike() && !__instance.HasAbility((Ability)24); CardSlot opposingSlot = __instance.Slot.opposingSlot; List<CardSlot> list = new List<CardSlot>(); bool flag2 = false; foreach (IGetOpposingSlots item in __instance.FindTriggersOnCard<IGetOpposingSlots>()) { if ((Object)((item is TriggerReceiver) ? item : null) != (Object)null && item.RespondsToGetOpposingSlots()) { list.AddRange(item.GetOpposingSlots(__result, new List<CardSlot>(list))); flag2 = flag2 || item.RemoveDefaultAttackSlot(); } } if (list.Count > 0) { __result.AddRange(list); } if (flag && flag2) { __result.Remove(opposingSlot); } bool didRemoveOriginalSlot = __instance.HasAbility((Ability)24) && (!__instance.HasTriStrike() || flag2); List<ISetupAttackSequence> list2 = CustomTriggerFinder.FindGlobalTriggers<ISetupAttackSequence>(findFacedown: true).ToList(); list2.RemoveAll((ISetupAttackSequence x) => (Object)((x is TriggerReceiver) ? x : null) == (Object)null); List<CardSlot> dummyresult = __result; list2.Sort((ISetupAttackSequence x, ISetupAttackSequence x2) => x.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.Normal, original, dummyresult, __state, didRemoveOriginalSlot) - x2.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.Normal, original, dummyresult, __state, didRemoveOriginalSlot)); foreach (ISetupAttackSequence item2 in list2) { if (item2.RespondsToModifyAttackSlots(__instance, OpposingSlotTriggerPriority.Normal, original, __result ?? new List<CardSlot>(), __state, didRemoveOriginalSlot)) { __result = item2.CollectModifyAttackSlots(__instance, OpposingSlotTriggerPriority.Normal, original, __result ?? new List<CardSlot>(), ref __state, ref didRemoveOriginalSlot); } } dummyresult = __result; list2.Sort((ISetupAttackSequence x, ISetupAttackSequence x2) => x.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.BringsBackOpposingSlot, original, dummyresult, __state, didRemoveOriginalSlot) - x2.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.BringsBackOpposingSlot, original, dummyresult, __state, didRemoveOriginalSlot)); foreach (ISetupAttackSequence item3 in list2) { if (item3.RespondsToModifyAttackSlots(__instance, OpposingSlotTriggerPriority.BringsBackOpposingSlot, original, __result ?? new List<CardSlot>(), __state, didRemoveOriginalSlot)) { __result = item3.CollectModifyAttackSlots(__instance, OpposingSlotTriggerPriority.BringsBackOpposingSlot, original, __result ?? new List<CardSlot>(), ref __state, ref didRemoveOriginalSlot); } } dummyresult = __result; list2.Sort((ISetupAttackSequence x, ISetupAttackSequence x2) => x.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.PostAdditionModification, original, dummyresult, __state, didRemoveOriginalSlot) - x2.GetTriggerPriority(__instance, OpposingSlotTriggerPriority.PostAdditionModification, original, dummyresult, __state, didRemoveOriginalSlot)); foreach (ISetupAttackSequence item4 in list2) { if (item4.RespondsToModifyAttackSlots(__instance, OpposingSlotTriggerPriority.PostAdditionModification, original, __result ?? new List<CardSlot>(), __state, didRemoveOriginalSlot)) { __result = item4.CollectModifyAttackSlots(__instance, OpposingSlotTriggerPriority.PostAdditionModification, original, __result ?? new List<CardSlot>(), ref __state, ref didRemoveOriginalSlot); } } if (didRemoveOriginalSlot && __instance.HasTriStrike()) { __result.Add(__instance.Slot.opposingSlot); } __result.Sort((CardSlot a, CardSlot b) => a.Index - b.Index); } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> TriggerOnTurnEndInQueuePlayer(IEnumerable<CodeInstruction> instructions) { return TriggerOnTurnEndInQueue(instructions, playerTurn: true); } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> TriggerOnTurnEndInQueueOpponent(IEnumerable<CodeInstruction> instructions) { return TriggerOnTurnEndInQueue(instructions, playerTurn: false); } private static IEnumerable<CodeInstruction> TriggerOnTurnEndInQueue(IEnumerable<CodeInstruction> instructions, bool playerTurn) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown List<CodeInstruction> list = instructions.ToList(); int num = list.IndexOf(list.First((CodeInstruction code) => code.opcode == OpCodes.Callvirt && CodeInstructionExtensions.OperandIs(code, (MemberInfo)AccessTools.Method(typeof(GlobalTriggerHandler), "TriggerCardsOnBoard", (Type[])null, (Type[])null)))); num++; list.Insert(num++, new CodeInstruction(playerTurn ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0, (object)null)); list.Insert(num++, new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(CustomTriggerPatches), "TriggerOnTurnEndInQueueCoro", (Type[])null, (Type[])null))); return list; } private static IEnumerator TriggerOnTurnEndInQueueCoro(IEnumerator originalTrigger, bool playerTurn) { yield return originalTrigger; foreach (IOnTurnEndInQueue item in CustomTriggerFinder.FindTriggersInQueue<IOnTurnEndInQueue>()) { if ((Object)((item is TriggerReceiver) ? item : null) != (Object)null && item.RespondsToTurnEndInQueue(playerTurn)) { yield return item.OnTurnEndInQueue(playerTurn); } } } [HarmonyPatch(typeof(GlobalTriggerHandler), "TriggerNonCardReceivers")] [HarmonyPostfix] private static IEnumerator TriggerSlotModificationHandlers(IEnumerator sequence, bool beforeCards, Trigger trigger, params object[] otherArgs) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) yield return sequence; if (!beforeCards) { yield break; } List<SlotModificationBehaviour> list = new List<SlotModificationBehaviour>(SlotModificationManager.Instance?.SlotReceivers?.Select((KeyValuePair<CardSlot, Tuple<SlotModificationManager.ModificationType, SlotModificationBehaviour>> kvp) => kvp.Value.Item2) ?? Enumerable.Empty<SlotModificationBehaviour>()); foreach (SlotModificationBehaviour item in list) { if ((Object)(object)item != (Object)null && GlobalTriggerHandler.ReceiverRespondsToTrigger(trigger, (TriggerReceiver)(object)item, otherArgs)) { yield return Singleton<GlobalTriggerHandler>.Instance.TriggerSequence(trigger, (TriggerReceiver)(object)item, otherArgs); } } } } [HarmonyPatch] public static class DoCombatPhasePatches { private const string name_GetDamageDealt = "Int32 get_DamageDealtThisPhase()"; private const string name_PlayerAttacker = "System.Boolean playerIsAttacker"; private const string name_SpecialSequencer = "DiskCardGame.SpecialBattleSequencer specialSequencer"; private const string name_SquirrelAttacker = "System.Boolean <attackedWithSquirrel>5__4"; private const string name_CombatCurrent = "System.Object <>2__current"; public static IEnumerator NegativeDamageSupport(CombatPhaseManager __instance, bool playerIsAttacker, SpecialBattleSequencer specialSequencer, bool attackedWithSquirrel) { if (__instance.DamageDealtThisPhase == 0) { yield break; } bool targetOfDamage = ((__instance.DamageDealtThisPhase < 0) ? (!playerIsAttacker) : playerIsAttacker); yield return (object)new WaitForSeconds(0.4f); yield return __instance.VisualizeDamageMovingToScales(targetOfDamage); int overkillDamage = 0; if (playerIsAttacker && __instance.DamageDealtThisPhase > 0) { overkillDamage = Singleton<LifeManager>.Instance.Balance + __instance.DamageDealtThisPhase - 5; if (attackedWithSquirrel && overkillDamage >= 0) { AchievementManager.Unlock((Achievement)14); } overkillDamage = Mathf.Max(0, overkillDamage); } int num = Math.Abs(__instance.DamageDealtThisPhase); int damage = num - overkillDamage; AscensionStatsData.TryIncreaseStat((Type)4, num); if (num >= 666) { AchievementManager.Unlock((Achievement)25); } bool canDealDamage = (Object)(object)specialSequencer == (Object)null || !specialSequencer.PreventDamageAddedToScales; if (canDealDamage) { yield return Singleton<LifeManager>.Instance.ShowDamageSequence(damage, damage, !targetOfDamage, 0f, (GameObject)null, 0f, true); } if ((Object)(object)specialSequencer != (Object)null) { yield return specialSequencer.DamageAddedToScale(damage + overkillDamage, targetOfDamage); } if (canDealDamage && overkillDamage > 0 && Singleton<TurnManager>.Instance.Opponent.NumLives == 1 && Singleton<TurnManager>.Instance.Opponent.GiveCurrencyOnDefeat) { yield return Singleton<TurnManager>.Instance.Opponent.TryRevokeSurrender(); RunState run = RunState.Run; run.currency += overkillDamage; yield return __instance.VisualizeExcessLethalDamage(overkillDamage, specialSequencer); } } public static List<CardSlot> ModifyAttackingSlots(bool playerIsAttacker) { List<CardSlot> originalSlots = Singleton<BoardManager>.Instance.GetSlotsCopy(playerIsAttacker); List<CardSlot> list = new List<CardSlot>(originalSlots); List<IGetAttackingSlots> list2 = CustomTriggerFinder.FindTriggersOnBoard<IGetAttackingSlots>(findFacedown: false).ToList(); list2.Sort((IGetAttackingSlots a, IGetAttackingSlots b) => b.TriggerPriority(playerIsAttacker, originalSlots) - a.TriggerPriority(playerIsAttacker, originalSlots)); foreach (IGetAttackingSlots item in list2) { if ((Object)((item is TriggerReceiver) ? item : null) != (Object)null && item.RespondsToGetAttackingSlots(playerIsAttacker, originalSlots, list)) { List<CardSlot> attackingSlots = item.GetAttackingSlots(playerIsAttacker, originalSlots, list); if (attackingSlots != null && attackingSlots.Count > 0) { list.AddRange(attackingSlots); } } } return list; } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> SelfDamage(IEnumerable<CodeInstruction> instructions) { //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Expected O, but got Unknown //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Expected O, but got Unknown //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Expected O, but got Unknown //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Expected O, but got Unknown //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Expected O, but got Unknown //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Expected O, but got Unknown //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Expected O, but got Unknown //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); object obj = null; object obj2 = null; object obj3 = null; for (int i = 0; i < list.Count; i++) { if (!(list[i].opcode == OpCodes.Brtrue)) { continue; } MethodBase methodBase = AccessTools.Method(typeof(DoCombatPhasePatches), "ModifyAttackingSlots", new Type[1] { typeof(bool) }, (Type[])null); for (int j = i; j < list.Count; j++) { if (list[j].opcode == OpCodes.Stfld) { list.RemoveRange(i, j - i); break; } } list.Insert(i, new CodeInstruction(OpCodes.Call, (object)methodBase)); break; } for (int k = 0; k < list.Count; k++) { if (obj == null && list[k].operand?.ToString() == "System.Boolean playerIsAttacker") { obj = list[k].operand; } else if (obj2 == null && list[k].operand?.ToString() == "DiskCardGame.SpecialBattleSequencer specialSequencer") { obj2 = list[k].operand; } else if (obj3 == null && list[k].operand?.ToString() == "System.Boolean <attackedWithSquirrel>5__4") { obj3 = list[k].operand; } else { if (!(list[k].operand?.ToString() == "Int32 get_DamageDealtThisPhase()")) { continue; } int num = k - 1; for (int l = k; l < list.Count; l++) { if (list[l + 2].opcode == OpCodes.Ldc_I4_S && list[l + 2].operand.ToString() == "11") { MethodBase methodBase2 = AccessTools.Method(typeof(DoCombatPhasePatches), "NegativeDamageSupport", new Type[4] { typeof(CombatPhaseManager), typeof(bool), typeof(SpecialBattleSequencer), typeof(bool) }, (Type[])null); list.RemoveAll((CodeInstruction x) => x.opcode == OpCodes.Nop); list[num].opcode = OpCodes.Ldarg_0; list.Insert(num + 1, new CodeInstruction(OpCodes.Ldloc_2, (object)null)); list.Insert(num + 2, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); list.Insert(num + 3, new CodeInstruction(OpCodes.Ldfld, obj)); list.Insert(num + 4, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); list.Insert(num + 5, new CodeInstruction(OpCodes.Ldfld, obj2)); list.Insert(num + 6, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); list.Insert(num + 7, new CodeInstruction(OpCodes.Ldfld, obj3)); list.Insert(num + 8, new CodeInstruction(OpCodes.Callvirt, (object)methodBase2)); return list; } CodeInstructionExtensions.MoveLabelsTo(list[l], list[num]); list[l].opcode = OpCodes.Nop; } } } return list; } } public interface IOnAddedToHand { bool RespondsToAddedToHand(); IEnumerator OnAddedToHand(); } public interface IOnOtherCardAddedToHand { bool RespondsToOtherCardAddedToHand(PlayableCard card); IEnumerator OnOtherCardAddedToHand(PlayableCard card); } public interface IOnCardAssignedToSlotNoResolve { bool RespondsToCardAssignedToSlotNoResolve(PlayableCard card); IEnumerator OnCardAssignedToSlotNoResolve(PlayableCard card); } public interface IOnCardAssignedToSlotContext { bool RespondsToCardAssignedToSlotContext(PlayableCard card, CardSlot oldSlot, CardSlot newSlot); IEnumerator OnCardAssignedToSlotContext(PlayableCard card, CardSlot oldSlot, CardSlot newSlot); } public interface IOnBellRung { bool RespondsToBellRung(bool playerCombatPhase); IEnumerator OnBellRung(bool playerCombatPhase); } public interface IOnPreSlotAttackSequence { bool RespondsToPreSlotAttackSequence(CardSlot attackingSlot); IEnumerator OnPreSlotAttackSequence(CardSlot attackingSlot); } public interface IOnPostSlotAttackSequence { bool RespondsToPostSlotAttackSequence(CardSlot attackingSlot); IEnumerator OnPostSlotAttackSequence(CardSlot attackingSlot); } public interface IOnPostSingularSlotAttackSlot { bool RespondsToPostSingularSlotAttackSlot(CardSlot attackingSlot, CardSlot targetSlot); IEnumerator OnPostSingularSlotAttackSlot(CardSlot attackingSlot, CardSlot targetSlot); } public interface IOnPreScalesChangedRef { bool RespondsToPreScalesChangedRef(int damage, int numWeights, bool toPlayer); int CollectPreScalesChangedRef(int damage, ref int numWeights, ref bool toPlayer); } public interface IOnPreScalesChanged { bool RespondsToPreScalesChanged(int damage, bool toPlayer, int originalDamage, bool originalToPlayer); IEnumerator OnPreScalesChanged(int damage, bool toPlayer, int originalDamage, bool originalToPlayer); } public interface IOnPostScalesChanged { bool RespondsToPostScalesChanged(int damage, bool toPlayer, int originalDamage, bool originalToPlayer); IEnumerator OnPostScalesChanged(int damage, bool toPlayer, int originalDamage, bool originalToPlayer); } public interface IOnUpkeepInHand { bool RespondsToUpkeepInHand(bool playerUpkeep); IEnumerator OnUpkeepInHand(bool playerUpkeep); } public interface IOnOtherCardResolveInHand { bool RespondsToOtherCardResolveInHand(PlayableCard resolvingCard); IEnumerator OnOtherCardResolveInHand(PlayableCard resolvingCard); } public interface IOnTurnEndInHand { bool RespondsToTurnEndInHand(bool playerTurn); IEnumerator OnTurnEndInHand(bool playerTurn); } public interface IOnOtherCardAssignedToSlotInHand { bool RespondsToOtherCardAssignedToSlotInHand(PlayableCard card); IEnumerator OnOtherCardAssignedToSlotInHand(PlayableCard card); } public interface IOnOtherCardPreDeathInHand { bool RespondsToOtherCardPreDeathInHand(CardSlot deathSlot, bool fromCombat, PlayableCard killer); IEnumerator OnOtherCardPreDeathInHand(CardSlot deathSlot, bool fromCombat, PlayableCard killer); } public interface IOnOtherCardDealtDamageInHand { bool RespondsToOtherCardDealtDamageInHand(PlayableCard attacker, int amount, PlayableCard target); IEnumerator OnOtherCardDealtDamageInHand(PlayableCard attacker, int amount, PlayableCard target); } public interface IOnOtherCardDieInHand { bool RespondsToOtherCardDieInHand(PlayableCard card, CardSlot deathSlot, bool fromCombat, PlayableCard killer); IEnumerator OnOtherCardDieInHand(PlayableCard card, CardSlot deathSlot, bool fromCombat, PlayableCard killer); } public interface IOnPreItemUsed { bool RespondsToPreItemUsed(string itemName, bool isHammer); IEnumerator OnPreItemUsed(string itemName, bool isHammer); } public interface IOnPostItemUsed { bool RespondsToPostItemUsed(string itemName, bool success, bool isHammer); IEnumerator OnPostItemUsed(string itemName, bool success, bool isHammer); } public interface IGetOpposingSlots { bool RespondsToGetOpposingSlots(); List<CardSlot> GetOpposingSlots(List<CardSlot> originalSlots, List<CardSlot> otherAddedSlots); bool RemoveDefaultAttackSlot(); } public interface ISetupAttackSequence { bool RespondsToModifyAttackSlots(PlayableCard card, OpposingSlotTriggerPriority modType, List<CardSlot> originalSlots, List<CardSlot> currentSlots, int attackCount, bool didRemoveDefaultSlot); List<CardSlot> CollectModifyAttackSlots(PlayableCard card, OpposingSlotTriggerPriority modType, List<CardSlot> originalSlots, List<CardSlot> currentSlots, ref int attackCount, ref bool didRemoveDefaultSlot); int GetTriggerPriority(PlayableCard card, OpposingSlotTriggerPriority modType, List<CardSlot> originalSlots, List<CardSlot> currentSlots, int attackCount, bool didRemoveDefaultSlot); } public enum OpposingSlotTriggerPriority { Normal, BringsBackOpposingSlot, PostAdditionModification, ReplacesDefaultOpposingSlot } public interface IItemCanBeUsed { bool RespondsToItemCanBeUsed(string itemname, bool currentValue); bool CollectItemCanBeUsed(string itemname, bool currentValue); } public interface IOnItemPreventedFromUse { bool RespondsToItemPreventedFromUse(string itemName); IEnumerator OnItemPreventedFromUse(string itemName); } public interface IOnCardPassiveAttackBuffs { bool RespondsToCardPassiveAttackBuffs(PlayableCard card, int currentValue); int CollectCardPassiveAttackBuffs(PlayableCard card, int currentValue); } public interface IOnCardPassiveHealthBuffs { bool RespondsToCardPassiveHealthBuffs(PlayableCard card, int currentValue); int CollectCardPassiveHealthBuffs(PlayableCard card, int currentValue); } public interface IPassiveHealthBuff { int GetPassiveHealthBuff(PlayableCard target); } public interface IPassiveAttackBuff { int GetPassiveAttackBuff(PlayableCard target); } [Obsolete("Use IModifyDamageTaken instead.")] public interface ICardTakenDamageModifier { bool RespondsToCardTakenDamageModifier(PlayableCard card, int currentValue); int CollectCardTakenDamageModifier(PlayableCard card, int currentValue); } public interface IGetAttackingSlots { bool RespondsToGetAttackingSlots(bool playerIsAttacker, List<CardSlot> originalSlots, List<CardSlot> currentSlots); List<CardSlot> GetAttackingSlots(bool playerIsAttacker, List<CardSlot> originalSlots, List<CardSlot> currentSlots); int TriggerPriority(bool playerIsAttacker, List<CardSlot> originalSlots); } public interface IModifyDamageTaken { bool RespondsToModifyDamageTaken(PlayableCard target, int damage, PlayableCard attacker, int originalDamage); int OnModifyDamageTaken(PlayableCard target, int damage, PlayableCard attacker, int originalDamage); int TriggerPriority(PlayableCard target, int damage, PlayableCard attacker); } public interface IPreTakeDamage { bool RespondsToPreTakeDamage(PlayableCard source, int damage); IEnumerator OnPreTakeDamage(PlayableCard source, int damage); } public interface IModifyDirectDamage { bool RespondsToModifyDirectDamage(CardSlot target, int damage, PlayableCard attacker, int originalDamage); int OnModifyDirectDamage(CardSlot target, int damage, PlayableCard attacker, int originalDamage); int TriggerPriority(CardSlot target, int damage, PlayableCard attacker); } public interface IOnTurnEndInQueue { bool RespondsToTurnEndInQueue(bool playerTurn); IEnumerator OnTurnEndInQueue(bool playerTurn); } public interface IOnCardDealtDamageDirectly { bool RespondsToCardDealtDamageDirectly(PlayableCard attacker, CardSlot opposingSlot, int damage); IEnumerator OnCardDealtDamageDirectly(PlayableCard attacker, CardSlot opposingSlot, int damage); } public interface IShieldPreventedDamage { bool RespondsToShieldPreventedDamage(PlayableCard target, int damage, PlayableCard attacker); IEnumerator OnShieldPreventedDamage(PlayableCard target, int damage, PlayableCard attacker); int ShieldPreventedDamagePriority(PlayableCard target, int damage, PlayableCard attacker); } public interface IShieldPreventedDamageInHand { bool RespondsToShieldPreventedDamageInHand(PlayableCard target, int damage, PlayableCard attacker); IEnumerator OnShieldPreventedDamageInHand(PlayableCard target, int damage, PlayableCard attacker); int ShieldPreventedDamageInHandPriority(PlayableCard target, int damage, PlayableCard attacker); } [HarmonyPatch] public static class SlotAttackSlotPatches { private const string name_GlobalTrigger = "DiskCardGame.GlobalTriggerHandler get_Instance()"; private const string name_GetCard = "DiskCardGame.PlayableCard get_Card()"; private const string name_GetAttack = "Int32 get_Attack()"; private const string name_OpposingSlot = "DiskCardGame.CardSlot opposingSlot"; private const string name_CombatPhase = "DiskCardGame.CombatPhaseManager+<>c__DisplayClass5_0 <>8__1"; private const string name_AttackingSlot = "DiskCardGame.CardSlot attackingSlot"; private const string name_CanAttackDirectly = "Boolean CanAttackDirectly(DiskCardGame.CardSlot)"; private const string name_VisualizeCardAttackingDirectly = "System.Collections.IEnumerator VisualizeCardAttackingDirectly(DiskCardGame.CardSlot, DiskCardGame.CardSlot, Int32)"; private const string modifiedAttackCustomField = "modifiedAttack"; private static readonly MethodInfo method_GetCard = AccessTools.PropertyGetter(typeof(CardSlot), "Card"); private static readonly MethodInfo method_NewDamage = AccessTools.Method(typeof(SlotAttackSlotPatches), "DamageToDealThisPhase", new Type[2] { typeof(CardSlot), typeof(CardSlot) }, (Type[])null); private static readonly MethodInfo method_NewTriggers = AccessTools.Method(typeof(SlotAttackSlotPatches), "TriggerOnDirectDamageTriggers", new Type[2] { typeof(PlayableCard), typeof(CardSlot) }, (Type[])null); private static readonly MethodInfo method_SetCustomField = AccessTools.Method(typeof(CustomFields), "Set", (Type[])null, (Type[])null); private static readonly MethodInfo method_GetCustomField = AccessTools.Method(typeof(CustomFields), "Get", new Type[2] { typeof(object), typeof(string) }, new Type[1] { typeof(int) }); public static int DamageToDealThisPhase(CardSlot attackingSlot, CardSlot opposingSlot) { int damage; int originalDamage = (damage = attackingSlot.Card.Attack); List<IModifyDirectDamage> list = CustomTriggerFinder.FindGlobalTriggers<IModifyDirectDamage>(findFacedown: true).ToList(); list.Sort((IModifyDirectDamage a, IModifyDirectDamage b) => b.TriggerPriority(opposingSlot, damage, attackingSlot.Card) - a.TriggerPriority(opposingSlot, damage, attackingSlot.Card)); foreach (IModifyDirectDamage item in list) { if (item.RespondsToModifyDirectDamage(opposingSlot, damage, attackingSlot.Card, originalDamage)) { damage = item.OnModifyDirectDamage(opposingSlot, damage, attackingSlot.Card, originalDamage); } } if (attackingSlot.IsPlayerSlot == opposingSlot.IsPlayerSlot) { return -damage; } if (Singleton<TurnManager>.Instance.IsPlayerTurn) { if (attackingSlot.IsOpponentSlot()) { if (!opposingSlot.IsPlayerSlot) { return damage; } return -damage; } } else if (attackingSlot.IsPlayerSlot) { if (!opposingSlot.IsOpponentSlot()) { return damage; } return -damage; } return damage; } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (!ModifyDirectDamageCheck(list, ref i)) { continue; } for (int j = i; j < list.Count; j++) { if (CallTriggerOnDirectDamage(list, ref j)) { for (int k = j; k < list.Count && !OpposingCardNullCheck(list, k); k++) { } break; } } break; } return list; } private static bool OpposingCardNullCheck(List<CodeInstruction> codes, int i) { //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Expected O, but got Unknown //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Expected O, but got Unknown //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Expected O, but got Unknown //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Expected O, but got Unknown //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Expected O, but got Unknown //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Expected O, but got Unknown if (codes[i].opcode == OpCodes.Call && codes[i].operand.ToString() == "DiskCardGame.GlobalTriggerHandler get_Instance()" && codes[i + 1].opcode == OpCodes.Ldc_I4_7) { MethodInfo methodInfo = null; object obj = null; object obj2 = null; object obj3 = null; for (int j = i + 1; j < codes.Count; j++) { if (codes[j].opcode == OpCodes.Ldfld && codes[j].operand.ToString() == "DiskCardGame.CardSlot opposingSlot" && obj == null) { obj = codes[j].operand; } if (codes[j].opcode == OpCodes.Callvirt && codes[j].operand.ToString() == "DiskCardGame.PlayableCard get_Card()" && obj2 == null) { obj2 = codes[j].operand; } if (!(codes[j].opcode == OpCodes.Stfld) || !(codes[j - 1].opcode == OpCodes.Ldc_I4_M1)) { continue; } for (int k = j + 1; k < codes.Count; k++) { if (codes[k].opcode == OpCodes.Call && methodInfo == null) { methodInfo = (MethodInfo)codes[k].operand; } if (obj3 == null && codes[k].opcode == OpCodes.Brfalse) { obj3 = codes[k].operand; } if (codes[k].opcode == OpCodes.Stfld) { codes.Insert(k + 1, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); codes.Insert(k + 2, new CodeInstruction(OpCodes.Ldfld, obj)); codes.Insert(k + 3, new CodeInstruction(OpCodes.Callvirt, obj2)); codes.Insert(k + 4, new CodeInstruction(OpCodes.Ldnull, (object)null)); codes.Insert(k + 5, new CodeInstruction(OpCodes.Call, (object)methodInfo)); codes.Insert(k + 6, new CodeInstruction(OpCodes.Brfalse, obj3)); return true; } } break; } } return false; } private static bool ModifyDirectDamageCheck(List<CodeInstruction> codes, ref int index) { //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Expected O, but got Unknown //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Expected O, but got Unknown //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Expected O, but got Unknown //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Expected O, but got Unknown //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Expected O, but got Unknown //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Expected O, but got Unknown //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Expected O, but got Unknown //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Expected O, but got Unknown //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Expected O, but got Unknown if (codes[index].opcode == OpCodes.Callvirt && codes[index].operand.ToString() == "Boolean CanAttackDirectly(DiskCardGame.CardSlot)") { int num = index + 2; object obj = null; object obj2 = null; object obj3 = null; for (int num2 = index - 1; num2 > 0; num2--) { if (obj == null && codes[num2].operand?.ToString() == "DiskCardGame.CardSlot opposingSlot") { obj = codes[num2].operand; break; } } for (int i = num; i < codes.Count; i++) { if (obj2 == null && codes[i].operand?.ToString() == "DiskCardGame.CombatPhaseManager+<>c__DisplayClass5_0 <>8__1") { obj2 = codes[i].operand; obj3 = codes[i + 1].operand; break; } } int j = num; codes.Insert(j++, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldfld, obj2)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldfld, obj3)); codes.Insert(j++, new CodeInstruction(OpCodes.Callvirt, (object)method_GetCard)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldstr, (object)"modifiedAttack")); codes.Insert(j++, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldfld, obj2)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldfld, obj3)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); codes.Insert(j++, new CodeInstruction(OpCodes.Ldfld, obj)); codes.Insert(j++, new CodeInstruction(OpCodes.Callvirt, (object)method_NewDamage)); codes.Insert(j++, new CodeInstruction(OpCodes.Box, (object)typeof(int))); codes.Insert(j++, new CodeInstruction(OpCodes.Call, (object)method_SetCustomField)); index = j; for (int k = 0; k < 2; k++) { for (; j < codes.Count; j++) { if (!(codes[j].opcode != OpCodes.Callvirt) && !(codes[j].operand.ToString() != "Int32 get_Attack()")) { codes[j++] = new CodeInstruction(OpCodes.Ldstr, (object)"modifiedAttack"); codes.Insert(j++, new CodeInstruction(OpCodes.Callvirt, (object)method_GetCustomField)); index = j; break; } } } return true; } return false; } private static bool CallTriggerOnDirectDamage(List<CodeInstruction> codes, ref int index) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Expected O, but got Unknown if (codes[index].opcode != OpCodes.Callvirt || codes[index].operand.ToString() != "DiskCardGame.PlayableCard get_Card()") { return false; } int num = ++index; object obj = null; for (int num2 = num - 1; num2 > 0; num2--) { if (obj == null && codes[num2].operand?.ToString() == "DiskCardGame.CardSlot opposingSlot") { obj = codes[num2].operand; break; } } for (int num3 = num - 1; num3 > 0; num3--) { if (codes[num3].opcode == OpCodes.Ldarg_0) { codes.Insert(num3, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); index++; num++; break; } }
plugins/InscryptionCommunityPatch.dll
Decompiled 6 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DiskCardGame; using GBC; using HarmonyLib; using InscryptionAPI.Boons; using InscryptionAPI.Card; using InscryptionAPI.CardCosts; using InscryptionAPI.Dialogue; using InscryptionAPI.Helpers; using InscryptionAPI.Helpers.Extensions; using InscryptionCommunityPatch.Card; using InscryptionCommunityPatch.ResourceManagers; using InscryptionCommunityPatch.Tests; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using Pixelplacement; using Pixelplacement.TweenSystem; using Sirenix.Serialization.Utilities; using Sirenix.Utilities; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("InscryptionCommunityPatch")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.22.0.0")] [assembly: AssemblyInformationalVersion("2.22.0+186cd592a3143da46b84b4f0937a00aa17c6fd3b")] [assembly: AssemblyProduct("InscryptionCommunityPatch")] [assembly: AssemblyTitle("InscryptionCommunityPatch")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.22.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 InscryptionCommunityPatch { [BepInPlugin("community.inscryption.patch", "InscryptionCommunityPatch", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class PatchPlugin : BaseUnityPlugin { public const string ModGUID = "community.inscryption.patch"; public const string ModName = "InscryptionCommunityPatch"; public const string ModVer = "1.0.0"; internal static PatchPlugin Instance; internal static ConfigEntry<bool> configEnergy; internal static ConfigEntry<bool> configDrone; internal static ConfigEntry<bool> configMox; internal static ConfigEntry<bool> configDroneMox; internal static ConfigEntry<bool> configShowSquirrelTribeOnCards; internal static ConfigEntry<bool> configAct3Bones; internal static ConfigEntry<bool> configResetEyes; internal static ConfigEntry<bool> undeadCatEmission; internal static ConfigEntry<bool> rightAct2Cost; internal static ConfigEntry<bool> act2CostRender; internal static ConfigEntry<bool> act2StackIconType; internal static ConfigEntry<bool> configMergeOnBottom; internal static ConfigEntry<bool> configRemovePatches; internal static ConfigEntry<bool> configSmallPricetags; internal static ConfigEntry<bool> configMovePricetags; internal static ConfigEntry<bool> configTestState; internal static ConfigEntry<bool> configFullDebug; internal static ConfigEntry<bool> configDefaultDrone; internal static ConfigEntry<bool> act2TutorCenterRows; internal static ManualLogSource Logger; private readonly Harmony HarmonyInstance = new Harmony("community.inscryption.patch"); private void OnEnable() { Logger = ((BaseUnityPlugin)this).Logger; HarmonyInstance.PatchAll(typeof(PatchPlugin).Assembly); SceneManager.sceneLoaded += OnSceneLoaded; if (configTestState.Value) { ExecuteCommunityPatchTests.PrepareForTests(); TestCost.Init(); } CommunityArtPatches.PatchCommunityArt(); } private void OnDisable() { HarmonyInstance.UnpatchSelf(); } private void Awake() { Instance = this; configEnergy = ((BaseUnityPlugin)this).Config.Bind<bool>("Energy", "Energy Refresh", true, "Max energy increases and energy refreshes at end of turn"); configDrone = ((BaseUnityPlugin)this).Config.Bind<bool>("Energy", "Energy Drone", false, "Drone is visible to display energy (requires Energy Refresh)"); configDefaultDrone = ((BaseUnityPlugin)this).Config.Bind<bool>("Energy", "Default Drone", false, "Drone uses the vanilla model instead of being attached to the scales (requires Energy Drone)"); configMox = ((BaseUnityPlugin)this).Config.Bind<bool>("Mox", "Mox Refresh", true, "Mox refreshes at end of battle"); configDroneMox = ((BaseUnityPlugin)this).Config.Bind<bool>("Mox", "Mox Drone", false, "Drone displays mox (requires Energy Drone and Mox Refresh)"); configAct3Bones = ((BaseUnityPlugin)this).Config.Bind<bool>("Bones", "Act 3 Bones", false, "Force bones displayer to be active in Act 3"); configShowSquirrelTribeOnCards = ((BaseUnityPlugin)this).Config.Bind<bool>("Tribes", "Show Squirrel Tribe", false, "Shows the Squirrel tribe icon on cards"); act2CostRender = ((BaseUnityPlugin)this).Config.Bind<bool>("Card Costs", "GBC Cost render", true, "GBC Cards are able to display custom costs and hybrid costs through the API."); rightAct2Cost = ((BaseUnityPlugin)this).Config.Bind<bool>("Card Costs", "GBC Cost On Right", true, "GBC Cards display their costs on the top-right corner. If false, display on the top-left corner"); configMergeOnBottom = ((BaseUnityPlugin)this).Config.Bind<bool>("Sigil Display", "Merge_On_Botom", false, "Makes it so if enabled, merged sigils will display on the bottom of the card instead of on the artwork. In extreme cases, this can cause some visual bugs."); configRemovePatches = ((BaseUnityPlugin)this).Config.Bind<bool>("Sigil Display", "Remove_Patches", false, "Makes it so if enabled, merged sigils will not have a patch behind them anymore and will instead be glowing yellow (only works with Merge_On_Bottom)."); configSmallPricetags = ((BaseUnityPlugin)this).Config.Bind<bool>("Act 1", "Smaller Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be scaled down."); configMovePricetags = ((BaseUnityPlugin)this).Config.Bind<bool>("Act 1", "Move Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be moved to the right."); act2StackIconType = ((BaseUnityPlugin)this).Config.Bind<bool>("Sigil Display", "Act 2 Sigil icon type", true, "If true, stacking icons are a cream outline with a black center. If false, stacking icons are a black outline with a cream center. Act 2"); act2TutorCenterRows = ((BaseUnityPlugin)this).Config.Bind<bool>("Act 2", "Centred Hoarder UI", true, "If true, centres displayed cards in each row during the Hoarder selection sequence."); configFullDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Full Debug", true, "If true, displays all debug logs in the console."); configTestState = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Test Mode", false, "Puts the game into test mode. This will cause (among potentially other things) a new run to spawn a number of cards into your opening deck that will demonstrate card behaviors."); configResetEyes = ((BaseUnityPlugin)this).Config.Bind<bool>("Act 1", "Reset Red Eyes", false, "Resets Leshy's eyes to normal if they were turned red due to a boss fight's grizzly bear sequence."); undeadCatEmission = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Undead Cat Emission", false, "If true, Undead Cat will have a forced red emission."); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { EnergyDrone.TryEnableEnergy(((Scene)(ref scene)).name); } } } namespace InscryptionCommunityPatch.Tests { public class SacrificeSquirrels : BoonBehaviour { public override bool RespondsToOtherCardResolve(PlayableCard otherCard) { return ((Object)((Card)otherCard).Info).name.ToLowerInvariant().Equals("squirrel"); } public override IEnumerator OnOtherCardResolve(PlayableCard otherCard) { yield return ((BoonBehaviour)this).PlayBoonAnimation(); otherCard.TemporaryMods.Add(new CardModificationInfo((Ability)14)); ((Card)otherCard).RenderCard(); } } [HarmonyPatch] public static class ExecuteCommunityPatchTests { public static Type TestBoon; public static void PrepareForTests() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) AbilityExtensions.AbilityByID((IEnumerable<FullAbility>)AbilityManager.BaseGameAbilities, (Ability)15).Info.canStack = true; AbilityExtensions.AbilityByID((IEnumerable<FullAbility>)AbilityManager.BaseGameAbilities, (Ability)34).Info.canStack = true; AbilityExtensions.AbilityByID((IEnumerable<FullAbility>)AbilityManager.BaseGameAbilities, (Ability)29).Info.canStack = true; TestBoon = BoonManager.New("community.inscryption.patch", "Sacrificial Squirrels", typeof(SacrificeSquirrels), "Squirrels are super OP now", (Texture)(object)Resources.Load<Texture2D>("art/cards/abilityicons/ability_drawcopyondeath"), (Texture)(object)Resources.Load<Texture2D>("art/cards/boons/boonportraits/boon_startinggoat"), false, true, true); } [HarmonyPatch(typeof(AscensionSaveData), "NewRun")] [HarmonyPostfix] private static void StartRunInTestMode(ref AscensionSaveData __instance) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown //IL_018b: Unknown result type (might be due to invalid IL or missing references) if (!PatchPlugin.configTestState.Value) { return; } List<Ability> list = new List<Ability> { (Ability)15, (Ability)83, (Ability)6, (Ability)1, (Ability)3, (Ability)4, (Ability)100, (Ability)23, (Ability)2 }; for (int i = 2; i < 4; i++) { CardInfo cardByName = CardLoader.GetCardByName("Rabbit"); CardModificationInfo val = new CardModificationInfo(); val.abilities = new List<Ability>(list.Take(i)); cardByName.mods.Add(val); CardModificationInfo val2 = new CardModificationInfo(); val2.abilities = new List<Ability> { list[i - 1] }; val2.fromCardMerge = true; cardByName.mods.Add(val2); ((CardCollectionInfo)__instance.currentRun.playerDeck).AddCard(cardByName); } for (int j = 1; j <= 2; j++) { CardInfo cardByName2 = CardLoader.GetCardByName("Rabbit"); CardModificationInfo val3 = new CardModificationInfo(); val3.abilities = new List<Ability>(); for (int k = 0; k < j; k++) { val3.abilities.Add((Ability)15); val3.abilities.Add((Ability)34); val3.abilities.Add((Ability)29); val3.abilities.Add((Ability)2); } cardByName2.mods.Add(val3); ((CardCollectionInfo)__instance.currentRun.playerDeck).AddCard(cardByName2); } __instance.currentRun.playerDeck.AddBoon(TestBoon); } } public class TestCost : CustomCardCost { public override string CostName => "TestCost"; public static void Init() { PatchPlugin.Logger.LogDebug((object)"Adding TestCost"); CardCostManager.SetFoundAtChoiceNodes(CardCostManager.SetCanBePlayedByTurn2WithHand(CardCostManager.SetCostTier(CardCostManager.Register("cyantist.inscryption.api", "TestCost", typeof(TestCost), (Func<int, CardInfo, PlayableCard, Texture2D>)Texture3D, (Func<int, CardInfo, PlayableCard, Texture2D>)TexturePixel), (Func<int, int>)CostTier), (Func<int, CardInfo, List<CardInfo>, bool>)CanBePlayed), true, (Texture)(object)TextureHelper.GetImageAsTexture("testCost.png", typeof(TestCost).Assembly, (FilterMode)0)); } public static int CostTier(int amount) { return Mathf.FloorToInt((float)amount / 2f); } public static bool CanBePlayed(int amount, CardInfo card, List<CardInfo> hand) { return amount <= 2; } public static Texture2D Texture3D(int cardCost, CardInfo cardInfo, PlayableCard playableCard) { return ReverseColours(TextureHelper.GetImageAsTexture($"energy_cost_{Mathf.Min(7, cardCost)}.png", typeof(PatchPlugin).Assembly, (FilterMode)0)); } public static Texture2D TexturePixel(int cardCost, CardInfo info, PlayableCard playableCard) { return ReverseColours(Part2CardCostRender.CombineIconAndCount(cardCost, TextureHelper.GetImageAsTexture("pixel_energy.png", typeof(PatchPlugin).Assembly, (FilterMode)0))); } private static Texture2D ReverseColours(Texture2D texToReverse) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004f: 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) float num = default(float); float num2 = default(float); float num3 = default(float); for (int i = 0; i < ((Texture)texToReverse).width; i++) { for (int j = 0; j < ((Texture)texToReverse).height; j++) { Color pixel = texToReverse.GetPixel(i, j); Color.RGBToHSV(pixel, ref num, ref num2, ref num3); Color val = Color.HSVToRGB((num + 0.5f) % 1f, (num2 + 0.5f) % 1f, (num3 + 0.5f) % 1f); val.a = pixel.a; texToReverse.SetPixel(i, j, val); } } texToReverse.Apply(); return texToReverse; } public override bool CostSatisfied(int cardCost, PlayableCard card) { return cardCost <= Singleton<ResourcesManager>.Instance.PlayerEnergy - card.EnergyCost; } public override string CostUnsatisfiedHint(int cardCost, PlayableCard card) { return "Eat your greens aby. " + ((Card)card).Info.DisplayedNameLocalized; } public override IEnumerator OnPlayed(int cardCost, PlayableCard card) { if (cardCost > 0) { yield return Singleton<ResourcesManager>.Instance.SpendEnergy(cardCost); } } } } namespace InscryptionCommunityPatch.Sequencers { [HarmonyPatch] internal class BuyPeltsSmallTags { [HarmonyPostfix] [HarmonyPatch(typeof(BuyPeltsSequencer), "AddPricetagToCard")] private static void ReducePricetagSize(SelectableCard card) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_008d: Unknown result type (might be due to invalid IL or missing references) if (!PatchPlugin.configSmallPricetags.Value && !PatchPlugin.configMovePricetags.Value) { return; } Transform val = ((Component)card).transform.Find("pricetag"); if (!((Object)(object)val == (Object)null)) { if (PatchPlugin.configSmallPricetags.Value) { val.localScale = new Vector3(0.75f, 1f, 0.75f); } if (PatchPlugin.configMovePricetags.Value) { val.localPosition = new Vector3(val.localPosition.x * -1f, val.localPosition.y, val.localPosition.z); } } } } [HarmonyPatch] internal static class ChoiceNodePatch { [HarmonyPostfix] [HarmonyPatch(typeof(CardSingleChoicesSequencer), "GetCardbackTexture")] private static void CardSingleChoicesSequencer_GetCardbackTexture(ref Texture __result, CardChoice choice) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Invalid comparison between Unknown and I4 //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 ResourceType resourceType = choice.resourceType; if ((int)resourceType != 3) { if ((int)resourceType == 4) { __result = (Texture)(object)TextureHelper.GetImageAsTexture(MoxTextureName(choice.resourceAmount), typeof(ChoiceNodePatch).Assembly, (FilterMode)0); } } else { __result = (Texture)(object)TextureHelper.GetImageAsTexture("energyCost.png", typeof(ChoiceNodePatch).Assembly, (FilterMode)0); } } public static string MoxTextureName(int index) { return "moxCost" + index switch { 1 => "Green", 2 => "Orange", 3 => "Blue", _ => "", } + ".png"; } } [HarmonyPatch] internal class CardStatBoostSequencerPatch { private const string name_DisplayClass = "DiskCardGame.CardStatBoostSequencer+<>c__DisplayClass12_0 <>8__1"; private const string name_AttackMod = "System.Boolean attackMod"; private const string name_ViewInstance = "DiskCardGame.ViewManager get_Instance()"; private const string name_GetValidCards = "System.Collections.Generic.List`1[DiskCardGame.CardInfo] GetValidCards(Boolean)"; private const string name_DestroyCard = "Void DestroyCard()"; private static MethodBase TargetMethod() { return AccessTools.EnumeratorMoveNext((MethodBase)AccessTools.Method(typeof(CardStatBoostSequencer), "StatBoostSequence", (Type[])null, (Type[])null)); } private static object Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Expected O, but got Unknown //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Expected O, but got Unknown //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Expected O, but got Unknown //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Expected O, but got Unknown //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Expected O, but got Unknown //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Expected O, but got Unknown //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02d9: Expected O, but got Unknown //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Expected O, but got Unknown //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Expected O, but got Unknown //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Expected O, but got Unknown //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Expected O, but got Unknown //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); int num = -1; int num2 = -1; object obj = null; object obj2 = null; object obj3 = null; object obj4 = null; CodeInstruction item = null; for (int i = 0; i < list.Count; i++) { if (list[i].opcode == OpCodes.Ldfld && list[i].operand.ToString() == "DiskCardGame.CardStatBoostSequencer+<>c__DisplayClass12_0 <>8__1" && obj == null) { obj = list[i].operand; } else if (list[i].opcode == OpCodes.Ldfld && list[i].operand.ToString() == "System.Boolean attackMod" && obj2 == null) { obj2 = list[i].operand; } else if (list[i].opcode == OpCodes.Callvirt && list[i].operand.ToString() == "System.Collections.Generic.List`1[DiskCardGame.CardInfo] GetValidCards(Boolean)" && obj3 == null) { obj3 = list[i].operand; obj4 = list[i + 1].operand; } else if (list[i].opcode == OpCodes.Ldc_I4_7) { num = i - 6; } else if (list[i].opcode == OpCodes.Call && list[i].operand.ToString() == "DiskCardGame.ViewManager get_Instance()" && list[i + 1].opcode == OpCodes.Ldc_I4_1 && list[i + 3].opcode == OpCodes.Ldc_I4_0) { num2 = i + 6; } else if (list[i].opcode == OpCodes.Callvirt && list[i].operand.ToString() == "Void DestroyCard()") { item = new CodeInstruction(list[i + 1]); } if (num != -1 && num2 != -1) { MethodBase methodBase = AccessTools.Method(typeof(CardStatBoostSequencerPatch), "NewStatBoostSequence", new Type[2] { typeof(CardStatBoostSequencer), typeof(bool) }, (Type[])null); list.RemoveAt(num2); list.RemoveAt(num2); list.Insert(num2, new CodeInstruction(OpCodes.Ldloc_1, (object)null)); list.Insert(num2 + 1, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); list.Insert(num2 + 2, new CodeInstruction(OpCodes.Ldfld, obj)); list.Insert(num2 + 3, new CodeInstruction(OpCodes.Ldfld, obj2)); list.Insert(num2 + 4, new CodeInstruction(OpCodes.Callvirt, (object)methodBase)); list.Insert(num, new CodeInstruction(OpCodes.Ldloc_1, (object)null)); list.Insert(num + 1, new CodeInstruction(OpCodes.Ldarg_0, (object)null)); list.Insert(num + 2, new CodeInstruction(OpCodes.Ldfld, obj)); list.Insert(num + 3, new CodeInstruction(OpCodes.Ldfld, obj2)); list.Insert(num + 4, new CodeInstruction(OpCodes.Callvirt, obj3)); list.Insert(num + 5, new CodeInstruction(OpCodes.Callvirt, obj4)); list.Insert(num + 6, item); list[num + 6].opcode = OpCodes.Brfalse_S; break; } } return list; } private static IEnumerator NewStatBoostSequence(CardStatBoostSequencer instance, bool attackMod) { if (instance.GetValidCards(attackMod).Count == 0) { if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)"Player has no cards that can be boosted at the campfire."); } yield return (object)new WaitForSeconds(0.5f); yield return Singleton<TextDisplayer>.Instance.ShowUntilInput("You have no creatures to warm.", -2.5f, 0.5f, (Emotion)0, (LetterAnimation)0, (Speaker)0, (string[])null, true); yield return (object)new WaitForSeconds(0.25f); } yield return (object)new WaitForSeconds(0.25f); } } [HarmonyPatch] internal class LeshyResetRedEyes { [HarmonyPostfix] [HarmonyPatch(typeof(TurnManager), "CleanupPhase")] private static IEnumerator ResetLeshyEyes(IEnumerator enumerator, TurnManager __instance) { if (!PatchPlugin.configResetEyes.Value || !SaveManager.SaveFile.IsPart1 || (Object)(object)__instance.opponent == (Object)null) { yield return enumerator; yield break; } bool flag = false; Opponent opponent = __instance.opponent; ProspectorBossOpponent val = (ProspectorBossOpponent)(object)((opponent is ProspectorBossOpponent) ? opponent : null); if (val != null) { flag = ((Part1BossOpponent)val).HasGrizzlyGlitchPhase(int.MinValue); } else { Opponent opponent2 = __instance.opponent; AnglerBossOpponent val2 = (AnglerBossOpponent)(object)((opponent2 is AnglerBossOpponent) ? opponent2 : null); if (val2 != null) { flag = ((Part1BossOpponent)val2).HasGrizzlyGlitchPhase(0); } else { Opponent opponent3 = __instance.opponent; TrapperTraderBossOpponent val3 = (TrapperTraderBossOpponent)(object)((opponent3 is TrapperTraderBossOpponent) ? opponent3 : null); if (val3 != null) { flag = ((Part1BossOpponent)val3).HasGrizzlyGlitchPhase(1); } } } if (flag) { LeshyAnimationController instance = LeshyAnimationController.Instance; if (instance != null) { instance.ResetEyesTexture(); } } yield return enumerator; } } [HarmonyPatch] internal class PackRatNodeBackgroundFix { [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> FixRareBackground(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); for (int i = 0; i < list.Count; i++) { if (!(list[i].opcode == OpCodes.Callvirt) || !(list[i].operand.ToString() == "DiskCardGame.SelectableCard GetComponent[SelectableCard]()")) { continue; } int num = i - 3; for (int j = i + 1; j < list.Count; j++) { if (list[j].opcode == OpCodes.Stloc_2) { list.RemoveRange(num, j - 3 - num); break; } } break; } return list; } } [HarmonyPatch] public class TradeableTalkingCardFix { [HarmonyPrefix] [HarmonyPatch(typeof(TradeCardsForPelts), "OnTradableSelected")] private static bool OnTalkingCardSelected(TradeCardsForPelts __instance, HighlightedInteractable slot, PlayableCard card) { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)card != (Object)null && (Object)(object)((Component)card).GetComponent<TalkingCard>() == (Object)null) { return true; } if (__instance.PeltInHand()) { AscensionStatsData.TryIncrementStat((Type)8); PlayableCard pelt = Singleton<PlayerHand>.Instance.CardsInHand.Find((PlayableCard x) => ((Card)x).Info.HasTrait((Trait)13)); Singleton<PlayerHand>.Instance.RemoveCardFromHand(pelt); ((InteractableBase)pelt).SetEnabled(false); ((Card)pelt).Anim.SetTrigger("fly_off"); Tween.Position(((Component)pelt).transform, ((Component)pelt).transform.position + new Vector3(0f, 3f, 5f), 0.4f, 0f, Tween.EaseInOut, (LoopType)0, (Action)null, (Action)delegate { Object.Destroy((Object)(object)((Component)pelt).gameObject); }, true); card.UnassignFromSlot(); Tween.Position(((Component)card).transform, ((Component)card).transform.position + new Vector3(0f, 0.25f, -5f), 0.3f, 0f, Tween.EaseInOut, (LoopType)0, (Action)null, (Action)delegate { Object.Destroy((Object)(object)((Component)card).gameObject); }, true); ((MonoBehaviour)__instance).StartCoroutine(TradeForTalkingCard(card)); ((InteractableBase)slot).ClearDelegates(); slot.HighlightCursorType = (CursorType)0; } return false; } public static IEnumerator TradeForTalkingCard(PlayableCard card) { yield return Singleton<PlayerHand>.Instance.AddCardToHand(CardSpawner.SpawnPlayableCard(((Card)card).Info), new Vector3(0f, 0.5f, -3f), 0f); Singleton<ViewManager>.Instance.SwitchToView((View)6, false, false); Singleton<ViewManager>.Instance.Controller.SwitchToControlMode((ControlMode)18, false); } } } namespace InscryptionCommunityPatch.ResourceManagers { [HarmonyPatch] public static class EnergyDrone { public class EnergyConfigInfo { public bool ConfigEnergy { get; set; } = PoolHasEnergy || PatchPlugin.configEnergy.Value; public bool ConfigShowDrone { get; set; } = PoolHasEnergy || PatchPlugin.configDrone.Value; public bool ConfigDroneMox { get; set; } = PoolHasGems || PatchPlugin.configDroneMox.Value; public bool ConfigMox { get; set; } = PoolHasGems || PatchPlugin.configMox.Value; public bool ConfigDefaultDrone { get; set; } = PatchPlugin.configDefaultDrone.Value; public bool ConfigDrone { get { if (!ConfigShowDrone) { return ConfigDroneMox; } return true; } } } public static Dictionary<CardTemple, EnergyConfigInfo> ZoneConfigs = new Dictionary<CardTemple, EnergyConfigInfo> { { (CardTemple)0, new EnergyConfigInfo() }, { (CardTemple)1, new EnergyConfigInfo() }, { (CardTemple)2, new EnergyConfigInfo() }, { (CardTemple)3, new EnergyConfigInfo() } }; public static bool CurrentSceneCanHaveEnergyDrone { get { //IL_0000: 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) Scene activeScene = SceneManager.GetActiveScene(); if (string.IsNullOrEmpty(((Scene)(ref activeScene)).name)) { return false; } return SceneCanHaveEnergyDrone(((Scene)(ref activeScene)).name); } } private static EnergyConfigInfo EnergyConfig => GetEnergyConfig(); public static bool PoolHasEnergy { get; private set; } public static bool PoolHasGems { get; private set; } public static bool SceneCanHaveEnergyDrone(string sceneName) { string text = sceneName.ToLowerInvariant(); if (text.Contains("part1")) { if (!text.Contains("sanctum")) { return !text.Contains("finale"); } return false; } if (!text.Contains("magnificus")) { return text.Contains("grimora"); } return true; } public static EnergyConfigInfo GetEnergyConfig() { if (SaveManager.SaveFile.IsPart3) { return ZoneConfigs[(CardTemple)2]; } if (SaveManager.SaveFile.IsGrimora) { return ZoneConfigs[(CardTemple)1]; } if (SaveManager.SaveFile.IsMagnificus) { return ZoneConfigs[(CardTemple)3]; } return ZoneConfigs[(CardTemple)0]; } private static bool CardIsVisible(this CardInfo info, CardTemple targetTemple) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (info.temple != targetTemple) { return false; } return CardExtensions.HasAnyOfCardMetaCategories(info, (CardMetaCategory[])(object)new CardMetaCategory[3] { default(CardMetaCategory), (CardMetaCategory)1, (CardMetaCategory)3 }); } internal static void TryEnableEnergy(string sceneName) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (SceneCanHaveEnergyDrone(sceneName)) { CardTemple targetTemple = (CardTemple)(SaveManager.SaveFile.IsGrimora ? 1 : (SaveManager.SaveFile.IsMagnificus ? 3 : 0)); PoolHasEnergy = CardManager.AllCardsCopy.Any((CardInfo ci) => ci.energyCost > 0 && ci.CardIsVisible(targetTemple)); PoolHasGems = CardManager.AllCardsCopy.Any((CardInfo ci) => ci.gemsCost.Count > 0 && ci.CardIsVisible(targetTemple)); PatchPlugin.Logger.LogDebug((object)$"Card pool has Energy cards? {PoolHasEnergy}. Card pool has Gem cards? {PoolHasGems}."); Object.Instantiate<ResourceDrone>(Resources.Load<ResourceDrone>("prefabs/cardbattle/ResourceModules")); if (EnergyConfig.ConfigDrone) { ((MonoBehaviour)PatchPlugin.Instance).StartCoroutine(AwakeDrone()); } } } private static IEnumerator AwakeDrone() { if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)$"Awaking ResourceDrone, instance exists? {(Object)(object)Singleton<ResourceDrone>.Instance != (Object)null}."); } yield return (object)new WaitForSeconds(1f); Singleton<ResourceDrone>.Instance.Awake(); yield return (object)new WaitForSeconds(1f); Singleton<ResourceDrone>.Instance.AttachGemsModule(); if (EnergyConfig.ConfigDefaultDrone) { ((Component)Singleton<ResourceDrone>.Instance).gameObject.transform.localPosition = Singleton<ResourceDrone>.Instance.boardPosition + Vector3.up * 5f; } else { AttachDroneToScale(); } } private static void AttachDroneToScale() { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) try { ((Behaviour)((Component)((Component)Singleton<ResourceDrone>.Instance).transform.Find("Anim")).gameObject.GetComponent<Animator>()).enabled = false; ((Component)((Component)Singleton<ResourceDrone>.Instance).transform.Find("Anim/Module-Energy/Propellers")).gameObject.SetActive(false); Transform val = ((Component)Singleton<LifeManager>.Instance.Scales3D).gameObject.transform.Find("Scale"); ((Component)Singleton<ResourceDrone>.Instance).transform.SetParent(val); ((Component)Singleton<ResourceDrone>.Instance).transform.localEulerAngles = Vector3.zero; ((Component)Singleton<ResourceDrone>.Instance).transform.localScale = new Vector3(0.6f, 0.6f, 0.6f); ((Component)Singleton<ResourceDrone>.Instance).transform.localPosition = new Vector3(0.02f, -0.2f, 2f); Singleton<ResourceDrone>.Instance.boardPosition = val.position; } catch { PatchPlugin.Logger.LogError((object)"Couldn't attach ResourceDrone to LifeManager.Scale3D!"); } } [HarmonyPatch(typeof(ResourceDrone), "SetOnBoard")] [HarmonyPrefix] private static bool Act1ResourceDrone_SetOnBoard(ResourceDrone __instance, bool onBoard, bool immediate) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) if (!CurrentSceneCanHaveEnergyDrone) { return true; } ((Component)__instance.Gems).gameObject.SetActive(EnergyConfig.ConfigDroneMox); if (onBoard) { ((Component)__instance).gameObject.SetActive(true); __instance.SetAllCellsOn(false); } if (EnergyConfig.ConfigDefaultDrone) { Vector3 val = __instance.boardPosition + (onBoard ? Vector3.zero : (Vector3.up * 5f)); if (immediate) { ((Component)__instance).gameObject.transform.position = val; if (!onBoard) { ((Component)__instance).gameObject.SetActive(false); } } else { Tween.Position(((Component)__instance).gameObject.transform, val, 1.5f, 0f, Tween.EaseInOut, (LoopType)0, (Action)null, (Action)delegate { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (onBoard) { Tween.Shake(((Component)__instance).gameObject.transform, ((Component)__instance).gameObject.transform.localPosition, Vector3.one * 0.15f, 0.15f, 0f, (LoopType)0, (Action)null, (Action)null, true); } ((Component)__instance).gameObject.SetActive(onBoard); }, true); } } return false; } [HarmonyPrefix] [HarmonyPatch(typeof(ResourceDrone), "UpdateCellAndGemColors")] private static bool DisableUpdateWhenNull() { if ((Object)(object)Singleton<ResourcesManager>.m_Instance == (Object)null) { return false; } return true; } [HarmonyPatch(typeof(Part1ResourcesManager), "CleanUp")] [HarmonyPrefix] private static void Part1ResourcesManager_CleanUp(Part1ResourcesManager __instance) { if (EnergyConfig.ConfigEnergy) { ((ResourcesManager)__instance).PlayerEnergy = 0; ((ResourcesManager)__instance).PlayerMaxEnergy = 0; } if (EnergyConfig.ConfigDrone && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { Singleton<ResourceDrone>.Instance.CloseAllCells(false); Singleton<ResourceDrone>.Instance.SetOnBoard(false, false); if (EnergyConfig.ConfigDroneMox) { GemsModule gems = Singleton<ResourceDrone>.Instance.Gems; if (gems != null) { gems.SetAllGemsOn(false, false); } } } if (EnergyConfig.ConfigMox) { ((ResourcesManager)__instance).gems.Clear(); } } [HarmonyPatch(typeof(ResourcesManager), "Setup")] [HarmonyPrefix] private static void ResourcesManager_Setup(ResourcesManager __instance) { if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDrone && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { Singleton<ResourceDrone>.Instance.SetOnBoard(true, false); if (EnergyConfig.ConfigDroneMox) { PatchPlugin.Logger.LogDebug((object)"Setting up extra drone resources."); Singleton<ResourceDrone>.Instance.Gems.SetAllGemsOn(false, true); } } } [HarmonyPatch(typeof(ResourcesManager), "ShowAddMaxEnergy")] [HarmonyPostfix] private static IEnumerator ResourcesManager_ShowAddMaxEnergy(IEnumerator result, ResourcesManager __instance) { if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDrone && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { int num = __instance.PlayerMaxEnergy - 1; Singleton<ResourceDrone>.Instance.OpenCell(num); yield return (object)new WaitForSeconds(0.4f); } yield return result; } [HarmonyPatch(typeof(ResourcesManager), "ShowAddEnergy")] [HarmonyPostfix] private static IEnumerator ResourcesManager_ShowAddEnergy(IEnumerator result, int amount, ResourcesManager __instance) { if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDrone && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { for (int i = __instance.PlayerEnergy - amount; i < __instance.PlayerEnergy; i++) { Singleton<ResourceDrone>.Instance.SetCellOn(i, true, false); yield return (object)new WaitForSeconds(0.05f); } } yield return result; } [HarmonyPatch(typeof(ResourcesManager), "ShowSpendEnergy")] [HarmonyPostfix] private static IEnumerator ResourcesManager_ShowSpendEnergy(IEnumerator result, int amount, ResourcesManager __instance) { if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDrone && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { for (int i = __instance.PlayerEnergy + amount - 1; i >= __instance.PlayerEnergy; i--) { AudioController.Instance.PlaySound3D("crushBlip3", (MixerGroup)4, ((Component)__instance).transform.position, 0.4f, 0f, new Pitch(0.9f + (float)(__instance.PlayerEnergy + i) * 0.05f), (Repetition)null, (Randomization)null, (Distortion)null, false); Singleton<ResourceDrone>.Instance.SetCellOn(i, false, false); yield return (object)new WaitForSeconds(0.05f); } } yield return result; } [HarmonyPatch(typeof(ResourcesManager), "ShowAddGem")] [HarmonyPostfix] private static IEnumerator ResourcesManager_ShowAddGem(IEnumerator result, GemType gem, ResourcesManager __instance) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDroneMox) { __instance.SetGemOnImmediate(gem, true); yield return (object)new WaitForSeconds(0.05f); } yield return result; } [HarmonyPatch(typeof(ResourcesManager), "ShowLoseGem")] [HarmonyPostfix] private static IEnumerator ResourcesManager_ShowLoseGem(IEnumerator result, GemType gem, ResourcesManager __instance) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (__instance is Part1ResourcesManager && EnergyConfig.ConfigDroneMox) { __instance.SetGemOnImmediate(gem, false); yield return (object)new WaitForSeconds(0.05f); } yield return result; } [HarmonyPatch(typeof(ResourcesManager), "SetGemOnImmediate")] [HarmonyPostfix] private static void ResourcesManager_SetGemOnImmediate(GemType gem, bool on, ResourcesManager __instance) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (__instance is Part1ResourcesManager && (Object)(object)Singleton<ResourceDrone>.m_Instance != (Object)null) { GemsModule gems = Singleton<ResourceDrone>.Instance.Gems; if (gems != null) { gems.SetGemOn(gem, on, false); } } } [HarmonyPatch(typeof(TurnManager), "DoUpkeepPhase")] [HarmonyPostfix] private static IEnumerator TurnManager_UpkeepPhase(IEnumerator sequence, bool playerUpkeep) { yield return sequence; if (playerUpkeep && CurrentSceneCanHaveEnergyDrone && EnergyConfig.ConfigEnergy) { bool showEnergyModule = !Singleton<ResourcesManager>.Instance.EnergyAtMax || Singleton<ResourcesManager>.Instance.PlayerEnergy < Singleton<ResourcesManager>.Instance.PlayerMaxEnergy; if (showEnergyModule) { Singleton<ViewManager>.Instance.SwitchToView((View)1, false, true); yield return (object)new WaitForSeconds(0.1f); } yield return Singleton<ResourcesManager>.Instance.AddMaxEnergy(1); yield return Singleton<ResourcesManager>.Instance.RefreshEnergy(); if (showEnergyModule) { yield return (object)new WaitForSeconds(0.25f); Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)0; } } } } [HarmonyPatch] public static class Act3BonesDisplayer { private static ConditionalWeakTable<ResourceDrone, GameObject> _boneTvScreen = new ConditionalWeakTable<ResourceDrone, GameObject>(); private static ConditionalWeakTable<ResourceDrone, SpriteRenderer> _boneCountRenderer = new ConditionalWeakTable<ResourceDrone, SpriteRenderer>(); private static Material _holoRefMaterial; public static bool ForceBonesDisplayActive { get; set; } = false; public static bool DisplayAct3Bones { get { if (!ForceBonesDisplayActive && !PoolHasBones) { return PatchPlugin.configAct3Bones.Value; } return true; } } public static bool PoolHasBones => CardManager.AllCardsCopy.Any((CardInfo ci) => ci.BonesCost > 0 && ci.CardIsVisible()); public static bool SceneCanHaveBonesDisplayer { get { //IL_0000: 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) Scene activeScene = SceneManager.GetActiveScene(); if (string.IsNullOrEmpty(((Scene)(ref activeScene)).name)) { return false; } return ((Scene)(ref activeScene)).name.ToLowerInvariant().Contains("part3"); } } private static GameObject BonesTVScreen { get { if (_boneTvScreen.TryGetValue(Singleton<ResourceDrone>.Instance, out var value)) { return value; } return null; } set { _boneTvScreen.Add(Singleton<ResourceDrone>.Instance, value); } } private static SpriteRenderer BonesCountRenderer { get { if (_boneCountRenderer.TryGetValue(Singleton<ResourceDrone>.Instance, out var value)) { return value; } return null; } set { _boneCountRenderer.Add(Singleton<ResourceDrone>.Instance, value); } } private static Material HoloRefMaterial { get { if (_holoRefMaterial == null) { _holoRefMaterial = CardLoader.GetCardByName("BridgeRailing").holoPortraitPrefab.GetComponentInChildren<Renderer>().material; } return _holoRefMaterial; } } private static bool CardIsVisible(this CardInfo info) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)info.temple != 2) { return false; } return info.metaCategories.Exists((CardMetaCategory x) => (int)x == 0 || (int)x == 2 || (int)x == 3); } private static GameObject MakeBoneTokenPrefab(Transform parent) { //IL_0022: 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_0031: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(ResourceBank.Get<GameObject>("Prefabs/CardBattle/CardBattle").GetComponentInChildren<Part1ResourcesManager>().boneTokenPrefab, parent); val.transform.position = parent.position + Vector3.up * 0.25f; Object.Destroy((Object)(object)val.GetComponent<BoneTokenInteractable>()); Rigidbody component = val.GetComponent<Rigidbody>(); component.angularVelocity = new Vector3(0f, 30f, 0f); component.maxAngularVelocity = 30f; component.inertiaTensor = new Vector3(0.2f, 10f, 0.2f); Renderer[] componentsInChildren = val.GetComponentsInChildren<Renderer>(); for (int i = 0; i < componentsInChildren.Length; i++) { Material[] materials = componentsInChildren[i].materials; foreach (Material val2 in materials) { val2.shader = Shader.Find("SFHologram/HologramShader"); val2.CopyPropertiesFromMaterial(HoloRefMaterial); val2.SetColor("_Color", Color.white); if (val2.HasProperty("_EmissionColor")) { val2.SetColor("_EmissionColor", Color.white); } if (val2.HasProperty("_MainColor")) { val2.SetColor("_MainColor", Color.white); } if (val2.HasProperty("_RimColor")) { val2.SetColor("_RimColor", Color.white); } } } return val; } private static void DisplayBones(int bones) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)BonesCountRenderer != (Object)null) { Texture2D item = Part3CardCostRender.GetIconifiedCostTexture(Part3CardCostRender.BoneCostIcon, bones, forceDigitDisplay: true).Item2; BonesCountRenderer.sprite = Sprite.Create(item, new Rect(0f, 0f, (float)((Texture)item).width, (float)((Texture)item).height), new Vector2(0.5f, 0.5f)); } } private static void GlitchOutBolt(GameObject bolt) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) AudioController.Instance.PlaySound3D("factory_chest_open", (MixerGroup)4, bolt.transform.position, 1f, 0f, new Pitch((Variation)1), (Repetition)null, (Randomization)null, (Distortion)null, false).spatialBlend = 0.25f; GlitchOutAssetEffect.TryLoad3DMaterial(); Renderer[] componentsInChildren = bolt.GetComponentsInChildren<Renderer>(); foreach (Renderer obj in componentsInChildren) { obj.material = GlitchOutAssetEffect.glitch3DMaterial; obj.material.SetColor("_ASEOutlineColor", Color.white); } Tween.Shake(bolt.transform, bolt.transform.localPosition, Vector3.one * 0.2f, 0.1f, 0f, (LoopType)1, (Action)null, (Action)null, false); CustomCoroutine.WaitThenExecute(0.2f, (Action)delegate { if ((Object)(object)bolt != (Object)null) { Object.Destroy((Object)(object)bolt.gameObject); } }, false); } [HarmonyPatch(typeof(ResourcesManager), "ShowAddBones")] [HarmonyPostfix] private static IEnumerator ShowAddBones_Act3(IEnumerator sequence, int amount, CardSlot slot) { PatchPlugin.Logger.LogDebug((object)$"Adding {amount} bones"); if ((Object)(object)BonesTVScreen != (Object)null && amount > 0) { int oldBones = Singleton<ResourcesManager>.Instance.PlayerBones - amount; for (int i = oldBones; i < oldBones + amount; i++) { if ((Object)(object)slot != (Object)null) { GameObject bolt = WeightUtil.SpawnWeight(((Component)slot).transform, ((Component)slot).transform.position + Vector3.up, false, (GameObject)null); CustomCoroutine.WaitThenExecute(1.25f, (Action)delegate { GlitchOutBolt(bolt); }, false); yield return (object)new WaitForSeconds(0.1f); AudioController.Instance.PlaySound3D((Random.value > 0.5f) ? "metal_drop#3" : "metal_object_short#2", (MixerGroup)4, ((Component)slot).transform.position, 1f, 0f, new Pitch((Variation)1), (Repetition)null, (Randomization)null, (Distortion)null, false); } DisplayBones(i); if ((Object)(object)slot == (Object)null) { AudioController.Instance.PlaySound3D("factory_chest_open", (MixerGroup)4, BonesTVScreen.transform.position, 1f, 0f, new Pitch(0.95f + (float)i * 0.01f), (Repetition)null, (Randomization)null, (Distortion)null, false).spatialBlend = 0.25f; } yield return (object)new WaitForSeconds(0.05f); } DisplayBones(Singleton<ResourcesManager>.Instance.PlayerBones); } else { yield return sequence; } } [HarmonyPatch(typeof(ResourcesManager), "ShowSpendBones")] [HarmonyPostfix] private static IEnumerator ShowSpendBones_Act3(IEnumerator sequence, int amount) { PatchPlugin.Logger.LogDebug((object)$"Spending {amount} bones"); if ((Object)(object)BonesTVScreen != (Object)null && amount > 0) { int visualizedDrop = Mathf.Min(20, amount); int oldBones = Singleton<ResourcesManager>.Instance.PlayerBones + amount; for (int i = oldBones; i > oldBones - visualizedDrop; i--) { DisplayBones(i); AudioController.Instance.PlaySound3D("factory_chest_open", (MixerGroup)4, BonesTVScreen.transform.position, 0.6f, 0f, new Pitch(0.95f + (float)i * 0.01f), (Repetition)null, (Randomization)null, (Distortion)null, false).spatialBlend = 0.25f; yield return (object)new WaitForSeconds(0.05f); } DisplayBones(Singleton<ResourcesManager>.Instance.PlayerBones); } else { yield return sequence; } } [HarmonyPatch(typeof(ResourceDrone), "Awake")] [HarmonyPostfix] private static void AttachBonesTVScreen(ref ResourceDrone __instance) { //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) if (SceneCanHaveBonesDisplayer && DisplayAct3Bones) { BonesTVScreen = Object.Instantiate<GameObject>(((Component)Singleton<SpecialNodeHandler>.Instance.buildACardSequencer.screen).gameObject, ((Component)__instance).gameObject.transform.Find("Anim")); Object.Destroy((Object)(object)((Component)BonesTVScreen.transform.Find("Anim/ScreenInteractables")).gameObject); Object.Destroy((Object)(object)((Component)BonesTVScreen.transform.Find("RenderCamera/Content/BuildACardInterface")).gameObject); ((Component)BonesTVScreen.transform.Find("Anim/CableStart_1")).gameObject.SetActive(false); ((Component)BonesTVScreen.transform.Find("Anim/CableStart_2")).gameObject.SetActive(false); ((Component)BonesTVScreen.transform.Find("Anim/CableStart_3")).gameObject.SetActive(false); BonesTVScreen.transform.localScale = new Vector3(0.3f, 0.2f, 0.2f); BonesTVScreen.transform.localPosition = new Vector3(0.6f, 0.2f, -1.8f); BonesTVScreen.transform.localEulerAngles = new Vector3(270f, 180f, 0f); Renderer component = ((Component)BonesTVScreen.transform.Find("Anim/BasicScreen/Frame")).gameObject.GetComponent<Renderer>(); component.material.EnableKeyword("_EMISSION"); component.material.SetColor("_EmissionColor", new Color(0f, 0.085f, 0.085f, 1f)); Renderer component2 = ((Component)BonesTVScreen.transform.Find("Anim/Pole")).gameObject.GetComponent<Renderer>(); component2.material.EnableKeyword("_EMISSION"); component2.material.SetColor("_EmissionColor", new Color(0f, 0.1f, 0.1f, 1f)); component2.material.SetTexture("_EmissionMap", (Texture)(object)Texture2D.whiteTexture); BonesTVScreen.SetActive(true); ((Object)BonesTVScreen).name = "Module-Bones"; GameObject val = new GameObject("BoneCounter") { layer = LayerMask.NameToLayer("CardOffscreen") }; val.transform.SetParent(BonesTVScreen.transform.Find("RenderCamera/Content")); val.transform.localPosition = new Vector3(-5f, -2.78f, 7.0601f); val.transform.localEulerAngles = new Vector3(0f, 0f, 0f); val.transform.localScale = new Vector3(18f, 33f, 10f); BonesCountRenderer = val.AddComponent<SpriteRenderer>(); ((Renderer)BonesCountRenderer).SetMaterial(Resources.Load<Material>("art/materials/sprite_coloroverlay")); ((Renderer)BonesCountRenderer).material.SetColor("_Color", GameColors.Instance.brightBlue * 0.85f); ((Renderer)BonesCountRenderer).material.EnableKeyword("_EMISSION"); ((Renderer)BonesCountRenderer).material.SetColor("_EmissionColor", Color.white); OLDTVScreen componentInChildren = BonesTVScreen.GetComponentInChildren<OLDTVScreen>(); componentInChildren.chromaticAberrationMagnetude = 0.1f; componentInChildren.noiseMagnetude = 0.2f; componentInChildren.staticMagnetude = 0.2f; componentInChildren.staticVertical = 15f; componentInChildren.staticVerticalScroll = 0.1f; componentInChildren.screenSaturation = 0f; OLDTVTube componentInChildren2 = BonesTVScreen.GetComponentInChildren<OLDTVTube>(); componentInChildren2.radialDistortion = 0.6f; componentInChildren2.reflexMagnetude = 0.2f; ((Component)BonesTVScreen.transform.Find("RenderCamera")).transform.position = new Vector3(0f, -30f, -30f); DisplayBones(0); val.SetActive(true); } } [HarmonyPatch(typeof(Part3ResourcesManager), "CleanUp")] [HarmonyPrefix] private static void CleanUpPart3Bones(Part3ResourcesManager __instance) { ((ResourcesManager)__instance).PlayerBones = 0; DisplayBones(0); } } } namespace InscryptionCommunityPatch.PixelTutor { [HarmonyPatch] public static class Act2TutorFix { private static bool HasComponent; [HarmonyPatch(typeof(BoardManager), "Initialize")] [HarmonyPostfix] private static void AddPixelSelectableArray(BoardManager __instance) { if (SaveManager.SaveFile.IsPart2 && (Object)(object)((Component)__instance).GetComponent<PixelPlayableCardArray>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<PixelPlayableCardArray>(); HasComponent = true; } } [HarmonyPrefix] [HarmonyPatch(typeof(PixelPlayableCard), "ManagedUpdate")] private static bool DisableManagedUpdateForSelection(PixelPlayableCard __instance) { if (HasComponent && !((PlayableCard)__instance).OnBoard) { return ((PlayableCard)__instance).InHand; } return true; } [HarmonyPatch(typeof(PlayableCard), "OnCursorSelectStart")] [HarmonyPrefix] private static bool AddSelectedCardToHand(PlayableCard __instance) { PixelPlayableCard val = (PixelPlayableCard)(object)((__instance is PixelPlayableCard) ? __instance : null); if (val == null || __instance.OnBoard || __instance.InHand || !HasComponent) { return true; } PixelPlayableCardArray component = ((Component)Singleton<BoardManager>.Instance).GetComponent<PixelPlayableCardArray>(); if (component.displayedCards.Contains(val)) { component.selectedCard = val; } return false; } [HarmonyPatch(typeof(Tutor), "OnResolveOnBoard")] [HarmonyPostfix] private static IEnumerator AddStartDelay(IEnumerator enumerator, Tutor __instance) { if (SaveManager.SaveFile.IsPart2) { yield return (object)new WaitForSeconds(0.15f); if (((AbilityBehaviour)__instance).Card.OpponentCard || Singleton<CardDrawPiles>.Instance.Deck.Cards.Count == 0) { PlayableCard card = ((AbilityBehaviour)__instance).Card; ((Card)((card is PixelPlayableCard) ? card : null)).Anim.NegationEffect(false); yield return (object)new WaitForSeconds(0.25f); yield break; } } yield return enumerator; } [HarmonyPatch(typeof(Deck), "Tutor")] [HarmonyPostfix] private static IEnumerator PixelTutorSequence(IEnumerator enumerator, Deck __instance) { if (!SaveManager.SaveFile.IsPart2) { yield return enumerator; yield break; } if ((Object)(object)((Component)Singleton<BoardManager>.Instance).GetComponent<PixelPlayableCardArray>() == (Object)null) { yield return ((CardDrawPiles)Singleton<PixelCardDrawPiles>.Instance).ChooseDraw(0); yield break; } CardInfo selectedCard = null; yield return ChoosePixelCard(__instance, delegate(CardInfo c) { selectedCard = c; }); if (!((Object)(object)selectedCard == (Object)null)) { yield return Singleton<CardSpawner>.Instance.SpawnCardToHand(selectedCard, 0.25f); } } public static IEnumerator ChoosePixelCard(Deck instance, Action<CardInfo> cardSelectedCallback) { PixelPlayableCard selectedCard = null; yield return ((Component)Singleton<BoardManager>.Instance).GetComponent<PixelPlayableCardArray>().SelectPixelCardFrom(instance.cards, delegate(PixelPlayableCard x) { selectedCard = x; }); Tween.Position(((Component)selectedCard).transform, ((Component)selectedCard).transform.position + Vector3.back * 4f, 0.1f, 0f, Tween.EaseIn, (LoopType)0, (Action)null, (Action)null, true); Object.Destroy((Object)(object)((Component)selectedCard).gameObject, 0.1f); cardSelectedCallback(((Card)selectedCard).Info); } } public class PixelPlayableCardArray : ManagedBehaviour { public PixelPlayableCard selectedCard; public readonly List<PixelPlayableCard> displayedCards = new List<PixelPlayableCard>(); private PixelPlayableCard gameObjectReference; private GameObject overlay; private GenericUIButton forwardButton; private GenericUIButton backButton; private readonly int maxRows = 6; private readonly int maxCardsPerRow = 7; private readonly float leftAnchor = -1.75f; private readonly float centreAnchor = -0.52f; private readonly float tweenDurationModifier = 0.5f; private Vector3 offscreenPositionOffset = new Vector3(2f, 2f, -4f); private int numPages; private int currentPageIndex; private GamepadGridControl gamepadGrid; public IEnumerator DisplayUntilCancelled(List<CardInfo> cards, Func<bool> cancelCondition, Action cardsPlacedCallback = null) { cards.RemoveAll((CardInfo x) => (Object)(object)x == (Object)null); currentPageIndex = 0; numPages = 1 + (cards.Count - 1) / (maxCardsPerRow * maxRows); InitializeGamepadGrid(); yield return SpawnAndPlaceCards(cards, GetNumRows(cards.Count), 0, isDeckReview: true); InitialiseButtons(cards, deckReview: true, forPositiveEffect: true); cardsPlacedCallback?.Invoke(); SetCardsEnabled(enabled: true); if (numPages > 1) { ((Component)forwardButton).gameObject.SetActive(true); ((Component)backButton).gameObject.SetActive(true); EnableButtons(enable: true); } yield return (object)new WaitUntil((Func<bool>)(() => cancelCondition())); SetCardsEnabled(enabled: false); yield return CleanUpCards(); CleanUpButtons(); } public IEnumerator SelectPixelCardFrom(List<CardInfo> cards, Action<PixelPlayableCard> cardSelectedCallback, Func<bool> cancelCondition = null, bool forPositiveEffect = true) { cards.RemoveAll((CardInfo x) => (Object)(object)x == (Object)null); currentPageIndex = 0; numPages = 1 + (cards.Count - 1) / (maxCardsPerRow * maxRows); if (cards.Count == 0) { yield break; } if ((Object)(object)gameObjectReference == (Object)null) { PixelPlayableCard[] array = Resources.FindObjectsOfTypeAll<PixelPlayableCard>(); LinqExtensions.Sort<PixelPlayableCard>((IList<PixelPlayableCard>)array, (Comparison<PixelPlayableCard>)((PixelPlayableCard a, PixelPlayableCard b) => ((Card)a).Anim.cardRenderer.sortingGroupOrder - ((Card)b).Anim.cardRenderer.sortingGroupOrder)); gameObjectReference = Object.Instantiate<PixelPlayableCard>(array[0], ((Component)this).transform); ((Object)gameObjectReference).name = "TutorCardObjRef"; ((Component)gameObjectReference).transform.localPosition = new Vector3(-100f, -100f, 0f); Quaternion rotation = ((Component)gameObjectReference).transform.rotation; ((Quaternion)(ref rotation)).Set(0f, 0f, 0f, 0f); } if ((Object)(object)overlay == (Object)null) { GameObject val = GameObjectExtensions.FindChild(PauseMenu.instance.menuParent, "GameFade"); overlay = Object.Instantiate<GameObject>(val, ((Component)this).transform); ((Object)overlay).name = "TutorUIFade"; SpriteRenderer component = overlay.GetComponent<SpriteRenderer>(); ((Renderer)component).sortingLayerID = ((Card)gameObjectReference).Anim.cardRenderer.sortingLayerID; ((Renderer)component).sortingLayerName = ((Card)gameObjectReference).Anim.cardRenderer.sortingLayerName; ((Renderer)component).sortingGroupID = ((Card)gameObjectReference).Anim.cardRenderer.sortingGroupID; ((Renderer)component).sortingOrder = -7000; } InitializeGamepadGrid(); yield return SpawnAndPlaceCards(cards, GetNumRows(cards.Count), 0, isDeckReview: false, forPositiveEffect); InitialiseButtons(cards, deckReview: false, forPositiveEffect); yield return (object)new WaitForSeconds(0.15f); SetCardsEnabled(enabled: true); if (numPages > 1) { ((Component)forwardButton).gameObject.SetActive(true); ((Component)backButton).gameObject.SetActive(true); EnableButtons(enable: true); } selectedCard = null; yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)selectedCard != (Object)null || (cancelCondition != null && cancelCondition()))); SetCardsEnabled(enabled: false); if ((Object)(object)selectedCard != (Object)null) { displayedCards.Remove(selectedCard); } yield return CleanUpCards(); CleanUpButtons(); forwardButton = (backButton = null); if ((Object)(object)selectedCard != (Object)null) { cards.Remove(((Card)selectedCard).Info); cardSelectedCallback?.Invoke(selectedCard); } } private void InitialiseButtons(List<CardInfo> cards, bool deckReview, bool forPositiveEffect) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0121: 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) //IL_0240: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)forwardButton == (Object)null) { forwardButton = Object.Instantiate<GenericUIButton>(Singleton<HammerButton>.Instance.button, ((Component)this).transform); ((Object)forwardButton).name = "TutorForwardButton"; forwardButton.cursorType = (CursorType)12; forwardButton.defaultSprite = TextureHelper.GetImageAsSprite("forwardButton.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); forwardButton.hoveringSprite = TextureHelper.GetImageAsSprite("forwardButton_hover.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); forwardButton.disabledSprite = TextureHelper.GetImageAsSprite("forwardButton_disabled.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); forwardButton.downSprite = TextureHelper.GetImageAsSprite("forwardButton_down.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); ((Component)forwardButton).transform.position = new Vector3(1.25f, -0.75f, 0f); GenericUIButton obj = forwardButton; ((MainInputInteractable)obj).CursorSelectStarted = (Action<MainInputInteractable>)Delegate.Combine(((MainInputInteractable)obj).CursorSelectStarted, (Action<MainInputInteractable>)delegate { OnChangePage(forwards: true, cards, deckReview, forPositiveEffect); }); backButton = Object.Instantiate<GenericUIButton>(Singleton<HammerButton>.Instance.button, ((Component)this).transform); ((Object)backButton).name = "TutorBackButton"; backButton.cursorType = (CursorType)11; backButton.defaultSprite = TextureHelper.GetImageAsSprite("backButton.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); backButton.hoveringSprite = TextureHelper.GetImageAsSprite("backButton_hover.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); backButton.disabledSprite = TextureHelper.GetImageAsSprite("backButton_disabled.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); backButton.downSprite = TextureHelper.GetImageAsSprite("backButton_down.png", typeof(PixelPlayableCardArray).Assembly, (SpriteType)12, (FilterMode)0); ((Component)backButton).transform.position = new Vector3(1.25f, -1f, 0f); GenericUIButton obj2 = backButton; ((MainInputInteractable)obj2).CursorSelectStarted = (Action<MainInputInteractable>)Delegate.Combine(((MainInputInteractable)obj2).CursorSelectStarted, (Action<MainInputInteractable>)delegate { OnChangePage(forwards: false, cards, deckReview, forPositiveEffect); }); } ((Component)forwardButton).gameObject.SetActive(false); ((Component)backButton).gameObject.SetActive(false); EnableButtons(enable: false); } private void CleanUpButtons() { if (((Component)forwardButton).gameObject.active) { ((Component)forwardButton).gameObject.SetActive(false); ((Component)backButton).gameObject.SetActive(false); } } private void EnableButtons(bool enable) { ((InteractableBase)forwardButton).SetEnabled(enable); ((InteractableBase)backButton).SetEnabled(enable); } private void OnChangePage(bool forwards, List<CardInfo> cards, bool deckReview, bool forPositiveEffect) { EnableButtons(enable: false); SetCardsEnabled(enabled: false); ((MonoBehaviour)this).StartCoroutine(ChangePage(forwards, cards, deckReview, forPositiveEffect)); } private IEnumerator ChangePage(bool forwards, List<CardInfo> cards, bool deckReview, bool forPositiveEffect) { yield return CleanUpCards(); if (forwards) { currentPageIndex = ((currentPageIndex + 1 < numPages) ? (currentPageIndex + 1) : 0); } else { currentPageIndex = ((currentPageIndex - 1 < 0) ? (numPages - 1) : (currentPageIndex - 1)); } yield return SpawnAndPlaceCards(cards, GetNumRows(cards.Count), currentPageIndex, deckReview, forPositiveEffect); SetCardsEnabled(enabled: true); EnableButtons(enable: true); } protected Vector3 GetCardPosition(int cardIndex, int cardsToPlace, int numRows, int cardsPerRow) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.FloorToInt((float)(cardIndex / cardsPerRow)); float xPos = GetXPos(cardIndex, num, cardsToPlace, cardsPerRow); float num2 = Mathf.Max(-0.801f, 0.451f - (8.5f - (float)numRows) * 0.1f * (float)num); float num3 = 0f + 0.01f * (float)num; return new Vector3(xPos, num2, num3); } private float GetXPos(int cardIndex, int cardRowIndex, int cardsToPlace, int cardsPerRow) { float num = 0.41f; float num2 = leftAnchor; int num3 = cardsPerRow * cardRowIndex; int num4 = cardsToPlace - cardsPerRow * cardRowIndex; float num5 = cardIndex - num3; if (PatchPlugin.act2TutorCenterRows.Value && num4 > 0 && num4 < cardsPerRow) { num2 = centreAnchor; num5 = (float)(cardIndex - num3) - (float)(num4 - 1) / 2f; } return num2 + num * num5; } protected IEnumerator CleanUpCards() { List<PixelPlayableCard> list = new List<PixelPlayableCard>(displayedCards); foreach (PixelPlayableCard item in list) { if ((Object)(object)item != (Object)null) { Tween.Position(((Component)item).transform, ((Component)item).transform.position + offscreenPositionOffset, 0.1f, 0f, Tween.EaseIn, (LoopType)0, (Action)null, (Action)null, true); ((Card)item).Anim.PlayQuickRiffleSound(); Object.Destroy((Object)(object)((Component)item).gameObject, 0.1f); yield return (object)new WaitForSeconds(CardPile.GetPauseBetweenCardTime(displayedCards.Count) * tweenDurationModifier * 0.5f); } } yield return (object)new WaitForSeconds(0.1f); SetOverlayEnabled(enabled: false); SetBoardEnabled(enabled: true); } protected IEnumerator SpawnAndPlaceCards(List<CardInfo> cards, int numRows, int pageIndex, bool isDeckReview = false, bool forPositiveEffect = true) { SetOverlayEnabled(enabled: true); SetBoardEnabled(enabled: false); displayedCards.ForEach(delegate(PixelPlayableCard x) { if ((Object)(object)x != (Object)null) { Object.Destroy((Object)(object)((Component)x).gameObject); } }); displayedCards.Clear(); if (numRows <= 0) { PatchPlugin.Logger.LogDebug((object)"NumRows for PixelPlayableCardArray is 0, displaying no cards"); yield break; } int num = maxRows * maxCardsPerRow; int startingIndex = num * pageIndex; int cardsPerRow = Mathf.Min(maxCardsPerRow, cards.Count / numRows); int cardsToPlace = Mathf.Min(num, cards.Count - startingIndex); for (int i = startingIndex; i < startingIndex + cardsToPlace; i++) { Vector3 cardPosition = GetCardPosition(i - startingIndex, cardsToPlace, numRows, cardsPerRow); PixelPlayableCard val = CreateAndPlaceCard(cards[i], cardPosition); if ((Object)(object)val == (Object)null) { break; } yield return TriggerSpecialBehaviours(val, isDeckReview, forPositiveEffect); yield return (object)new WaitForSeconds(CardPile.GetPauseBetweenCardTime(cards.Count) * tweenDurationModifier); } } protected void TweenInCard(Transform cardTransform, Vector3 cardPos) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) cardTransform.localPosition = cardPos; Vector3 position = cardTransform.position; Vector3 val2 = (cardTransform.position = position + offscreenPositionOffset); Tween.Position(cardTransform, position, 0.15f, 0f, Tween.EaseOut, (LoopType)0, (Action)null, (Action)null, true); } private void InitializeGamepadGrid() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown if ((Object)(object)gamepadGrid == (Object)null) { gamepadGrid = ((Component)this).gameObject.AddComponent<GamepadGridControl>(); gamepadGrid.Rows = new List<Row>(); } gamepadGrid.Rows.Clear(); for (int i = 0; i < maxRows + 1; i++) { gamepadGrid.Rows.Add(new Row(Array.Empty<InteractableBase>())); } ((Behaviour)gamepadGrid).enabled = false; ((Behaviour)gamepadGrid).enabled = true; } private PixelPlayableCard CreateAndPlaceCard(CardInfo info, Vector3 cardPos) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) PixelPlayableCard val = Object.Instantiate<PixelPlayableCard>(gameObjectReference, ((Component)this).transform); CardAnimationController anim = ((Card)val).Anim; CardAnimationController obj = ((anim is PixelCardAnimationController) ? anim : null); obj.cardRenderer.sortingGroupID = ((Card)gameObjectReference).Anim.cardRenderer.sortingGroupID; ((Renderer)((PixelCardAnimationController)obj).cardbackRenderer).sortingGroupID = ((Card)gameObjectReference).Anim.cardRenderer.sortingGroupID; obj.cardRenderer.sortingOrder = -9000; ((Renderer)((PixelCardAnimationController)obj).cardbackRenderer).sortingOrder = -8000; ((Card)val).SetFaceDown(false, true); ((Card)val).SetInfo(info); ((InteractableBase)val).SetEnabled(false); ((Component)val).transform.position = Vector3.zeroVector; gamepadGrid.Rows[0].interactables.Add((InteractableBase)(object)val); displayedCards.Add(val); TweenInCard(((Component)val).transform, cardPos); ((Card)val).Anim.PlayQuickRiffleSound(); return val; } private IEnumerator TriggerSpecialBehaviours(PixelPlayableCard card, bool isDeckReview, bool forPositiveEffect) { SpecialCardBehaviour[] components = ((Component)card).GetComponents<SpecialCardBehaviour>(); SpecialCardBehaviour[] array = components; foreach (SpecialCardBehaviour val in array) { if (isDeckReview) { val.OnShownInDeckReview(); } else { yield return val.OnShownForCardSelect(forPositiveEffect); } } } private void SetOverlayEnabled(bool enabled) { bool flag = false; while (overlay.activeSelf != enabled) { overlay.SetActive(flag); flag = !flag; } } private int GetNumRows(int numCards) { return Mathf.Min(maxRows, numCards / maxCardsPerRow); } private void SetCardsEnabled(bool enabled) { displayedCards.ForEach(delegate(PixelPlayableCard x) { ((InteractableBase)x).SetEnabled(enabled); }); } private void SetBoardEnabled(bool enabled) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) IEnumerable<PixelPlayableCard> enumerable = Singleton<BoardManager>.Instance.CardsOnBoard.Concat(Singleton<TurnManager>.Instance.Opponent.queuedCards).Concat(Singleton<PlayerHand>.Instance.CardsInHand).Cast<PixelPlayableCard>(); IEnumerable<HighlightedInteractable> enumerable2 = ((IEnumerable<HighlightedInteractable>)Singleton<BoardManager>.Instance.AllSlots).Concat(Singleton<BoardManager>.Instance.OpponentQueueSlots).Cast<HighlightedInteractable>(); PixelCombatBell val = (PixelCombatBell)Resources.FindObjectsOfTypeAll(typeof(PixelCombatBell)).FirstOrDefault(); if ((int)val != 0) { ((InteractableBase)val).SetEnabled(enabled); } ((Component)Singleton<HammerButton>.Instance).gameObject.SetActive(enabled); foreach (HighlightedInteractable item in enumerable2) { ((InteractableBase)item).SetEnabled(enabled); item.ShowState((State)(enabled ? 2 : 0), false, 0.15f); } foreach (PixelPlayableCard item2 in enumerable) { ((Component)item2).gameObject.SetActive(enabled); } Singleton<TurnManager>.Instance.PlayerCanInitiateCombat = enabled; } } } namespace InscryptionCommunityPatch.Card { [HarmonyPatch] internal class Act2HideStatsPatch { [HarmonyPostfix] [HarmonyPatch(typeof(PixelCardDisplayer), "DisplayInfo")] private static void HideAttackAndHealth(PixelCardDisplayer __instance) { if ((((CardDisplayer)(__instance?)).info?.hideAttackAndHealth).GetValueOrDefault()) { ((CardDisplayer)__instance).SetAttackHidden(true); ((CardDisplayer)__instance).SetHealthHidden(true); } } } [HarmonyPatch] internal class Act2LogSpamFixes { [HarmonyPrefix] [HarmonyPatch(typeof(GameFlowManager), "UpdateForTransitionToFirstPerson")] [HarmonyPatch(typeof(ViewManager), "UpdateViewControlsHintsForView")] private static bool DisableInAct2() { return !SaveManager.SaveFile.IsPart2; } [HarmonyPatch(typeof(ConduitCircuitManager), "UpdateCircuits")] [HarmonyPrefix] private static bool RemoveConduitManagerSpam(ConduitCircuitManager __instance) { if (!SaveManager.SaveFile.IsPart2) { return true; } __instance.UpdateCircuitsForSlots(Singleton<BoardManager>.Instance.GetSlots(true)); __instance.UpdateCircuitsForSlots(Singleton<BoardManager>.Instance.GetSlots(false)); return false; } [HarmonyPatch(typeof(PixelActivatedAbilityButton), "ManagedUpdate")] [HarmonyPrefix] private static bool RemovePixelActivatedSpam() { return SceneLoader.ActiveSceneName == "GBC_CardBattle"; } [HarmonyPatch(typeof(TurnManager), "SetupPhase")] [HarmonyPostfix] private static IEnumerator RemoveSetupPhaseSpam(IEnumerator enumerator, TurnManager __instance, EncounterData encounterData) { if ((Object)(object)Singleton<ConduitCircuitManager>.Instance == (Object)null) { ((Component)Singleton<BoardManager>.Instance).gameObject.AddComponent<ConduitCircuitManager>(); } if (!SaveManager.SaveFile.IsPart2) { yield return enumerator; yield break; } __instance.IsSetupPhase = true; Singleton<PlayerHand>.Instance.PlayingLocked = true; if ((Object)(object)__instance.SpecialSequencer != (Object)null) { yield return __instance.SpecialSequencer.PreBoardSetup(); } yield return (object)new WaitForSeconds(0.15f); yield return Singleton<LifeManager>.Instance.Initialize((Object)(object)__instance.SpecialSequencer == (Object)null || __instance.SpecialSequencer.ShowScalesOnStart); ((MonoBehaviour)__instance).StartCoroutine(Singleton<BoardManager>.Instance.Initialize()); ((MonoBehaviour)__instance).StartCoroutine(Singleton<ResourcesManager>.Instance.Setup()); yield return (object)new WaitForSeconds(0.2f); yield return __instance.opponent.IntroSequence(encounterData); ((MonoBehaviour)__instance).StartCoroutine(__instance.PlacePreSetCards(encounterData)); if ((Object)(object)__instance.SpecialSequencer != (Object)null) { yield return __instance.SpecialSequencer.PreDeckSetup(); } Singleton<PlayerHand>.Instance.Initialize(); yield return Singleton<CardDrawPiles>.Instance.Initialize(); if ((Object)(object)__instance.SpecialSequencer != (Object)null) { yield return __instance.SpecialSequencer.PreHandDraw(); } yield return Singleton<CardDrawPiles>.Instance.DrawOpeningHand(__instance.GetFixedHand()); if (__instance.opponent.QueueFirstCardBeforePlayer) { yield return __instance.opponent.QueueNewCards(true, false); } __instance.IsSetupPhase = false; } [HarmonyPatch(typeof(TurnManager), "CleanupPhase")] [HarmonyPostfix] private static IEnumerator RemoveAct2CleanupPhaseSpam(IEnumerator enumerator, TurnManager __instance) { if (!SaveManager.SaveFile.IsPart2) { yield return enumerator; yield break; } __instance.PlayerWon = __instance.PlayerIsWinner(); __instance.GameEnding = true; if (!__instance.PlayerWon && (Object)(object)__instance.opponent != (Object)null && (Object)(object)__instance.opponent.Blueprint != (Object)null) { AnalyticsManager.SendFailedEncounterEvent(__instance.opponent.Blueprint, __instance.opponent.Difficulty, __instance.TurnNumber); } if ((Object)(object)__instance.SpecialSequencer != (Object)null) { yield return __instance.SpecialSequencer.PreCleanUp(); } Singleton<ViewManager>.Instance.Controller.LockState = (ViewLockState)1; if (__instance.PlayerWon && __instance.PostBattleSpecialNode == null) { Singleton<ViewManager>.Instance.SwitchToView((View)12, false, false); } else { Singleton<ViewManager>.Instance.SwitchToView((View)1, false, false); } yield return (object)new WaitForSeconds(0.1f); ((MonoBehaviour)__instance).StartCoroutine(Singleton<PlayerHand>.Instance.CleanUp()); ((MonoBehaviour)__instance).StartCoroutine(Singleton<CardDrawPiles>.Instance.CleanUp()); yield return __instance.opponent.CleanUp(); yield return __instance.opponent.OutroSequence(__instance.PlayerWon); ((MonoBehaviour)__instance).StartCoroutine(Singleton<BoardManager>.Instance.CleanUp()); ((MonoBehaviour)__instance).StartCoroutine(Singleton<ResourcesManager>.Instance.CleanUp()); yield return Singleton<LifeManager>.Instance.CleanUp(); if ((Object)(object)__instance.SpecialSequencer != (Object)null) { yield return __instance.SpecialSequencer.GameEnd(__instance.PlayerWon); } Object.Destroy((Object)(object)((Component)__instance.opponent).gameObject); Singleton<PlayerHand>.Instance.SetShown(false, false); Object.Destroy((Object)(object)__instance.SpecialSequencer); } [HarmonyPatch(typeof(PlayerHand), "SelectSlotForCard")] [HarmonyPostfix] private static IEnumerator FixSelectSlotSpamInAct2(IEnumerator enumerator, PlayerHand __instance, PlayableCard card) { if (!SaveManager.SaveFile.IsPart2) { yield return enumerator; yield break; } __instance.CardsInHand.ForEach(delegate(PlayableCard x) { ((InteractableBase)x).SetEnabled(false); }); yield return (object)new WaitWhile((Func<bool>)(() => __instance.ChoosingSlot)); __instance.OnSelectSlotStartedForCard(card); Singleton<BoardManager>.Instance.CancelledSacrifice = false; __instance.choosingSlotCard = card; if ((Object)(object)card != (Object)null && (Object)(object)((Card)card).Anim != (Object)null) { ((Card)card).Anim.SetSelectedToPlay(true); } Singleton<BoardManager>.Instance.ShowCardNearBoard(card, true); if ((Object)(object)Singleton<TurnManager>.Instance.SpecialSequencer != (Object)null) { yield return Singleton<TurnManager>.Instance.SpecialSequencer.CardSelectedFromHand(card); } bool cardWasPlayed = false; bool requiresSacrifices = ((Card)card).Info.BloodCost > 0; if (requiresSacrifices) { List<CardSlot> list = Singleton<BoardManager>.Instance.PlayerSlotsCopy.FindAll((CardSlot x) => (Object)(object)x.Card != (Object)null); yield return Singleton<BoardManager>.Instance.ChooseSacrificesForCard(list, card); } if (!Singleton<BoardManager>.Instance.CancelledSacrifice) { List<CardSlot> list2 = Singleton<BoardManager>.Instance.PlayerSlotsCopy.FindAll((CardSlot x) => (Object)(object)x.Card == (Object)null); yield return Singleton<BoardManager>.Instance.ChooseSlot(list2, !requiresSacrifices); CardSlot lastSelectedSlot = Singleton<BoardManager>.Instance.LastSelectedSlot; if ((Object)(object)lastSelectedSlot != (Object)null) { cardWasPlayed = true; ((Card)card).Anim.SetSelectedToPlay(false); yield return __instance.PlayCardOnSlot(card, lastSelectedSlot); if (((Card)card).Info.BonesCost > 0) { yield return Singleton<ResourcesManager>.Instance.SpendBones(((Card)card).Info.BonesCost); } if (card.EnergyCost > 0) { yield return Singleton<ResourcesManager>.Instance.SpendEnergy(card.EnergyCost); } } } if (!cardWasPlayed) { Singleton<BoardManager>.Instance.ShowCardNearBoard(card, false); } __instance.choosingSlotCard = null; if ((Object)(object)card != (Object)null && (Object)(object)((Card)card).Anim != (Object)null) { ((Card)card).Anim.SetSelectedToPlay(false); } __instance.CardsInHand.ForEach(delegate(PlayableCard x) { ((InteractableBase)x).SetEnabled(true); }); } [HarmonyPatch(typeof(LifeManager), "ShowDamageSequence")] [HarmonyPostfix] private static IEnumerator FixSequenceSpamInAct2(IEnumerator enumerator, LifeManager __instance, int damage, int numWeights, bool toPlayer, float waitAfter = 0.125f, GameObject alternateWeightPrefab = null, float waitBeforeCalcDamage = 0f, bool changeView = true) { if (!SaveManager.SaveFile.IsPart2) { yield return enumerator; } else if ((Object)(object)__instance.scales != (Object)null) { if (changeView) { Singleton<ViewManager>.Instance.SwitchToView(__instance.scalesView, false, false); yield return (object)new WaitForSeconds(0.1f); } yield return __instance.scales.AddDamage(damage, numWeights, toPlayer, alternateWeightPrefab); if (waitBeforeCalcDamage > 0f) { yield return (object)new WaitForSeconds(waitBeforeCalcDamage); } if (toPlayer) { __instance.PlayerDamage += damage; } else { __instance.OpponentDamage += damage; } yield return (object)new WaitForSeconds(waitAfter); } } } public class ActivatedAbilityHandler3D : ManagedBehaviour { public List<AbilityIconInteractable> currentIconGroup; public List<ActivatedAbilityIconInteractable> interactables = new List<ActivatedAbilityIconInteractable>(); public void AddInteractable(ActivatedAbilityIconInteractable interactable) { interactables.Add(interactable); } public void UpdateInteractableList(List<AbilityIconInteractable> controllerActiveIcons) { interactables.Clear(); currentIconGroup = controllerActiveIcons; CollectionExtensions.Do<AbilityIconInteractable>(controllerActiveIcons.Where((AbilityIconInteractable elem) => AbilitiesUtil.GetInfo(elem.Ability).activated), (Action<AbilityIconInteractable>)delegate(AbilityIconInteractable abIcon) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) ActivatedAbilityIconInteractable component = ((Component)abIcon).gameObject.GetComponent<ActivatedAbilityIconInteractable>(); if (Object.op_Implicit((Object)(object)component)) { component.AssignAbility(abIcon.Ability); AddInteractable(component); } else { GameObject gameObject = ((Component)abIcon).gameObject; gameObject.layer = 0; ActivatedAbilityIconInteractable activatedAbilityIconInteractable = gameObject.AddComponent<ActivatedAbilityIconInteractable>(); activatedAbilityIconInteractable.AssignAbility(abIcon.Ability); AddInteractable(activatedAbilityIconInteractable); } }); if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)("[Handler3D] Updated interactable list: [" + GeneralExtensions.Join<ActivatedAbilityIconInteractable>((IEnumerable<ActivatedAbilityIconInteractable>)interactables, (Func<ActivatedAbilityIconInteractable, string>)((ActivatedAbilityIconInteractable interactable) => $"GO [{((Component)interactable).gameObject}] Ability [{interactable.Ability}]"), ", ") + "]")); } } private void OnDestroy() { foreach (ActivatedAbilityIconInteractable interactable in interactables) { Object.Destroy((Object)(object)interactable); } } } [HarmonyPatch] public static class ActivatedAbilityIconFix { public static bool HasActivatedAbility(this PlayableCard card) { if (!((Card)card).Info.Abilities.Exists((Ability elem) => AbilitiesUtil.GetInfo(elem).activated)) { return card.temporaryMods.Exists((CardModificationInfo elem) => elem.abilities.Exists((Ability elem2) => AbilitiesUtil.GetInfo(elem2).activated)); } return true; } [HarmonyPostfix] [HarmonyPatch(typeof(ActivatedAbilityBehaviour), "RespondsToResolveOnBoard")] private static void RespondsToResolveOnBoard_PostFix(ref bool __result) { __result &= SaveManager.SaveFile.IsPart2; } [HarmonyPostfix] [HarmonyPatch(typeof(PlayableCard), "OnStatsChanged")] private static void FixActivatedAbilitiesOnAnyChange(ref PlayableCard __instance) { if (SaveManager.SaveFile.IsPart2 || !__instance.HasActivatedAbility()) { return; } ActivatedAbilityHandler3D activatedAbilityHandler3D = ((Component)__instance).GetComponent<ActivatedAbilityHandler3D>(); if (UnityExtensions.SafeIsUnityNull((Object)(object)activatedAbilityHandler3D)) { if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)("[PlayableCard.OnStatsChanged] Adding activated ability handler to card [" + ((Card)__instance).Info.displayedName + "]")); } activatedAbilityHandler3D = ((Component)__instance).gameObject.AddComponent<ActivatedAbilityHandler3D>(); } if (!UnityExtensions.SafeIsUnityNull((Object)(object)activatedAbilityHandler3D) && ((Card)__instance).AbilityIcons.abilityIcons != null) { if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)("[PlayableCard.OnStatsChanged] -> Resetting icon list for [" + ((Card)__instance).Info.displayedName + "]")); } activatedAbilityHandler3D.UpdateInteractableList(((Card)__instance).AbilityIcons.abilityIcons); } } } public class ActivatedAbilityIconInteractable : MainInputInteractable { private Material _renderMaterial; private Color _originalColor; private readonly Color _enterColor = new Color(0.7f, 0.7f, 0.7f, 0.7f); private readonly Color _selectedColor = new Color(0.4f, 0.4f, 0.4f, 0.4f); private PlayableCard _playableCard; private bool CanActivate { get { if (Object.op_Implicit((Object)(object)Singleton<TurnManager>.Instance) && Singleton<TurnManager>.Instance.IsPlayerMainPhase && IsValidPlayableCard && !Singleton<BoardManager>.Instance.ChoosingSacrifices && !Singleton<BoardManager>.Instance.ChoosingSlot) { return Singleton<GlobalTriggerHandler>.Instance.StackSize == 0; } return false; } } private bool IsValidPlayableCard { get { if (Object.op_Implicit((Object)(object)_playableCard) && _playableCard.OnBoard) { return !_playableCard.OpponentCard; } return false; } } public bool AbilityAssigned => (int)Ability > 0; public Ability Ability { get; private set; } private void Start() { _playableCard = ((Component)this).GetComponentInParent<PlayableCard>(); } public void AssignAbility(Ability ability) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (PatchPlugin.configFullDebug.Value) { PatchPlugin.Logger.LogDebug((object)$"Icon was previously {Ability} - asking to change to a {ability}"); } Ability = ability; _renderMaterial = ((Component)this).GetComponent<Renderer>().material; _originalColor = _renderMaterial.color; ((MainInputInteractable)this).CursorSelectEnded = (Action<MainInputInteractable>)Delegate.Combine(((MainInputInteractable)this).CursorSelectEnded, (Action<MainInputInteractable>)delegate { OnButtonPressed(); }); } private void OnButtonPressed() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) if (CanActivate) { ((MonoBehaviour)CustomCoroutine.Instance).StartCoroutine(_playableCard.TriggerHandler.OnTrigger((Trigger)18, new object[1] { Ability })); } } public void SetColor(Color color) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) _renderMaterial.color = color; } public override void OnCursorEnter() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetColor(_enterColor); } public override void OnCursorExit() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetColor(_originalColor); } public override void OnCursorSelectStart() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetColor(_selectedColor); } public override void OnCursorSelectEnd() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetColor(_originalColor); } public override void OnCursorDrag() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) SetColor(_originalColor); } } [HarmonyPatch] internal class RenderAdditionalSigils { private static Vector3 LocalScaleBase3D { get { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (!SaveManager.SaveFile.IsPart1) { return new Vector3(0.3f, 0.3f, 0.75f); } return new Vector3(0.2175f, 0.145f, 1f); } } private static GameObject NewIconGroup(CardAbilityIcons controller, Transform parent, int newSlotNum) { GameObject val = Object.Instantiate<GameObject>(((Component)parent.Find($"DefaultIcons_{newSlotNum - 1}Abilities")).gameObject, parent); ((Object)val).name = $"DefaultIcons_{newSlotNum}Abilities"; controller.defaultIconGroups.Add(val); return val; } private static List<Transform> NewIcons(GameObject newIconGroup, int slotNum, float act1ScaleMult = 1f) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) List<Transform> list = new List<Transform>(); foreach (Transform item2 in newIconGroup.transform) { Transform item = item2; list.Add(item); } GameObject val = Object.Instantiate<GameObject>(((Component)list[0]).gameObject, newIconGroup.transform); ((Object)val).name = (SaveManager.SaveFile.IsPart1 ? "AbilityIcon" : $"Ability_{slotNum}"); list.Add(val.transform); Vector3 localScale = LocalScaleBase3D * (SaveManager.SaveFile.IsPart1 ? act1ScaleMult : 0.65f); foreach (Transform item3 in list) { item3.localScale = localScale; } return list; } private static void AddIconSlotsToCard(Transform abilityIconParent) { if ((Object)(object)abilityIconParent == (Object)null) { return; } CardAbilityIcons component = ((Component)abilityIconParent).gameObject.GetComponent<CardAbilityIcons>(); if (!((Object)(object)component == (Object)null)) { if ((Object)(object)abilityIconParent.Find("DefaultIcons_4Abilities") == (Object)null) { AddQuadrupleIconSlotToCard(component, abilityIconParent); } if ((Object)(object)abilityIconParent.Find("DefaultIcons_5Abilities") == (Object)null) { AddQuintupleIconSlotToCard(component, abilityIconParent); } if ((Object)(object)abilityIconParent.Find("DefaultIcons_6Abilities") == (Object)null) { AddSextupleIconSlotToCard(component, abilityIconParent); } if ((Object)(object)abilityIconParent.Find("DefaultIcons_7Abilities") == (Object)null) { AddSeptupleIconSlotToCard(component, abilityIconParent); } if ((Object)(object)abilityIconParent.Find("DefaultIcons_8Abilities") == (Object)null) { AddOctupleIconSlotToCard(component, abilityIconParent); } } } private static void AddQuadrupleIconSlotToCard(CardAbilityIcons controller, Transform abilityIconParent) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) List<Transform> list = NewIcons(NewIconGroup(controller, abilityIconParent, 4), 4); list[0].localPosition = new Vector3(-0.12f, 0.06f, 0f); list[1].localPosition = new Vector3(0.12f, 0.06f, 0f); list[2].localPosition = new Vector3(-0.12f, -0.077f, 0f); list[3].localPosition = new Vector3(0.12f, -0.077f, 0f); } private static void AddQuintupleIconSlotToCard(CardAbilityIcons controller, Transform abilityIconParent) { //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) List<Transform> list = NewIcons(NewIconGroup(controller, abilityIconParent, 5), 5, 0.75f); if (SaveManager.SaveFile.IsPart1) { list[0].localPosition = new Vector3(-0.17f, 0.06f, 0f); list[1].localPosition = new Vector3(0f, 0.06f, 0f); list[2].localPosition = new Vector3(0.17f, 0.06f, 0f); list[3].localPosition = new Vector3(-0.09f, -0.077f, 0f); list[4].localPosition = new Vector3(0.09f, -0.077f, 0f); } else { list[0].localPosition = new Vector3(-0.42f, 0.085f, 0f); list[1].localPosition = new Vector3(-0.14f, 0.085f, 0f); list[2].localPosition = new Vector3(0.14f, 0.085f, 0f); list[3].localPosition = new Vector3(0.42f, 0.085f, 0f); list[4].localPosition = new Vector3(0f, -0.125f, 0f); } } private static void AddSextupleIconSlotToCard(CardAbilityIcons controller, Transform abilityIconParent) { //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) List<Transform> list = NewIcons(NewIconGroup(controller, abilityIconParent, 6), 6, 0.75f); if (SaveManager.SaveFile.IsPart1) { list[3].localPosition = new Vector3(-0.17f, -0.077f, 0f); list[4].localPosition = new Vector3(0f, -0.077f, 0f); list[5].localPosition = new Vector3(0.17f, -0.077f, 0f); } else { list[4].localPosition = new Vector3(-0.14f, -0.125f, 0f); list[5].localPosition = new Vector3(0.14f, -0.125f, 0f); } } private static void AddSeptupleIconSlotToCard(CardAbilityIcons controller, Transform abilityIconParent) { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references)