diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java b/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java new file mode 100644 index 00000000..57a620f2 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java @@ -0,0 +1,50 @@ +package com.evacipated.cardcrawl.modthespire; + +import com.evacipated.cardcrawl.modthespire.classfilters.CardFilter; +import com.evacipated.cardcrawl.modthespire.classfilters.RelicFilter; +import org.clapper.util.classutil.*; + +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class CustomContent +{ + public static List find(ClassFilter typeFilter, URL[] urls) throws URISyntaxException + { + ClassFinder finder = new ClassFinder(); + File[] files = new File[urls.length]; + for (int i=0; i foundClasses = new ArrayList<>(); + finder.findClasses(foundClasses, filter); + + List ret = new ArrayList<>(); + for (ClassInfo classInfo : foundClasses) { + ret.add(classInfo.getClassName()); + } + return ret; + } + + public static List findCards(URL[] urls) throws URISyntaxException + { + return find(new CardFilter(), urls); + } + + public static List findRelics(URL[] urls) throws URISyntaxException + { + return find(new RelicFilter(), urls); + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java b/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java index 8bc350b2..74faa71c 100644 --- a/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java @@ -27,6 +27,9 @@ public class Loader { public static ModInfo[] MODINFOS; public static URL[] MODONLYURLS; + public static List MODCARDS; + public static List MODRELICS; + private static Object ARGS; public static void main(String[] args) { @@ -90,12 +93,17 @@ public static void runMods(File[] modJars) { Patcher.finalizePatches(loader); Patcher.compilePatches(loader, ctClasses); + System.out.println("Finding cards..."); + MODCARDS = CustomContent.findCards(modOnlyUrls); + System.out.println("Finding relics..."); + MODRELICS = CustomContent.findRelics(modOnlyUrls); + System.out.printf("Patching enums..."); Patcher.patchEnums(loader, Loader.class.getResource(Loader.COREPATCHES_JAR)); // Patch SpireEnums from mods Patcher.patchEnums(loader, Loader.MODONLYURLS); System.out.println("Done."); - + // Set Settings.isModded = true System.out.printf("Setting isModded = true..."); System.out.flush(); diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/CardFilter.java b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/CardFilter.java new file mode 100644 index 00000000..a2060e5b --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/CardFilter.java @@ -0,0 +1,10 @@ +package com.evacipated.cardcrawl.modthespire.classfilters; + + +public class CardFilter extends SuperClassNameFilter +{ + public CardFilter() + { + super("com.megacrit.cardcrawl.cards.AbstractCard"); + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/RelicFilter.java b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/RelicFilter.java new file mode 100644 index 00000000..51a1986c --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/RelicFilter.java @@ -0,0 +1,9 @@ +package com.evacipated.cardcrawl.modthespire.classfilters; + +public class RelicFilter extends SuperClassNameFilter +{ + public RelicFilter() + { + super("com.megacrit.cardcrawl.relics.AbstractRelic"); + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/SuperClassNameFilter.java b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/SuperClassNameFilter.java new file mode 100644 index 00000000..a8b74737 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/SuperClassNameFilter.java @@ -0,0 +1,26 @@ +package com.evacipated.cardcrawl.modthespire.classfilters; + +import org.clapper.util.classutil.ClassFilter; +import org.clapper.util.classutil.ClassFinder; +import org.clapper.util.classutil.ClassInfo; + +public class SuperClassNameFilter implements ClassFilter +{ + private final String baseClassName; + + public SuperClassNameFilter(Class baseClass) + { + this(baseClass.getName()); + } + + public SuperClassNameFilter(String baseClassName) + { + this.baseClassName = baseClassName; + } + + @Override + public boolean accept(ClassInfo classInfo, ClassFinder classFinder) + { + return baseClassName != null && baseClassName.equals(classInfo.getSuperClassName()); + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/CreateCardImage.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/CreateCardImage.java new file mode 100644 index 00000000..7c103d22 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/CreateCardImage.java @@ -0,0 +1,71 @@ +package com.evacipated.cardcrawl.modthespire.patches.cards.AbstractCard; + +import com.badlogic.gdx.graphics.Color; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.helpers.CardHelper; +import javassist.CannotCompileException; +import javassist.expr.ExprEditor; +import javassist.expr.MethodCall; + +import java.lang.reflect.Field; + +@SpirePatch( + cls="com.megacrit.cardcrawl.cards.AbstractCard", + method="createCardImage" +) +public class CreateCardImage +{ + public static void Prefix(Object __obj_instance) + { + AbstractCard card = (AbstractCard)__obj_instance; + switch (card.color) { + case RED: + case GREEN: + case BLUE: + case COLORLESS: + case CURSE: + return; + } + + try { + // TODO: What is even the point of any of these fields? + // As far as I can tell, they are never used + Field bgColor = AbstractCard.class.getDeclaredField("bgColor"); + bgColor.setAccessible(true); + bgColor.set(card, CardHelper.getColor(19.0F, 45.0F, 40.0F)); + + Field backColor = AbstractCard.class.getDeclaredField("backColor"); + backColor.setAccessible(true); + backColor.set(card, CardHelper.getColor(32.0F, 91.0F, 43.0F)); + + Field frameColor = AbstractCard.class.getDeclaredField("frameColor"); + frameColor.setAccessible(true); + frameColor.set(card, CardHelper.getColor(52.0F, 123.0F, 8.0F)); + + Field frameOutlineColor = AbstractCard.class.getDeclaredField("frameOutlineColor"); + frameOutlineColor.setAccessible(true); + frameOutlineColor.set(card, new Color(1.0F, 0.75F, 0.43F, 1.0F)); + + Field descBoxColor = AbstractCard.class.getDeclaredField("descBoxColor"); + descBoxColor.setAccessible(true); + descBoxColor.set(card, CardHelper.getColor(53.0F, 58.0F, 64.0F)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // Stop needless logger errors + public static ExprEditor Instrument() + { + return new ExprEditor() { + @Override + public void edit(MethodCall m) throws CannotCompileException + { + if (m.getMethodName().equals("info")) { + m.replace(""); + } + } + }; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderAttackBg.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderAttackBg.java new file mode 100644 index 00000000..7b4e0fdd --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderAttackBg.java @@ -0,0 +1,31 @@ +package com.evacipated.cardcrawl.modthespire.patches.cards.AbstractCard; + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import javassist.CannotCompileException; +import javassist.expr.ExprEditor; +import javassist.expr.FieldAccess; +import javassist.expr.MethodCall; + +@SpirePatch( + cls="com.megacrit.cardcrawl.cards.AbstractCard", + method="renderAttackBg" +) +public class RenderAttackBg +{ + public static ExprEditor Instrument() + { + return new ExprEditor() { + @Override + public void edit(FieldAccess f) throws CannotCompileException + { + if (f.getClassName().equals("com.megacrit.cardcrawl.helpers.ImageMaster") && f.getFieldName().equals("CARD_SKILL_BG_BLACK")) { + f.replace("if (color != com.megacrit.cardcrawl.cards.AbstractCard.CardColor.CURSE) {" + + "$_ = com.megacrit.cardcrawl.helpers.ImageMaster.CARD_ATTACK_BG_BLUE;" + + "} else {" + + "$_ = $proceed();" + + "}"); + } + } + }; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderEnergy.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderEnergy.java new file mode 100644 index 00000000..d3f8f006 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderEnergy.java @@ -0,0 +1,48 @@ +package com.evacipated.cardcrawl.modthespire.patches.cards.AbstractCard; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.SpireInsertPatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.helpers.ImageMaster; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +@SpirePatch( + cls="com.megacrit.cardcrawl.cards.AbstractCard", + method="renderEnergy" +) +public class RenderEnergy +{ + @SpireInsertPatch( + rloc=25, + localvars={"drawX", "drawY"} + ) + public static void Insert(Object __obj_instance, Object sb, float drawX, float drawY) + { + AbstractCard card = (AbstractCard)__obj_instance; + switch (card.color) { + case RED: + case GREEN: + case BLUE: + case COLORLESS: + case CURSE: + return; + } + + try { + Field renderColor = AbstractCard.class.getDeclaredField("renderColor"); + renderColor.setAccessible(true); + + Method renderHelper = AbstractCard.class.getDeclaredMethod("renderHelper", SpriteBatch.class, Color.class, Texture.class, float.class, float.class); + renderHelper.setAccessible(true); + renderHelper.invoke(card, sb, renderColor.get(card), ImageMaster.CARD_COLORLESS_ORB, drawX, drawY); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | NoSuchFieldException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderPowerBg.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderPowerBg.java new file mode 100644 index 00000000..977ec0db --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderPowerBg.java @@ -0,0 +1,30 @@ +package com.evacipated.cardcrawl.modthespire.patches.cards.AbstractCard; + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import javassist.CannotCompileException; +import javassist.expr.ExprEditor; +import javassist.expr.FieldAccess; + +@SpirePatch( + cls="com.megacrit.cardcrawl.cards.AbstractCard", + method="renderPowerBg" +) +public class RenderPowerBg +{ + public static ExprEditor Instrument() + { + return new ExprEditor() { + @Override + public void edit(FieldAccess f) throws CannotCompileException + { + if (f.getClassName().equals("com.megacrit.cardcrawl.helpers.ImageMaster") && f.getFieldName().equals("CARD_SKILL_BG_BLACK")) { + f.replace("if (color != com.megacrit.cardcrawl.cards.AbstractCard.CardColor.CURSE) {" + + "$_ = com.megacrit.cardcrawl.helpers.ImageMaster.CARD_ATTACK_BG_BLUE;" + + "} else {" + + "$_ = $proceed();" + + "}"); + } + } + }; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderSkillBg.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderSkillBg.java new file mode 100644 index 00000000..621bc5e1 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderSkillBg.java @@ -0,0 +1,30 @@ +package com.evacipated.cardcrawl.modthespire.patches.cards.AbstractCard; + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import javassist.CannotCompileException; +import javassist.expr.ExprEditor; +import javassist.expr.FieldAccess; + +@SpirePatch( + cls="com.megacrit.cardcrawl.cards.AbstractCard", + method="renderSkillBg" +) +public class RenderSkillBg +{ + public static ExprEditor Instrument() + { + return new ExprEditor() { + @Override + public void edit(FieldAccess f) throws CannotCompileException + { + if (f.getClassName().equals("com.megacrit.cardcrawl.helpers.ImageMaster") && f.getFieldName().equals("CARD_SKILL_BG_BLACK")) { + f.replace("if (color != com.megacrit.cardcrawl.cards.AbstractCard.CardColor.CURSE) {" + + "$_ = com.megacrit.cardcrawl.helpers.ImageMaster.CARD_ATTACK_BG_BLUE;" + + "} else {" + + "$_ = $proceed();" + + "}"); + } + } + }; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/AddCustomCards.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/AddCustomCards.java new file mode 100644 index 00000000..11bd4ebe --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/AddCustomCards.java @@ -0,0 +1,31 @@ +package com.evacipated.cardcrawl.modthespire.patches.helpers.CardLibrary; + +import com.evacipated.cardcrawl.modthespire.Loader; +import com.evacipated.cardcrawl.modthespire.lib.SpireInsertPatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.helpers.CardLibrary; + +@SpirePatch( + cls="com.megacrit.cardcrawl.helpers.CardLibrary", + method="initialize" +) +public class AddCustomCards +{ + @SpireInsertPatch( + rloc=9 + ) + public static void Insert() + { + ClassLoader loader = CardLibrary.class.getClassLoader(); + + for (String cardClassName : Loader.MODCARDS) { + try { + AbstractCard card = (AbstractCard) loader.loadClass(cardClassName).newInstance(); + CardLibrary.add(card); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/GetCardList.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/GetCardList.java new file mode 100644 index 00000000..46510f45 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/GetCardList.java @@ -0,0 +1,39 @@ +package com.evacipated.cardcrawl.modthespire.patches.helpers.CardLibrary; + +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.cards.status.Burn; +import com.megacrit.cardcrawl.cards.status.Dazed; +import com.megacrit.cardcrawl.cards.status.Wound; +import com.megacrit.cardcrawl.helpers.CardLibrary; + +import java.util.ArrayList; +import java.util.Map; + +@SpirePatch( + cls="com.megacrit.cardcrawl.helpers.CardLibrary", + method="getCardList" +) +public class GetCardList +{ + public static Object Replace(Object objType) + { + CardLibrary.LibraryType type = (CardLibrary.LibraryType)objType; + + ArrayList ret = new ArrayList<>(); + + if (type == CardLibrary.LibraryType.STATUS) { + ret.add(new Wound()); + ret.add(new Burn()); + ret.add(new Dazed()); + } else { + for (Map.Entry c : CardLibrary.cards.entrySet()) { + if (c.getValue().color.name().equals(type.name())) { + ret.add(c.getValue()); + } + } + } + + return ret; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/RelicLibrary/AddCustomRelics.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/RelicLibrary/AddCustomRelics.java new file mode 100644 index 00000000..9fb18f99 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/RelicLibrary/AddCustomRelics.java @@ -0,0 +1,28 @@ +package com.evacipated.cardcrawl.modthespire.patches.helpers.RelicLibrary; + +import com.evacipated.cardcrawl.modthespire.Loader; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.helpers.RelicLibrary; +import com.megacrit.cardcrawl.relics.AbstractRelic; + +@SpirePatch( + cls="com.megacrit.cardcrawl.helpers.RelicLibrary", + method="initialize" +) +public class AddCustomRelics +{ + public static void Prefix() + { + ClassLoader loader = RelicLibrary.class.getClassLoader(); + + for (String relicClassName : Loader.MODRELICS) { + try { + AbstractRelic relic = (AbstractRelic) loader.loadClass(relicClassName).newInstance(); + RelicLibrary.add(relic); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/SingleCardViewPopupPatch.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/SingleCardViewPopupPatch.java new file mode 100644 index 00000000..2d114b10 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/SingleCardViewPopupPatch.java @@ -0,0 +1,24 @@ +package com.evacipated.cardcrawl.modthespire.patches.screens; + +import com.evacipated.cardcrawl.modthespire.lib.ByRef; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.patches.screens.mainMenu.CardLibraryScreen.CardLibraryScreenPatch; +import com.megacrit.cardcrawl.cards.AbstractCard; + +public class SingleCardViewPopupPatch +{ + @SpirePatch( + cls="com.megacrit.cardcrawl.screens.SingleCardViewPopup", + method="open" + ) + public static class Open + { + public static void Prefix(Object __obj_instance, Object cardObj, @ByRef Object[] groupObj) + { + if (groupObj[0] == null) { + AbstractCard card = (AbstractCard)cardObj; + groupObj[0] = CardLibraryScreenPatch.Initialize.cardGroupMap.get(card.color); + } + } + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/mainMenu/CardLibraryScreen/CardLibraryScreenPatch.java b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/mainMenu/CardLibraryScreen/CardLibraryScreenPatch.java new file mode 100644 index 00000000..6688964b --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/mainMenu/CardLibraryScreen/CardLibraryScreenPatch.java @@ -0,0 +1,157 @@ +package com.evacipated.cardcrawl.modthespire.patches.screens.mainMenu.CardLibraryScreen; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.ByRef; +import com.evacipated.cardcrawl.modthespire.lib.SpireInsertPatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.cards.CardGroup; +import com.megacrit.cardcrawl.helpers.CardLibrary; +import com.megacrit.cardcrawl.screens.mainMenu.CardLibSortHeader; +import com.megacrit.cardcrawl.screens.mainMenu.CardLibraryScreen; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class CardLibraryScreenPatch +{ + @SpirePatch( + cls="com.megacrit.cardcrawl.screens.mainMenu.CardLibraryScreen", + method="initialize" + ) + public static class Initialize + { + public static Map cardGroupMap = new HashMap<>(); + public static Map cardHeaderMap = new HashMap<>(); + + @SpireInsertPatch(rloc=37) + public static void Insert(Object __obj_instance) + { + try { + CardLibraryScreen screen = (CardLibraryScreen) __obj_instance; + + AbstractCard.CardColor[] colors = AbstractCard.CardColor.values(); + for (int icolor = AbstractCard.CardColor.CURSE.ordinal() + 1; icolor < colors.length; ++icolor) { + CardGroup group = new CardGroup(CardGroup.CardGroupType.UNSPECIFIED); + group.group = CardLibrary.getCardList(CardLibrary.LibraryType.valueOf(colors[icolor].name())); + cardGroupMap.put(colors[icolor], group); + + CardLibSortHeader header = new CardLibSortHeader(group); + cardHeaderMap.put(colors[icolor], header); + Field headersField = CardLibraryScreen.class.getDeclaredField("headers"); + headersField.setAccessible(true); + ArrayList headers = (ArrayList)headersField.get(screen); + headers.add(header); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @SpirePatch( + cls="com.megacrit.cardcrawl.screens.mainMenu.CardLibraryScreen", + method="calculateScrollBounds" + ) + public static class CalculateScrollBounds + { + @SpireInsertPatch( + rloc=3, + localvars={"size"} + ) + public static void Insert(Object __obj_instance, @ByRef int[] size) + { + System.out.println(size[0]); + for (Map.Entry cards : Initialize.cardGroupMap.entrySet()) { + size[0] += cards.getValue().size(); + } + System.out.println(size[0]); + } + } + + @SpirePatch( + cls = "com.megacrit.cardcrawl.screens.mainMenu.CardLibraryScreen", + method = "updateCards" + ) + public static class UpdateCards + { + @SpireInsertPatch( + rloc = 81, + localvars = {"lineNum", "drawStartX", "drawStartY", "padX", "padY", "currentDiffY"} + ) + public static void Insert(Object __obj_instance, @ByRef int[] lineNum, float drawStartX, float drawStartY, float padX, float padY, float currentDiffY) + { + try { + Field hoveredCard = CardLibraryScreen.class.getDeclaredField("hoveredCard"); + hoveredCard.setAccessible(true); + + lineNum[0] += 2; + ArrayList cards; + CardLibSortHeader header; + for (Map.Entry entry : Initialize.cardGroupMap.entrySet()) { + cards = entry.getValue().group; + header = Initialize.cardHeaderMap.get(entry.getKey()); + + for (int i = 0; i < cards.size(); ++i) { + int mod = i % 5; + if ((mod == 0) && i != 0) { + lineNum[0]++; + } + cards.get(i).target_x = drawStartX + mod * padX; + cards.get(i).target_y = drawStartY + currentDiffY - lineNum[0] * padY; + cards.get(i).update(); + cards.get(i).updateHoverLogic(); + if (cards.get(i).hb.hovered) { + hoveredCard.set(__obj_instance, cards.get(i)); + } + } + + if (header.justSorted) { + for (AbstractCard c : cards) { + c.current_x = c.target_x; + c.current_y = c.target_y; + } + header.justSorted = false; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @SpirePatch( + cls="com.megacrit.cardcrawl.screens.mainMenu.CardLibraryScreen", + method="render" + ) + public static class Render + { + @SpireInsertPatch( + rloc=11 + ) + public static void Insert(Object __obj_instance, Object sbObj) + { + try { + Method renderGroup = CardLibraryScreen.class.getDeclaredMethod("renderGroup", SpriteBatch.class, CardGroup.class, String.class, String.class); + renderGroup.setAccessible(true); + + for (Map.Entry cards : Initialize.cardGroupMap.entrySet()) { + renderGroup.invoke(__obj_instance, sbObj, cards.getValue(), capitalizeWord(cards.getKey().name()), ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static String capitalizeWord(String str) + { + if (str.isEmpty()) { + return str; + } + return str.substring(0, 1).toUpperCase() + (str.length() > 1 ? str.substring(1).toLowerCase() : ""); + } + } +}