diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderInLibrary.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderInLibrary.java new file mode 100644 index 00000000..182a064d --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/cards/AbstractCard/RenderInLibrary.java @@ -0,0 +1,51 @@ +package basemod.patches.com.megacrit.cardcrawl.cards.AbstractCard; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.SpireField; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePrefixPatch; +import com.evacipated.cardcrawl.modthespire.lib.SpireReturn; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.screens.SingleCardViewPopup; + +public class RenderInLibrary { + @SpirePatch( + clz = AbstractCard.class, + method = SpirePatch.CLASS + ) + public static class UpgradeCard + { + public static SpireField upgradeCard = new SpireField<>(() -> null); + } + + @SpirePatch( + clz = AbstractCard.class, + method = "renderInLibrary", + paramtypez = {SpriteBatch.class} + ) + public static class FixRenderLibraryUpgrade + { + @SpirePrefixPatch + public static SpireReturn prefix(AbstractCard __instance, SpriteBatch sb) + { + if (SingleCardViewPopup.isViewingUpgrade) { + if (UpgradeCard.upgradeCard.get(__instance) == null) { + UpgradeCard.upgradeCard.set(__instance, __instance.makeCopy()); + UpgradeCard.upgradeCard.get(__instance).upgrade(); + UpgradeCard.upgradeCard.get(__instance).displayUpgrades(); + } + UpgradeCard.upgradeCard.get(__instance).current_x = __instance.current_x; + UpgradeCard.upgradeCard.get(__instance).current_y = __instance.current_y; + UpgradeCard.upgradeCard.get(__instance).drawScale = __instance.drawScale; + + UpgradeCard.upgradeCard.get(__instance).render(sb); + return SpireReturn.Return(); + } else if (UpgradeCard.upgradeCard.get(__instance) != null) { + UpgradeCard.upgradeCard.set(__instance, null); + } + return SpireReturn.Continue(); + } + + } + +} diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderUpgradeCard.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderUpgradeCard.java new file mode 100644 index 00000000..67e9a8d9 --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/SingleCardViewPopup/RenderUpgradeCard.java @@ -0,0 +1,95 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.SingleCardViewPopup; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.screens.SingleCardViewPopup; +import javassist.CtBehavior; + +import java.lang.reflect.Field; + +public class RenderUpgradeCard +{ + @SpirePatch( + clz = SingleCardViewPopup.class, + method = SpirePatch.CLASS + ) + public static class UpgradeStatus + { + public static SpireField preViewingUpgrade = new SpireField<>(() -> false); + public static SpireField nowViewingUpgrade = new SpireField<>(() -> false); + public static SpireField originalCard = new SpireField<>(() -> null); + } + + @SpirePatch2( + clz = SingleCardViewPopup.class, + method = "render", + paramtypez = {SpriteBatch.class} + ) + public static class FixRenderUpgrade + { + @SpirePrefixPatch + public static void prefix(SingleCardViewPopup __instance) + { + // disable isViewingUpgrade in this method + UpgradeStatus.nowViewingUpgrade.set(__instance, SingleCardViewPopup.isViewingUpgrade); + SingleCardViewPopup.isViewingUpgrade = false; + if (UpgradeStatus.nowViewingUpgrade.get(__instance) != UpgradeStatus.preViewingUpgrade.get(__instance)) { + Field cardField; + try { + cardField = SingleCardViewPopup.class.getDeclaredField("card"); + cardField.setAccessible(true); + if (UpgradeStatus.nowViewingUpgrade.get(__instance)) { + // isViewUpgrade just false -> true + AbstractCard card = (AbstractCard) cardField.get(__instance); + UpgradeStatus.originalCard.set(__instance, card.makeStatEquivalentCopy()); + card.upgrade(); + card.displayUpgrades(); + } else { + // isViewUpgrade just true -> false + cardField.set(__instance, UpgradeStatus.originalCard.get(__instance)); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + + } + + } + + @SpireInsertPatch(locator = Locator.class) + public static void insert(SingleCardViewPopup __instance) + { + SingleCardViewPopup.isViewingUpgrade = UpgradeStatus.nowViewingUpgrade.get(__instance); + UpgradeStatus.preViewingUpgrade.set(__instance, SingleCardViewPopup.isViewingUpgrade); + } + + private static class Locator extends SpireInsertLocator + { + @Override + public int[] Locate(CtBehavior ctBehavior) throws Exception { + Matcher matcher = new Matcher.MethodCallMatcher(SpriteBatch.class, "setColor"); + return LineFinder.findInOrder(ctBehavior, matcher); + } + } + + } + + @SpirePatch( + clz = SingleCardViewPopup.class, + method = "close" + ) + public static class CloseFix + { + @SpirePostfixPatch + public static void postfix(SingleCardViewPopup __instance) + { + UpgradeStatus.nowViewingUpgrade.set(__instance, false); + UpgradeStatus.preViewingUpgrade.set(__instance, false); + if (UpgradeStatus.originalCard.get(__instance) != null) { + UpgradeStatus.originalCard.set(__instance, null); + } + } + } + +}