Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/relicstats/RelicStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,11 @@ public void receivePostInitialize() {
registerCustomStats(Calipers.ID, CalipersInfo.getInstance());
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());
registerCustomStats(EmptyCage.ID, new EmptyCageInfo());

// Joke relic stats
registerCustomStats(FrozenEye.ID, new FrozenEyeInfo());
Expand Down
82 changes: 82 additions & 0 deletions src/main/java/relicstats/patches/relics/BagOfMarblesInfo.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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;
}
}
}
}
92 changes: 92 additions & 0 deletions src/main/java/relicstats/patches/relics/DollysMirrorInfo.java
Original file line number Diff line number Diff line change
@@ -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>(), matcher);
}
}
}

92 changes: 92 additions & 0 deletions src/main/java/relicstats/patches/relics/EmptyCageInfo.java
Original file line number Diff line number Diff line change
@@ -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<String> 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<AbstractCard> group) {
for (final AbstractCard card : AbstractDungeon.gridSelectScreen.selectedCards) {
cards.add(card.cardID);
}
updateDescription();
}
}
82 changes: 82 additions & 0 deletions src/main/java/relicstats/patches/relics/RedMaskInfo.java
Original file line number Diff line number Diff line change
@@ -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<Integer> 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;
}
}
}
}
Loading