using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using DiskCardGame; using HarmonyLib; using InscryptionAPI.Card; using InscryptionAPI.Helpers; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("OldSa_Bones_Armored_sigil")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OldSa_Bones_Armored_sigil")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("26c0943b-8651-422c-bc3a-dd4ee3e65005")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace OLD_SA.BonesArmored; public static class BonesArmoredAPI { public static FullAbility ability; public static void Init() { AbilityInfo val = ScriptableObject.CreateInstance(); ((Object)val).name = "Bones Armored"; val.rulebookName = "Bones Armored"; val.metaCategories = new List { (AbilityMetaCategory)0 }; val.powerLevel = 5; val.opponentUsable = false; val.canStack = false; Texture imageAsTexture = (Texture)(object)TextureHelper.GetImageAsTexture("OldSa_Bones_Armored.png", (FilterMode)0); FieldInfo field = typeof(AbilityInfo).GetField("rulebookDescription", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(val, "When [creature] takes damage, if bones are available, it consumes them to prevent that damage."); } ability = AbilityManager.Add("OLD_SA", val, typeof(BonesArmoredBehaviour), imageAsTexture); } } public class BonesArmoredBehaviour : AbilityBehaviour { public static Ability ability; public override Ability Ability => ability; public override bool RespondsToTakeDamage(PlayableCard source) { if ((Object)(object)((AbilityBehaviour)this).Card == (Object)null) { return false; } if (((AbilityBehaviour)this).Card.Dead) { return false; } if (!((AbilityBehaviour)this).Card.OnBoard) { return false; } if ((Object)(object)source == (Object)null) { return false; } return true; } public override IEnumerator OnTakeDamage(PlayableCard source) { yield return ((AbilityBehaviour)this).PreSuccessfulTriggerSequence(); } } [HarmonyPatch(typeof(PlayableCard), "TakeDamage")] public static class BonesArmoredPatch { private static readonly MethodInfo PreSuccessfulTriggerSequenceMethod = AccessTools.Method(typeof(AbilityBehaviour), "PreSuccessfulTriggerSequence", (Type[])null, (Type[])null); [HarmonyPrefix] public static bool Prefix(PlayableCard __instance, int damage, PlayableCard attacker, ref IEnumerator __result) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null) { return true; } if (!__instance.HasAbility(BonesArmoredAPI.ability.Id)) { return true; } if (__instance.Dead) { return true; } if (damage <= 0) { return true; } int num = damage * 2; if (Singleton.Instance.PlayerBones < num) { return true; } __result = BonesArmoredTakeDamageSequence(__instance, damage, attacker, num); return false; } private static IEnumerator BonesArmoredTakeDamageSequence(PlayableCard card, int damage, PlayableCard attacker, int requiredBones) { if ((Object)(object)card == (Object)null || card.Dead) { yield break; } BonesArmoredBehaviour behaviour = ((Component)card).GetComponent(); if ((Object)(object)behaviour != (Object)null && PreSuccessfulTriggerSequenceMethod != null) { object result = PreSuccessfulTriggerSequenceMethod.Invoke(behaviour, null); if (result is IEnumerator sequence) { while (sequence.MoveNext()) { yield return sequence.Current; } } } if (!((Object)(object)card == (Object)null) && !card.Dead && Singleton.Instance.PlayerBones >= requiredBones) { yield return Singleton.Instance.SpendBones(requiredBones); if (card.Health > 0) { ((Card)card).Anim.PlayHitAnimation(); } card.OnStatsChanged(); ((Card)card).RenderCard(); card.UpdateFaceUpOnBoardEffects(); if ((Object)(object)card.TriggerHandler != (Object)null && card.TriggerHandler.RespondsToTrigger((Trigger)8, new object[1] { attacker })) { yield return card.TriggerHandler.OnTrigger((Trigger)8, new object[1] { attacker }); } } } } [BepInPlugin("OLD_SA.BonesArmored", "OLD SA Bones Armored", "1.0.0")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "OLD_SA.BonesArmored"; public const string PluginName = "OLD SA Bones Armored"; public const string PluginVersion = "1.0.0"; internal static ManualLogSource Log; private void Awake() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"[OLD SA Bones Armored] Plugin loaded."); BonesArmoredAPI.Init(); Log.LogInfo((object)"[OLD SA Bones Armored] Bones Armored registered."); Harmony val = new Harmony("OLD_SA.BonesArmored"); val.PatchAll(); Log.LogInfo((object)"[OLD SA Bones Armored] Harmony patches applied."); Log.LogInfo((object)"[OLD SA Bones Armored] Loaded successfully."); } }