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/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; } /// 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 = ""; 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; + } } } }