From 1ed355f7912c7ea6d61a419714b97491f0eb7e11 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Fri, 16 Feb 2018 12:00:09 -0800 Subject: [PATCH 1/6] Find custom cards in mods --- .../cardcrawl/modthespire/CustomContent.java | 39 +++++++++++++++++++ .../cardcrawl/modthespire/Loader.java | 5 +++ .../modthespire/classfilters/CardFilter.java | 10 +++++ .../classfilters/SuperClassNameFilter.java | 26 +++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/CardFilter.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/SuperClassNameFilter.java 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..8b0eab20 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java @@ -0,0 +1,39 @@ +package com.evacipated.cardcrawl.modthespire; + +import com.evacipated.cardcrawl.modthespire.classfilters.CardFilter; +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 findCards(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; + } +} diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java b/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java index ca2d7a67..39ea373a 100644 --- a/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java @@ -25,6 +25,8 @@ public class Loader { public static ModInfo[] MODINFOS; public static URL[] MODONLYURLS; + public static List MODCARDS; + private static Object ARGS; public static void main(String[] args) { @@ -80,6 +82,9 @@ public static void runMods(File[] modJars) { ctClasses.addAll(Patcher.injectPatches(loader, pool, Patcher.findPatches(modOnlyUrls, MODINFOS))); Patcher.compilePatches(loader, ctClasses); + System.out.println("Finding cards..."); + MODCARDS = CustomContent.findCards(modOnlyUrls); + // 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/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()); + } +} From 23b125e2de556b610a4b323c139fc8e8e0df69f9 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Fri, 16 Feb 2018 12:06:26 -0800 Subject: [PATCH 2/6] Initial work for adding custom cards automatically Adds custom cards Gives custom cards blue background Adds custom card colors to CardLibraryScreen --- .../cards/AbstractCard/CreateCardImage.java | 54 +++++++ .../cards/AbstractCard/RenderAttackBg.java | 31 ++++ .../cards/AbstractCard/RenderEnergy.java | 48 ++++++ .../cards/AbstractCard/RenderPowerBg.java | 30 ++++ .../cards/AbstractCard/RenderSkillBg.java | 30 ++++ .../helpers/CardLibrary/AddCustomCards.java | 31 ++++ .../helpers/CardLibrary/GetCardList.java | 39 +++++ .../CardLibraryScreenPatch.java | 149 ++++++++++++++++++ 8 files changed, 412 insertions(+) create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/CreateCardImage.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderAttackBg.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderEnergy.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderPowerBg.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/RenderSkillBg.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/AddCustomCards.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/CardLibrary/GetCardList.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/mainMenu/CardLibraryScreen/CardLibraryScreenPatch.java 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..c69b9b5e --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/cards/AbstractCard/CreateCardImage.java @@ -0,0 +1,54 @@ +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 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(); + } + } +} 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/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..8dda30a6 --- /dev/null +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/mainMenu/CardLibraryScreen/CardLibraryScreenPatch.java @@ -0,0 +1,149 @@ +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(), cards.getKey().name(), ""); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} From b6f7831847f913b501a96634d1b826e33943f4a1 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Sat, 17 Feb 2018 23:06:29 -0800 Subject: [PATCH 3/6] Stop single card view popup from crashing --- .../screens/SingleCardViewPopupPatch.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/screens/SingleCardViewPopupPatch.java 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); + } + } + } +} From c057bfff6791ee4d45d8263432775ae29c7a23f2 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Fri, 23 Feb 2018 18:53:20 -0800 Subject: [PATCH 4/6] Automatically add custom relics --- .../cardcrawl/modthespire/CustomContent.java | 15 ++++++++-- .../cardcrawl/modthespire/Loader.java | 3 ++ .../modthespire/classfilters/RelicFilter.java | 9 ++++++ .../helpers/RelicLibrary/AddCustomRelics.java | 28 +++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/classfilters/RelicFilter.java create mode 100644 src/main/java/com/evacipated/cardcrawl/modthespire/patches/helpers/RelicLibrary/AddCustomRelics.java diff --git a/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java b/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java index 8b0eab20..57a620f2 100644 --- a/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/CustomContent.java @@ -1,6 +1,7 @@ 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; @@ -12,7 +13,7 @@ public class CustomContent { - public static List findCards(URL[] urls) throws URISyntaxException + public static List find(ClassFilter typeFilter, URL[] urls) throws URISyntaxException { ClassFinder finder = new ClassFinder(); File[] files = new File[urls.length]; @@ -25,7 +26,7 @@ public static List findCards(URL[] urls) throws URISyntaxException new AndClassFilter( new NotClassFilter(new InterfaceOnlyClassFilter()), new NotClassFilter(new AbstractClassFilter()), - new CardFilter() + typeFilter ); Collection foundClasses = new ArrayList<>(); finder.findClasses(foundClasses, filter); @@ -36,4 +37,14 @@ public static List findCards(URL[] urls) throws URISyntaxException } 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 de5ea145..74faa71c 100644 --- a/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java +++ b/src/main/java/com/evacipated/cardcrawl/modthespire/Loader.java @@ -28,6 +28,7 @@ public class Loader { public static URL[] MODONLYURLS; public static List MODCARDS; + public static List MODRELICS; private static Object ARGS; @@ -94,6 +95,8 @@ public static void runMods(File[] modJars) { 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)); 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/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(); + } + } + } +} From 3dd44ae13d2cd05f9ade0a4650d154a9d92b5793 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Fri, 23 Feb 2018 18:53:50 -0800 Subject: [PATCH 5/6] CardLibraryScreen custom cards header capitalization --- .../CardLibraryScreen/CardLibraryScreenPatch.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 index 8dda30a6..6688964b 100644 --- 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 @@ -139,11 +139,19 @@ public static void Insert(Object __obj_instance, Object sbObj) renderGroup.setAccessible(true); for (Map.Entry cards : Initialize.cardGroupMap.entrySet()) { - renderGroup.invoke(__obj_instance, sbObj, cards.getValue(), cards.getKey().name(), ""); + 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() : ""); + } } } From 7b4083a2128b60bd748ee77653b946594a1afb65 Mon Sep 17 00:00:00 2001 From: Kiooeht Date: Sat, 24 Feb 2018 17:45:04 -0800 Subject: [PATCH 6/6] Stop card color not set logger errors --- .../cards/AbstractCard/CreateCardImage.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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 index c69b9b5e..7c103d22 100644 --- 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 @@ -4,6 +4,9 @@ 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; @@ -51,4 +54,18 @@ public static void Prefix(Object __obj_instance) 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(""); + } + } + }; + } }