From c98aec83afb4cb5ecd66519945389805064ad473 Mon Sep 17 00:00:00 2001
From: WhistleWind <69230920+HumabHatterZed@users.noreply.github.com>
Date: Tue, 13 Jan 2026 17:28:44 -0800
Subject: [PATCH 1/3] Gated patches to only affect Act 1 due to conflicts
---
.../Card/GiantCardEmissionAspectFix.cs | 2 +-
.../Card/Part1CostEmissionMaskRender.cs | 14 +++++++++-----
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/InscryptionCommunityPatch/Card/GiantCardEmissionAspectFix.cs b/InscryptionCommunityPatch/Card/GiantCardEmissionAspectFix.cs
index 439d514c..eb41d873 100644
--- a/InscryptionCommunityPatch/Card/GiantCardEmissionAspectFix.cs
+++ b/InscryptionCommunityPatch/Card/GiantCardEmissionAspectFix.cs
@@ -14,7 +14,7 @@ internal class GiantCardEmissionAspectFix {
///
[HarmonyPostfix, HarmonyPatch(typeof(CardRenderCamera), nameof(CardRenderCamera.TryCreateCameraForLiveRender))]
private static void FixGiantEmissionCameraAspectRatio(CardRenderCamera __instance, RenderStatsLayer layer) {
- if (!__instance.liveRenderCameras.ContainsKey(layer) || layer is not RenderLiveStatsLayer live || !live.Giant) {
+ if (!SaveManager.SaveFile.IsPart1 || !__instance.liveRenderCameras.ContainsKey(layer) || layer is not RenderLiveStatsLayer live || !live.Giant) {
return;
}
Transform emissionRenderCam = __instance.liveRenderCameras[layer].transform.Find("EmissionRenderCamera");
diff --git a/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs b/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs
index d4149a4c..a1e6d639 100644
--- a/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs
+++ b/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs
@@ -37,15 +37,19 @@ public static SpriteRenderer Verify3DCostEmissionMaskRenderer(CardDisplayer3D ca
[HarmonyPrefix, HarmonyPatch(typeof(CardDisplayer3D), nameof(CardDisplayer3D.Awake))]
private static void AddCostEmissionMaskOnAwake(CardDisplayer3D __instance) {
- Verify3DCostEmissionMaskRenderer(__instance, false);
+ if (SaveManager.SaveFile.IsPart1) {
+ Verify3DCostEmissionMaskRenderer(__instance, false);
+ }
}
[HarmonyPriority(Priority.Last), HarmonyPostfix, HarmonyPatch(typeof(CardDisplayer3D), nameof(CardDisplayer3D.DisplayInfo))]
private static void UpdateCostEmissionMask(CardDisplayer3D __instance) {
- SpriteRenderer rend = Verify3DCostEmissionMaskRenderer(__instance, __instance.emissivePortraitRenderer.gameObject.activeSelf);
- if (rend != null) {
- //PatchPlugin.Logger.LogDebug("[UpdateCostEmissionMask] Update Cost emission mask");
- rend.sprite = __instance.costRenderer.sprite;
+ if (SaveManager.SaveFile.IsPart1) {
+ SpriteRenderer rend = Verify3DCostEmissionMaskRenderer(__instance, __instance.emissivePortraitRenderer.gameObject.activeSelf);
+ if (rend != null) {
+ //PatchPlugin.Logger.LogDebug("[UpdateCostEmissionMask] Update Cost emission mask");
+ rend.sprite = __instance.costRenderer.sprite;
+ }
}
}
}
From a1ebe60278a14785911b05145894ac6474c597ee Mon Sep 17 00:00:00 2001
From: WhistleWind <69230920+HumabHatterZed@users.noreply.github.com>
Date: Tue, 13 Jan 2026 17:29:20 -0800
Subject: [PATCH 2/3] Added extension methods for FullAbility that mirror
AbilityInfo extension methods
---
InscryptionAPI/Card/AbilityExtensions.cs | 361 +++++++++++++++--------
InscryptionAPI/Card/AbilityManager.cs | 3 +
2 files changed, 244 insertions(+), 120 deletions(-)
diff --git a/InscryptionAPI/Card/AbilityExtensions.cs b/InscryptionAPI/Card/AbilityExtensions.cs
index 934b31d2..2cc32cf7 100644
--- a/InscryptionAPI/Card/AbilityExtensions.cs
+++ b/InscryptionAPI/Card/AbilityExtensions.cs
@@ -71,6 +71,15 @@ public static AbilityInfo SetIcon(this AbilityInfo info, Texture2D icon)
return info;
}
+ ///
+ /// Sets the icon texture for the ability.
+ ///
+ /// The ability info to set the texture for.
+ /// A 49x49 texture containing the icon.
+ public static void SetIcon(this FullAbility info, Texture2D icon) {
+ info.Texture = icon;
+ }
+
///
/// Sets the flipped texture for the ability (used when the ability belongs to the opponent).
///
@@ -91,16 +100,6 @@ public static AbilityInfo SetCustomFlippedTexture(this AbilityInfo info, Texture
return info;
}
- ///
- /// Sets the icon texture for the ability.
- ///
- /// The ability info to set the texture for.
- /// A 49x49 texture containing the icon.
- public static void SetIcon(this FullAbility info, Texture2D icon)
- {
- info.Texture = icon;
- }
-
///
/// Sets the flipped texture for the ability (used when the ability belongs to the opponent).
///
@@ -112,82 +111,6 @@ public static void SetCustomFlippedTexture(this FullAbility info, Texture2D icon
info.Info.customFlippedIcon = true;
}
- ///
- /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand.
- ///
- /// The instance of StatIconInfo.
- /// A 49x49 texture containing the icon.
- /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetIcon(this StatIconInfo info, Texture2D icon, FilterMode? filterMode = null)
- {
- info.iconGraphic = icon;
- if (filterMode.HasValue)
- info.iconGraphic.filterMode = filterMode.Value;
- return info;
- }
-
- ///
- /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand.
- ///
- /// The instance of StatIconInfo.
- /// The path to a 49x49 texture containing the icon on disk.
- /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetIcon(this StatIconInfo info, string pathToArt, FilterMode? filterMode = null)
- {
- info.iconGraphic = TextureHelper.GetImageAsTexture(pathToArt);
- if (filterMode.HasValue)
- info.iconGraphic.filterMode = filterMode.Value;
- return info;
- }
-
- ///
- /// Set the StatIconInfo's rulebookName and rulebookDescription. Does not make the stat icon appear in the Rulebook.
- ///
- ///
- ///
- ///
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetRulebookInfo(this StatIconInfo info, string rulebookName, string rulebookDescription = null)
- {
- info.rulebookName = rulebookName;
- info.rulebookDescription = rulebookDescription;
- return info;
- }
- ///
- /// Sets the StatIconInfo's appliesToAttack and appliesToHealth fields. Note these fields don't make the stat icon affect the stat; you still need to implement that logic.
- ///
- ///
- /// If the stat icon should cover a card's Power.
- /// If the stat icon should cover a card's Health.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetAppliesToStats(this StatIconInfo info, bool appliesToAttack, bool appliesToHealth)
- {
- info.appliesToAttack = appliesToAttack;
- info.appliesToHealth = appliesToHealth;
- return info;
- }
-
- ///
- /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand in Act 2.
- ///
- /// The instance of StatIconInfo.
- /// A 16x8 texture containing the icon .
- /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetPixelIcon(this StatIconInfo info, Texture2D icon, FilterMode? filterMode = null)
- {
- info.pixelIconGraphic = TextureHelper.ConvertTexture(icon, TextureHelper.SpriteType.PixelStatIcon, filterMode ?? FilterMode.Point);
- return info;
- }
- public static StatIconInfo SetPixelIcon(this StatIconInfo info, string pathToArt, FilterMode? filterMode = null)
- {
- Texture2D tex = TextureHelper.GetImageAsTexture(pathToArt, filterMode ?? FilterMode.Point);
- info.pixelIconGraphic = TextureHelper.ConvertTexture(tex, TextureHelper.SpriteType.PixelStatIcon);
- return info;
- }
-
///
/// Sets the icon that will be displayed for this ability icon in Act 2.
///
@@ -218,21 +141,6 @@ public static AbilityInfo AddMetaCategories(this AbilityInfo info, params Abilit
return info;
}
- ///
- /// Adds one or more metacategories to the stati icon. Duplicate categories will not be added.
- ///
- /// The instance of StatIconInfo.
- /// The metacategories to add.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo AddMetaCategories(this StatIconInfo info, params AbilityMetaCategory[] categories)
- {
- info.metaCategories ??= new();
- foreach (var app in categories)
- if (!info.metaCategories.Contains(app))
- info.metaCategories.Add(app);
- return info;
- }
-
///
/// Helper method: automatically adds the Part1Modular and Part1Rulebook metacategories to the ability.
///
@@ -243,16 +151,6 @@ public static AbilityInfo SetDefaultPart1Ability(this AbilityInfo info)
return info.AddMetaCategories(AbilityMetaCategory.Part1Modular, AbilityMetaCategory.Part1Rulebook);
}
- ///
- /// Helper method: automatically adds the Part1Rulebook metacategories to the stat icon.
- ///
- /// The instance of StatIconInfo.
- /// The same stati icon so a chain can continue.
- public static StatIconInfo SetDefaultPart1Ability(this StatIconInfo info)
- {
- return info.AddMetaCategories(AbilityMetaCategory.Part1Rulebook);
- }
-
///
/// Helper method: automatically adds the custom metacategory Part2Modular to the ability.
///
@@ -270,15 +168,6 @@ public static AbilityInfo SetDefaultPart3Ability(this AbilityInfo info)
return info.AddMetaCategories(AbilityMetaCategory.Part3Modular, AbilityMetaCategory.Part3Rulebook, AbilityMetaCategory.Part3BuildACard);
}
- ///
- /// Helper method: automatically adds the Part3Rulebook metacategories to the stat icon.
- ///
- /// The instance of StatIconInfo.
- /// The same StatIconInfo so a chain can continue.
- public static StatIconInfo SetDefaultPart3Ability(this StatIconInfo info)
- {
- return info.AddMetaCategories(AbilityMetaCategory.Part3Rulebook);
- }
///
/// Sets the text displayed when this ability is marked as learned.
///
@@ -311,6 +200,7 @@ public static AbilityInfo SetAbilityLearnedDialogue(this AbilityInfo abilityInfo
return abilityInfo;
}
+
///
/// Sets the text displayed whenever OnAbilityTriggered is called by this ability in Act 2.
///
@@ -322,6 +212,17 @@ public static AbilityInfo SetGBCTriggerText(this AbilityInfo abilityInfo, string
abilityInfo.triggerText = triggerText;
return abilityInfo;
}
+ ///
+ /// Sets the text displayed whenever OnAbilityTriggered is called by this ability in Act 2.
+ ///
+ /// The instance of FullAbility.
+ /// The text to display when OnAbilityTriggered is called.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetGBCTriggerText(this FullAbility fullAbility, string triggerText) {
+ fullAbility.Info.triggerText = triggerText;
+ return fullAbility;
+ }
+
///
/// Sets the power level of the ability, used in some game logic like determining the opponent totem's ability.
/// Vanilla power levels range from -3 to 5, and values above or below are ignored in most cases.
@@ -334,16 +235,38 @@ public static AbilityInfo SetPowerlevel(this AbilityInfo abilityInfo, int powerL
abilityInfo.powerLevel = powerLevel;
return abilityInfo;
}
+ ///
+ /// Sets the power level of the ability, used in some game logic like determining the opponent totem's ability.
+ /// Vanilla power levels range from -3 to 5, and values above or below are ignored in most cases.
+ ///
+ /// The instance of FullAbility.
+ /// The ability's power level. Should be equal to or between -3 and 5.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetPowerlevel(this FullAbility fullAbility, int powerLevel) {
+ fullAbility.Info.powerLevel = powerLevel;
+ return fullAbility;
+ }
+
public static AbilityInfo SetRulebookDescription(this AbilityInfo abilityInfo, string description)
{
abilityInfo.rulebookDescription = description;
return abilityInfo;
}
+ public static FullAbility SetRulebookDescription(this FullAbility fullAbility, string description) {
+ fullAbility.Info.rulebookDescription = description;
+ return fullAbility;
+ }
+
public static AbilityInfo SetRulebookName(this AbilityInfo abilityInfo, string name)
{
abilityInfo.rulebookName = name;
return abilityInfo;
}
+ public static FullAbility SetRulebookName(this FullAbility fullAbility, string name) {
+ fullAbility.Info.rulebookName = name;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability is an activated ability.
///
@@ -355,6 +278,17 @@ public static AbilityInfo SetActivated(this AbilityInfo abilityInfo, bool activa
abilityInfo.activated = activated;
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability is an activated ability.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability is activated.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetActivated(this FullAbility fullAbility, bool activated = true) {
+ fullAbility.Info.activated = activated;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability is passive (will not trigger).
///
@@ -366,6 +300,17 @@ public static AbilityInfo SetPassive(this AbilityInfo abilityInfo, bool passive
abilityInfo.passive = passive;
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability is passive (will not trigger).
+ ///
+ /// The instance of FullAbility.
+ /// If the ability is passive.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetPassive(this FullAbility fullAbility, bool passive = true) {
+ fullAbility.Info.passive = passive;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability can be used by the opponent.
///
@@ -377,6 +322,17 @@ public static AbilityInfo SetOpponentUsable(this AbilityInfo abilityInfo, bool o
abilityInfo.opponentUsable = opponentUsable;
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability can be used by the opponent.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability is usable by the opponent.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetOpponentUsable(this FullAbility fullAbility, bool opponentUsable = true) {
+ fullAbility.Info.opponentUsable = opponentUsable;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability is a conduit.
///
@@ -388,6 +344,17 @@ public static AbilityInfo SetConduit(this AbilityInfo abilityInfo, bool conduit
abilityInfo.conduit = conduit;
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability is a conduit.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability is a conduit.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetConduit(this FullAbility fullAbility, bool conduit = true) {
+ fullAbility.Info.conduit = conduit;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability is a conduit cell.
///
@@ -399,6 +366,17 @@ public static AbilityInfo SetConduitCell(this AbilityInfo abilityInfo, bool cond
abilityInfo.conduitCell = conduitCell;
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability is a conduit cell.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability is a conduit cell.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetConduitCell(this FullAbility fullAbility, bool conduitCell = true) {
+ fullAbility.Info.conduitCell = conduitCell;
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability can stack on a card, triggering once for each stack.
/// Optional parameter for setting the ability to only trigger once per stack when a card evolves (only affects abilities that can stack).
@@ -412,6 +390,18 @@ public static AbilityInfo SetCanStack(this AbilityInfo abilityInfo, bool canStac
abilityInfo.SetTriggersOncePerStack(triggersOncePerStack);
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability can stack on a card, triggering once for each stack.
+ /// Optional parameter for setting the ability to only trigger once per stack when a card evolves (only affects abilities that can stack).
+ ///
+ /// The instance of FullAbility.
+ /// Whether or not to prevent double triggering.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetCanStack(this FullAbility fullAbility, bool canStack = true, bool triggersOncePerStack = false) {
+ fullAbility.Info.SetCanStack(canStack, triggersOncePerStack);
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability's icon should be flipped upside-down when it's on an opponent card.
///
@@ -433,6 +423,7 @@ public static FullAbility SetFlipYIfOpponent(this FullAbility fullAbility, bool
fullAbility.Info.SetFlipYIfOpponent(flipY);
return fullAbility;
}
+
///
/// Sets whether or not the ability's icon's colour should be overridden, and what the override colour should be.
/// The colour override only applies to the default ability icons; totem and merge icons are unaffected.
@@ -449,6 +440,20 @@ public static AbilityInfo SetHasColorOverride(this AbilityInfo abilityInfo, bool
return abilityInfo;
}
+
+ ///
+ /// Sets whether or not the ability's icon's colour should be overridden, and what the override colour should be.
+ /// The colour override only applies to the default ability icons; totem and merge icons are unaffected.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability icon's colour should be overridden.
+ /// The colour that will override the icon. Only applies if hasOverride is true.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetHasColorOverride(this FullAbility fullAbility, bool hasOverride, Color colorOverride = default) {
+ fullAbility.Info.SetHasColorOverride(hasOverride, colorOverride);
+ return fullAbility;
+ }
+
///
/// Sets whether or not the ability's name should precede its description in Act 2.
/// If false, only the ability's description will be shown.
@@ -462,6 +467,18 @@ public static AbilityInfo SetKeywordAbility(this AbilityInfo abilityInfo, bool k
return abilityInfo;
}
+ ///
+ /// Sets whether or not the ability's name should precede its description in Act 2.
+ /// If false, only the ability's description will be shown.
+ ///
+ /// The instance of FullAbility.
+ /// If the ability's name should precede its Act 2 description.
+ /// The same FullAbility so a chain can continue.
+ public static FullAbility SetKeywordAbility(this FullAbility fullAbility, bool keyword = true) {
+ fullAbility.Info.keywordAbility = keyword;
+ return fullAbility;
+ }
+
///
/// Resets the AbilityInfo's rulebook description to its vanilla version.
/// Useful for anyone messing with altering descriptions.
@@ -488,6 +505,110 @@ public static bool HasMetaCategory(this AbilityInfo info, AbilityMetaCategory ca
return info.metaCategories.Contains(category);
}
+ #region Stat Icons
+ ///
+ /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand.
+ ///
+ /// The instance of StatIconInfo.
+ /// A 49x49 texture containing the icon.
+ /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetIcon(this StatIconInfo info, Texture2D icon, FilterMode? filterMode = null) {
+ info.iconGraphic = icon;
+ if (filterMode.HasValue)
+ info.iconGraphic.filterMode = filterMode.Value;
+ return info;
+ }
+
+ ///
+ /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand.
+ ///
+ /// The instance of StatIconInfo.
+ /// The path to a 49x49 texture containing the icon on disk.
+ /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetIcon(this StatIconInfo info, string pathToArt, FilterMode? filterMode = null) {
+ info.iconGraphic = TextureHelper.GetImageAsTexture(pathToArt);
+ if (filterMode.HasValue)
+ info.iconGraphic.filterMode = filterMode.Value;
+ return info;
+ }
+
+ ///
+ /// Set the StatIconInfo's rulebookName and rulebookDescription. Does not make the stat icon appear in the Rulebook.
+ ///
+ ///
+ ///
+ ///
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetRulebookInfo(this StatIconInfo info, string rulebookName, string rulebookDescription = null) {
+ info.rulebookName = rulebookName;
+ info.rulebookDescription = rulebookDescription;
+ return info;
+ }
+ ///
+ /// Sets the StatIconInfo's appliesToAttack and appliesToHealth fields. Note these fields don't make the stat icon affect the stat; you still need to implement that logic.
+ ///
+ ///
+ /// If the stat icon should cover a card's Power.
+ /// If the stat icon should cover a card's Health.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetAppliesToStats(this StatIconInfo info, bool appliesToAttack, bool appliesToHealth) {
+ info.appliesToAttack = appliesToAttack;
+ info.appliesToHealth = appliesToHealth;
+ return info;
+ }
+
+ ///
+ /// Sets the icon that will be displayed for this stat icon when the card is in the player's hand in Act 2.
+ ///
+ /// The instance of StatIconInfo.
+ /// A 16x8 texture containing the icon .
+ /// The filter mode for the icon texture. Leave this at its default value unless you have a specific reason to change it.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetPixelIcon(this StatIconInfo info, Texture2D icon, FilterMode? filterMode = null) {
+ info.pixelIconGraphic = TextureHelper.ConvertTexture(icon, TextureHelper.SpriteType.PixelStatIcon, filterMode ?? FilterMode.Point);
+ return info;
+ }
+ public static StatIconInfo SetPixelIcon(this StatIconInfo info, string pathToArt, FilterMode? filterMode = null) {
+ Texture2D tex = TextureHelper.GetImageAsTexture(pathToArt, filterMode ?? FilterMode.Point);
+ info.pixelIconGraphic = TextureHelper.ConvertTexture(tex, TextureHelper.SpriteType.PixelStatIcon);
+ return info;
+ }
+
+ ///
+ /// Adds one or more metacategories to the stati icon. Duplicate categories will not be added.
+ ///
+ /// The instance of StatIconInfo.
+ /// The metacategories to add.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo AddMetaCategories(this StatIconInfo info, params AbilityMetaCategory[] categories) {
+ info.metaCategories ??= new();
+ foreach (var app in categories)
+ if (!info.metaCategories.Contains(app))
+ info.metaCategories.Add(app);
+ return info;
+ }
+
+ ///
+ /// Helper method: automatically adds the Part1Rulebook metacategories to the stat icon.
+ ///
+ /// The instance of StatIconInfo.
+ /// The same stati icon so a chain can continue.
+ public static StatIconInfo SetDefaultPart1Ability(this StatIconInfo info) {
+ return info.AddMetaCategories(AbilityMetaCategory.Part1Rulebook);
+ }
+
+ ///
+ /// Helper method: automatically adds the Part3Rulebook metacategories to the stat icon.
+ ///
+ /// The instance of StatIconInfo.
+ /// The same StatIconInfo so a chain can continue.
+ public static StatIconInfo SetDefaultPart3Ability(this StatIconInfo info) {
+ return info.AddMetaCategories(AbilityMetaCategory.Part3Rulebook);
+ }
+ #endregion
+
#region TriggersOncePerStack
///
/// Sets the ability to only ever trigger once per stack. This prevents abilities from triggering twice per stack after a card evolves.
diff --git a/InscryptionAPI/Card/AbilityManager.cs b/InscryptionAPI/Card/AbilityManager.cs
index 7481d598..c39e0a92 100644
--- a/InscryptionAPI/Card/AbilityManager.cs
+++ b/InscryptionAPI/Card/AbilityManager.cs
@@ -64,6 +64,9 @@ public class FullAbility
///
public Texture CustomFlippedTexture { get; internal set; }
+ ///
+ /// The original rulebook description for the ability, before any modifications.
+ ///
public string BaseRulebookDescription { get; internal set; }
///
From 573b70b2b3840daf7874b4183028880d5f28ccdc Mon Sep 17 00:00:00 2001
From: WhistleWind <69230920+HumabHatterZed@users.noreply.github.com>
Date: Tue, 13 Jan 2026 17:30:32 -0800
Subject: [PATCH 3/3] 2.23.5
---
CHANGELOG.md | 8 ++++++--
InscryptionAPI/InscryptionAPI.csproj | 2 +-
InscryptionAPI/InscryptionAPIPlugin.cs | 2 +-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 791da4a3..0bc43c89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,16 @@
+# 2.23.5
+- Fixed cards appearing as blank outside Act 1
+- Added extension methods for FullAbility that mirror AbilityInfo extension methods
+
# 2.23.4
- Fixed GemsDraw only considering the player's slots when determining how many cards to draw
- Fixed Act 2 Tutor sequence softlocking when there are no cards to display
- Fixed Act 2 Tutor sequence not displaying cards when you have less than 7 cards remaining in your deck
-- Fixed Gemify affecting Blood cost when it shouldn't
+- Fixed Gemify reducing multiple card costs at once for multicost cards - now only affects 1 as intended
- Fixed emission textures appearing stretched on Giant cards
- Added Gems Cost support for ExtendedActivatedAbilityBehaviour class
- Added extension AbilityManager.FullAbility.FlipYIfOpponent
-- Add config option to prevent Act 1 card emissions from rendering above the play costs
+- Added config option to prevent Act 1 card emissions from rendering above the play costs
# 2.23.3
- Fixed custom deck exhaust sequence not performing the requisite checks
diff --git a/InscryptionAPI/InscryptionAPI.csproj b/InscryptionAPI/InscryptionAPI.csproj
index 5a9b03f3..a11afb37 100644
--- a/InscryptionAPI/InscryptionAPI.csproj
+++ b/InscryptionAPI/InscryptionAPI.csproj
@@ -10,7 +10,7 @@
full
false
true
- 2.23.4
+ 2.23.5
diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs
index 7ae842b2..e50389f4 100644
--- a/InscryptionAPI/InscryptionAPIPlugin.cs
+++ b/InscryptionAPI/InscryptionAPIPlugin.cs
@@ -31,7 +31,7 @@ public class InscryptionAPIPlugin : BaseUnityPlugin
{
public const string ModGUID = "cyantist.inscryption.api";
public const string ModName = "InscryptionAPI";
- public const string ModVer = "2.23.4";
+ public const string ModVer = "2.23.5";
public static string Directory = "";