From 1d4278f4f1f7b7c933118f5b4cca6736be85e421 Mon Sep 17 00:00:00 2001 From: Nekaida Date: Tue, 8 Mar 2022 00:43:39 +0100 Subject: [PATCH 1/3] Add Dolly's Mirror --- src/main/java/relicstats/RelicStats.java | 1 + .../patches/relics/DollysMirrorInfo.java | 92 +++++++++++++++++++ .../localization/eng/descriptions.json | 8 +- 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/main/java/relicstats/patches/relics/DollysMirrorInfo.java diff --git a/src/main/java/relicstats/RelicStats.java b/src/main/java/relicstats/RelicStats.java index fad13a9..19d20bb 100644 --- a/src/main/java/relicstats/RelicStats.java +++ b/src/main/java/relicstats/RelicStats.java @@ -199,6 +199,7 @@ public void receivePostInitialize() { registerCustomStats(Calipers.ID, CalipersInfo.getInstance()); registerCustomStats(IceCream.ID, IceCreamInfo.getInstance()); registerCustomStats(TheSpecimen.ID, TheSpecimenInfo.getInstance()); + registerCustomStats(DollysMirror.ID, new DollysMirrorInfo()); // Joke relic stats registerCustomStats(FrozenEye.ID, new FrozenEyeInfo()); diff --git a/src/main/java/relicstats/patches/relics/DollysMirrorInfo.java b/src/main/java/relicstats/patches/relics/DollysMirrorInfo.java new file mode 100644 index 0000000..cbfa862 --- /dev/null +++ b/src/main/java/relicstats/patches/relics/DollysMirrorInfo.java @@ -0,0 +1,92 @@ +package relicstats.patches.relics; + +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.helpers.CardLibrary; +import com.megacrit.cardcrawl.relics.DollysMirror; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import relicstats.StatsInfo; + +import java.util.ArrayList; + +@SpirePatch( + clz = DollysMirror.class, + method = "update" +) +public class DollysMirrorInfo extends StatsInfo { + + private static String cardId; + private static String savedText; + private static String statId = getLocId(DollysMirror.ID); + private static String[] description = CardCrawlGame.languagePack.getUIString(statId).TEXT; + + @Override + public String getStatsDescription() { + return savedText; + } + + private static void updateDescription() { + StringBuilder statText = new StringBuilder(description[0]); + if (CardLibrary.isACard(cardId)) { + AbstractCard card = CardLibrary.getCard(cardId); + String regexkey = ""; + if (card.rarity == AbstractCard.CardRarity.RARE) { + regexkey = "$1#y$2"; + } else if (card.rarity == AbstractCard.CardRarity.UNCOMMON) { + regexkey = "$1#b$2"; + } + String cardname = card.name; + if (!regexkey.equals("")) { + cardname = cardname.replaceAll("(^|\\s)([^\\s])", regexkey); + } + statText.append(cardname); + } else { + statText.append(description[1]); + } + savedText = statText.toString(); + } + + @Override + public void resetStats() { + cardId = ""; + savedText = description[0]; + } + + @Override + public JsonElement onSaveRaw() { + Gson gson = new Gson(); + return gson.toJsonTree(cardId); + } + + @Override + public void onLoadRaw(JsonElement jsonElement) { + if (jsonElement != null) { + cardId = jsonElement.getAsString(); + } else { + resetStats(); + } + updateDescription(); + } + + @SpireInsertPatch( + locator = DollysMirrorInfo.Locator.class + ) + public static void insert(DollysMirror _instance) { + cardId = AbstractDungeon.gridSelectScreen.selectedCards.get(0).cardID; + updateDescription(); + } + + private static class Locator extends SpireInsertLocator { + public int[] Locate(CtBehavior ctMethodToPatch) throws CannotCompileException, PatchingException { + Matcher matcher = new Matcher.MethodCallMatcher(AbstractCard.class, "makeStatEquivalentCopy"); + return LineFinder.findInOrder(ctMethodToPatch, new ArrayList(), matcher); + } + } +} + diff --git a/src/main/resources/localization/eng/descriptions.json b/src/main/resources/localization/eng/descriptions.json index ba5f9fa..df6820c 100644 --- a/src/main/resources/localization/eng/descriptions.json +++ b/src/main/resources/localization/eng/descriptions.json @@ -619,5 +619,11 @@ "TEXT": [ "Relevant poison applied: " ] + }, + "STATS:DollysMirror": { + "TEXT": [ + "Card copied: ", + "Unknown" + ] } -} \ No newline at end of file +} From bc80c6a43c145f9890b9272f3f9a2052fe6aeff4 Mon Sep 17 00:00:00 2001 From: Nekaida Date: Tue, 8 Mar 2022 00:44:39 +0100 Subject: [PATCH 2/3] Add Bag of Marbles, Red Mask, Twisted Funnel --- src/main/java/relicstats/RelicStats.java | 3 + .../patches/relics/BagOfMarblesInfo.java | 82 +++++++++++++++++++ .../patches/relics/RedMaskInfo.java | 82 +++++++++++++++++++ .../patches/relics/TwistedFunnelInfo.java | 82 +++++++++++++++++++ .../localization/eng/descriptions.json | 18 ++++ 5 files changed, 267 insertions(+) create mode 100644 src/main/java/relicstats/patches/relics/BagOfMarblesInfo.java create mode 100644 src/main/java/relicstats/patches/relics/RedMaskInfo.java create mode 100644 src/main/java/relicstats/patches/relics/TwistedFunnelInfo.java diff --git a/src/main/java/relicstats/RelicStats.java b/src/main/java/relicstats/RelicStats.java index 19d20bb..d2c7584 100644 --- a/src/main/java/relicstats/RelicStats.java +++ b/src/main/java/relicstats/RelicStats.java @@ -200,6 +200,9 @@ public void receivePostInitialize() { registerCustomStats(IceCream.ID, IceCreamInfo.getInstance()); registerCustomStats(TheSpecimen.ID, TheSpecimenInfo.getInstance()); registerCustomStats(DollysMirror.ID, new DollysMirrorInfo()); + registerCustomStats(BagOfMarbles.ID, new BagOfMarblesInfo()); + registerCustomStats(RedMask.ID, new RedMaskInfo()); + registerCustomStats(TwistedFunnel.ID, new TwistedFunnelInfo()); // Joke relic stats registerCustomStats(FrozenEye.ID, new FrozenEyeInfo()); diff --git a/src/main/java/relicstats/patches/relics/BagOfMarblesInfo.java b/src/main/java/relicstats/patches/relics/BagOfMarblesInfo.java new file mode 100644 index 0000000..4175bc6 --- /dev/null +++ b/src/main/java/relicstats/patches/relics/BagOfMarblesInfo.java @@ -0,0 +1,82 @@ +package relicstats.patches.relics; + +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.relics.AbstractRelic; +import com.megacrit.cardcrawl.relics.BagOfMarbles; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import relicstats.StatsInfo; + +import java.util.ArrayList; + +@SpirePatch( + clz = BagOfMarbles.class, + method = "atBattleStart" +) +public class BagOfMarblesInfo extends StatsInfo { + + private static int weakApplied; + private static int artifactRemoved; + private static String statId = getLocId(BagOfMarbles.ID); + private static String[] description = CardCrawlGame.languagePack.getUIString(statId).TEXT; + + @Override + public void resetStats() { + weakApplied = 0; + artifactRemoved = 0; + } + + @Override + public String getStatsDescription() { + return String.format("%s%d%s%d", description[0], weakApplied, description[1], artifactRemoved); + } + + @Override + public JsonElement onSaveRaw() { + ArrayList stats = new ArrayList<>(); + stats.add(weakApplied); + stats.add(artifactRemoved); + Gson gson = new Gson(); + return gson.toJsonTree(stats); + } + + @Override + public void onLoadRaw(JsonElement jsonElement) { + if (jsonElement != null) { + JsonArray jsonArray = jsonElement.getAsJsonArray(); + weakApplied = jsonArray.get(0).getAsInt(); + artifactRemoved = jsonArray.get(1).getAsInt(); + } else { + resetStats(); + } + } + + @SpirePrefixPatch + public static void prefix(BagOfMarbles _instance) { + // check, how many artifact removing relics activate before this one + int artifactAlreadyRemoved = 0; + for (AbstractRelic r : AbstractDungeon.player.relics) { + if (r.relicId.equals("Red Mask") || r.relicId.equals("TwistedFunnel")) { + artifactAlreadyRemoved += 1; + } + if (r.relicId.equals("Bag of Marbles")) { + break; + } + } + for (final AbstractMonster mo : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (mo.hasPower("Artifact") && mo.getPower("Artifact").amount > artifactAlreadyRemoved) { + artifactRemoved += 1; + } + else { + weakApplied += 1; + } + } + } +} diff --git a/src/main/java/relicstats/patches/relics/RedMaskInfo.java b/src/main/java/relicstats/patches/relics/RedMaskInfo.java new file mode 100644 index 0000000..019abbc --- /dev/null +++ b/src/main/java/relicstats/patches/relics/RedMaskInfo.java @@ -0,0 +1,82 @@ +package relicstats.patches.relics; + +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.relics.AbstractRelic; +import com.megacrit.cardcrawl.relics.RedMask; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import relicstats.StatsInfo; + +import java.util.ArrayList; + +@SpirePatch( + clz = RedMask.class, + method = "atBattleStart" +) +public class RedMaskInfo extends StatsInfo { + + private static int vulnApplied; + private static int artifactRemoved; + private static String statId = getLocId(RedMask.ID); + private static String[] description = CardCrawlGame.languagePack.getUIString(statId).TEXT; + + @Override + public void resetStats() { + vulnApplied = 0; + artifactRemoved = 0; + } + + @Override + public String getStatsDescription() { + return String.format("%s%d%s%d", description[0], vulnApplied, description[1], artifactRemoved); + } + + @Override + public JsonElement onSaveRaw() { + ArrayList stats = new ArrayList<>(); + stats.add(vulnApplied); + stats.add(artifactRemoved); + Gson gson = new Gson(); + return gson.toJsonTree(stats); + } + + @Override + public void onLoadRaw(JsonElement jsonElement) { + if (jsonElement != null) { + JsonArray jsonArray = jsonElement.getAsJsonArray(); + vulnApplied = jsonArray.get(0).getAsInt(); + artifactRemoved = jsonArray.get(1).getAsInt(); + } else { + resetStats(); + } + } + + @SpirePrefixPatch + public static void prefix(RedMask _instance) { + // check, how many artifact removing relics activate before this one + int artifactAlreadyRemoved = 0; + for (AbstractRelic r : AbstractDungeon.player.relics) { + if (r.relicId.equals("Bag of Marbles") || r.relicId.equals("TwistedFunnel")) { + artifactAlreadyRemoved += 1; + } + if (r.relicId.equals("Red Mask")) { + break; + } + } + for (final AbstractMonster mo : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (mo.hasPower("Artifact") && mo.getPower("Artifact").amount > artifactAlreadyRemoved) { + artifactRemoved += 1; + } + else { + vulnApplied += 1; + } + } + } +} diff --git a/src/main/java/relicstats/patches/relics/TwistedFunnelInfo.java b/src/main/java/relicstats/patches/relics/TwistedFunnelInfo.java new file mode 100644 index 0000000..2da976a --- /dev/null +++ b/src/main/java/relicstats/patches/relics/TwistedFunnelInfo.java @@ -0,0 +1,82 @@ +package relicstats.patches.relics; + +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.monsters.AbstractMonster; +import com.megacrit.cardcrawl.relics.AbstractRelic; +import com.megacrit.cardcrawl.relics.TwistedFunnel; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import relicstats.StatsInfo; + +import java.util.ArrayList; + +@SpirePatch( + clz = TwistedFunnel.class, + method = "atBattleStart" +) +public class TwistedFunnelInfo extends StatsInfo { + + private static int poisonApplied; + private static int artifactRemoved; + private static String statId = getLocId(TwistedFunnel.ID); + private static String[] description = CardCrawlGame.languagePack.getUIString(statId).TEXT; + + @Override + public void resetStats() { + poisonApplied = 0; + artifactRemoved = 0; + } + + @Override + public String getStatsDescription() { + return String.format("%s%d%s%d", description[0], poisonApplied, description[1], artifactRemoved); + } + + @Override + public JsonElement onSaveRaw() { + ArrayList stats = new ArrayList<>(); + stats.add(poisonApplied); + stats.add(artifactRemoved); + Gson gson = new Gson(); + return gson.toJsonTree(stats); + } + + @Override + public void onLoadRaw(JsonElement jsonElement) { + if (jsonElement != null) { + JsonArray jsonArray = jsonElement.getAsJsonArray(); + poisonApplied = jsonArray.get(0).getAsInt(); + artifactRemoved = jsonArray.get(1).getAsInt(); + } else { + resetStats(); + } + } + + @SpirePrefixPatch + public static void prefix(TwistedFunnel _instance) { + // check, how many artifact removing relics activate before this one + int artifactAlreadyRemoved = 0; + for (AbstractRelic r : AbstractDungeon.player.relics) { + if (r.relicId.equals("Bag of Marbles") || r.relicId.equals("Red Mask")) { + artifactAlreadyRemoved += 1; + } + if (r.relicId.equals("TwistedFunnel")) { + break; + } + } + for (final AbstractMonster mo : AbstractDungeon.getCurrRoom().monsters.monsters) { + if (mo.hasPower("Artifact") && mo.getPower("Artifact").amount > artifactAlreadyRemoved) { + artifactRemoved += 1; + } + else { + poisonApplied += 4; + } + } + } +} diff --git a/src/main/resources/localization/eng/descriptions.json b/src/main/resources/localization/eng/descriptions.json index df6820c..fbfadaf 100644 --- a/src/main/resources/localization/eng/descriptions.json +++ b/src/main/resources/localization/eng/descriptions.json @@ -625,5 +625,23 @@ "Card copied: ", "Unknown" ] + }, + "STATS:Bag of Marbles": { + "TEXT": [ + "Vulnerable applied: ", + " NL Artifact removed: " + ] + }, + "STATS:Red Mask": { + "TEXT": [ + "Weak applied: ", + " NL Artifact removed: " + ] + }, + "STATS:TwistedFunnel": { + "TEXT": [ + "Poison applied: ", + " NL Artifact removed: " + ] } } From 293531a86dadfe1acff6a9d5101f60d1aae405b3 Mon Sep 17 00:00:00 2001 From: Nekaida Date: Thu, 10 Mar 2022 14:31:01 +0100 Subject: [PATCH 3/3] Add Empty Cage --- src/main/java/relicstats/RelicStats.java | 1 + .../patches/relics/EmptyCageInfo.java | 92 +++++++++++++++++++ .../localization/eng/descriptions.json | 6 ++ 3 files changed, 99 insertions(+) create mode 100644 src/main/java/relicstats/patches/relics/EmptyCageInfo.java diff --git a/src/main/java/relicstats/RelicStats.java b/src/main/java/relicstats/RelicStats.java index d2c7584..ceab446 100644 --- a/src/main/java/relicstats/RelicStats.java +++ b/src/main/java/relicstats/RelicStats.java @@ -203,6 +203,7 @@ public void receivePostInitialize() { registerCustomStats(BagOfMarbles.ID, new BagOfMarblesInfo()); registerCustomStats(RedMask.ID, new RedMaskInfo()); registerCustomStats(TwistedFunnel.ID, new TwistedFunnelInfo()); + registerCustomStats(EmptyCage.ID, new EmptyCageInfo()); // Joke relic stats registerCustomStats(FrozenEye.ID, new FrozenEyeInfo()); diff --git a/src/main/java/relicstats/patches/relics/EmptyCageInfo.java b/src/main/java/relicstats/patches/relics/EmptyCageInfo.java new file mode 100644 index 0000000..16f3861 --- /dev/null +++ b/src/main/java/relicstats/patches/relics/EmptyCageInfo.java @@ -0,0 +1,92 @@ +package relicstats.patches.relics; + +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.evacipated.cardcrawl.modthespire.patcher.PatchingException; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.megacrit.cardcrawl.cards.AbstractCard; +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.dungeons.AbstractDungeon; +import com.megacrit.cardcrawl.helpers.CardLibrary; +import com.megacrit.cardcrawl.relics.EmptyCage; +import javassist.CannotCompileException; +import javassist.CtBehavior; +import relicstats.StatsInfo; + +import java.util.ArrayList; + +@SpirePatch( + clz = EmptyCage.class, + method = "deleteCards" +) +public class EmptyCageInfo extends StatsInfo { + + private static ArrayList cards; + private static String savedText; + private static String statId = getLocId(EmptyCage.ID); + private static String[] description = CardCrawlGame.languagePack.getUIString(statId).TEXT; + + @Override + public String getStatsDescription() { + return savedText; + } + + private static void updateDescription() { + StringBuilder statText = new StringBuilder(description[0]); + for (String cardId: cards) { + statText.append(" NL "); + if (CardLibrary.isACard(cardId)) { + AbstractCard card = CardLibrary.getCard(cardId); + String regexkey = ""; + if (card.rarity == AbstractCard.CardRarity.RARE) { + regexkey = "$1#y$2"; + } else if (card.rarity == AbstractCard.CardRarity.UNCOMMON) { + regexkey = "$1#b$2"; + } + String cardname = card.name; + if (!regexkey.equals("")) { + cardname = cardname.replaceAll("(^|\\s)([^\\s])", regexkey); + } + statText.append(cardname); + } else { + statText.append(description[1]); + } + } + savedText = statText.toString(); + } + + @Override + public void resetStats() { + cards = new ArrayList<>(); + savedText = description[0]; + } + + @Override + public JsonElement onSaveRaw() { + Gson gson = new Gson(); + return gson.toJsonTree(cards); + } + + @Override + public void onLoadRaw(JsonElement jsonElement) { + if (jsonElement != null) { + JsonArray jsonArray = jsonElement.getAsJsonArray(); + cards = new ArrayList<>(); + for (JsonElement e : jsonArray) { + cards.add(e.getAsString()); + } + } else { + resetStats(); + } + updateDescription(); + } + + @SpirePrefixPatch + public static void prefix(EmptyCage _instance, ArrayList group) { + for (final AbstractCard card : AbstractDungeon.gridSelectScreen.selectedCards) { + cards.add(card.cardID); + } + updateDescription(); + } +} diff --git a/src/main/resources/localization/eng/descriptions.json b/src/main/resources/localization/eng/descriptions.json index fbfadaf..14fbb3b 100644 --- a/src/main/resources/localization/eng/descriptions.json +++ b/src/main/resources/localization/eng/descriptions.json @@ -643,5 +643,11 @@ "Poison applied: ", " NL Artifact removed: " ] + }, + "STATS:Empty Cage": { + "TEXT": [ + "Cards removed:", + "Unknown" + ] } }