From 6e8a57625301b76693e97a9ad7a24dae7ac62bbb Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Thu, 9 May 2024 03:23:58 -0400 Subject: [PATCH 1/9] keep this plz --- .../stats/StatsScreen/AchievementOffset.java | 27 +++++++++++++++++++ .../stats/StatsScreen/UpdateStats.java | 13 ++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java new file mode 100644 index 000000000..eff1eb592 --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java @@ -0,0 +1,27 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; + +import basemod.BaseMod; +import com.evacipated.cardcrawl.modthespire.lib.ByRef; +import com.evacipated.cardcrawl.modthespire.lib.SpireInsertPatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch2; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; + +@SpirePatch2( + clz = StatsScreen.class, + method = "renderStatScreen" +) +public class AchievementOffset { + + public AchievementOffset() {} + + @SpireInsertPatch( + rloc = 8, + localvars = {"renderY"} + ) + public static void Insert(StatsScreen __instance, @ByRef float[] renderY) { + int totalAchievements = BaseMod.getTotalAchievements(); + int rowsNeeded = totalAchievements / 5; + renderY[0] -= 180.0f * rowsNeeded * Settings.scale; + } +} diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java index d7f17bc85..2c7cd4b2d 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java @@ -12,9 +12,10 @@ public class UpdateStats { public static final Logger logger = LogManager.getLogger(BaseMod.class.getName()); - + public static final float SIZE_PER_CHARACTER = 400.0F; - + public static final float SIZE_PER_ACHIEVEMENT_ROW = 180.0F; // Assuming each row of achievements needs 180.0F of space + @SpirePatch( clz=StatsScreen.class, method="calculateScrollBounds" @@ -26,9 +27,13 @@ public static void Postfix(StatsScreen __instance) try { Field scrollUpperBoundField = __instance.getClass().getDeclaredField("scrollUpperBound"); scrollUpperBoundField.setAccessible(true); + int characterCount = BaseMod.getModdedCharacters().size(); - scrollUpperBoundField.set(__instance, scrollUpperBoundField.getFloat(__instance) + - (SIZE_PER_CHARACTER * characterCount * Settings.scale)); + int totalAchievements = BaseMod.getTotalAchievements(); + int achievementRows = totalAchievements / 5; + + float extraHeight = (SIZE_PER_CHARACTER * characterCount + SIZE_PER_ACHIEVEMENT_ROW * achievementRows) * Settings.scale; + scrollUpperBoundField.set(__instance, scrollUpperBoundField.getFloat(__instance) + extraHeight); } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { logger.error("could not calculate updated scroll bounds"); logger.error("error was: " + e.toString()); From 952989f054d81e258e45b0371c7dfa5f17a5dbf6 Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Thu, 9 May 2024 03:24:09 -0400 Subject: [PATCH 2/9] keep this plz --- mod/src/main/java/basemod/BaseMod.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index b418263c1..542cbb4ca 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -246,6 +246,7 @@ public class BaseMod { private static HashMap> unlockBundles; private static HashMap> unlockCards; private static HashMap maxUnlockLevel; + private static Map modAchievements = new HashMap<>(); private static HashMap customSaveFields = new HashMap<>(); private static HashMap customScreens = new HashMap<>(); @@ -1705,6 +1706,14 @@ public static List getModdedCharacters() { return CardCrawlGame.characterManager.getAllCharacters().subList(lastBaseCharacterIndex+1, CardCrawlGame.characterManager.getAllCharacters().size()); } + public static void registerAchievements(String modId, int numberOfAchievements) { + modAchievements.merge(modId, numberOfAchievements, Integer::sum); + } + + public static int getTotalAchievements() { + return modAchievements.values().stream().reduce(0, Integer::sum); + } + // add character - the String characterID *must* be the exact same as what // you put in the PlayerClass enum public static void addCharacter(AbstractPlayer character, From 6686187e4e594a9f64331b0e64585c7e51ec0144 Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 10 May 2024 02:47:57 -0400 Subject: [PATCH 3/9] commit message --- mod/src/main/java/basemod/AtlasLoader.java | 43 ++++++++++++++ mod/src/main/java/basemod/BaseMod.java | 57 +++++++++++++++++-- mod/src/main/java/basemod/ModAchievement.java | 46 +++++++++++++++ .../java/basemod/ModAchievementUnlocker.java | 19 +++++++ .../EditAchievementsSubscriber.java | 7 +++ .../AchievementGridConstructor.java | 16 ++++++ .../StatsScreen/AchievementItemReloadImg.java | 22 +++++++ .../stats/StatsScreen/AchievementOffset.java | 2 +- .../stats/StatsScreen/UpdateStats.java | 2 +- 9 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 mod/src/main/java/basemod/AtlasLoader.java create mode 100644 mod/src/main/java/basemod/ModAchievement.java create mode 100644 mod/src/main/java/basemod/ModAchievementUnlocker.java create mode 100644 mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java create mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java create mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java diff --git a/mod/src/main/java/basemod/AtlasLoader.java b/mod/src/main/java/basemod/AtlasLoader.java new file mode 100644 index 000000000..331ca0891 --- /dev/null +++ b/mod/src/main/java/basemod/AtlasLoader.java @@ -0,0 +1,43 @@ +package basemod; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePrefixPatch; + +import java.util.HashMap; + +public class AtlasLoader { + private static HashMap atlases = new HashMap<>(); + + public static TextureAtlas getAtlas(final String atlasString) { + if (atlases.get(atlasString) == null) { + try { + loadAtlas(atlasString); + } catch (GdxRuntimeException e) { + + } + } + return atlases.get(atlasString); + } + + private static void loadAtlas(final String atlasString) throws GdxRuntimeException { + TextureAtlas atlas = new TextureAtlas(Gdx.files.internal(atlasString)); + atlases.put(atlasString, atlas); + } + + public static boolean testAtlas(String filePath) { + return Gdx.files.internal(filePath).exists(); + } + + @SpirePatch(clz = TextureAtlas.class, method = "dispose") + public static class DisposeListener { + @SpirePrefixPatch + public static void DisposeListenerPatch(final TextureAtlas __instance) { + atlases.entrySet().removeIf(entry -> { + return entry.getValue().equals(__instance); + }); + } + } +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index 542cbb4ca..576e96afb 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -68,6 +68,7 @@ import com.megacrit.cardcrawl.screens.charSelect.CharacterOption; import com.megacrit.cardcrawl.screens.custom.CustomMod; import com.megacrit.cardcrawl.screens.custom.CustomModeCharacterButton; +import com.megacrit.cardcrawl.screens.stats.AchievementGrid; import com.megacrit.cardcrawl.shop.ShopScreen; import com.megacrit.cardcrawl.shop.StorePotion; import com.megacrit.cardcrawl.shop.StoreRelic; @@ -143,6 +144,7 @@ public class BaseMod { private static ArrayList editStringsSubscribers; private static ArrayList addAudioSubscribers; private static ArrayList editKeywordsSubscribers; + private static ArrayList editAchievementsSubscribers; private static ArrayList postBattleSubscribers; private static ArrayList setUnlocksSubscribers; private static ArrayList postPotionUseSubscribers; @@ -246,7 +248,7 @@ public class BaseMod { private static HashMap> unlockBundles; private static HashMap> unlockCards; private static HashMap maxUnlockLevel; - private static Map modAchievements = new HashMap<>(); + private static Map> modAchievements = new HashMap<>(); private static HashMap customSaveFields = new HashMap<>(); private static HashMap customScreens = new HashMap<>(); @@ -485,6 +487,7 @@ private static void initializeSubscriptions() { editStringsSubscribers = new ArrayList<>(); addAudioSubscribers = new ArrayList<>(); editKeywordsSubscribers = new ArrayList<>(); + editAchievementsSubscribers = new ArrayList<>(); postBattleSubscribers = new ArrayList<>(); setUnlocksSubscribers = new ArrayList<>(); postPotionUseSubscribers = new ArrayList<>(); @@ -1706,12 +1709,26 @@ public static List getModdedCharacters() { return CardCrawlGame.characterManager.getAllCharacters().subList(lastBaseCharacterIndex+1, CardCrawlGame.characterManager.getAllCharacters().size()); } - public static void registerAchievements(String modId, int numberOfAchievements) { - modAchievements.merge(modId, numberOfAchievements, Integer::sum); + public static void registerAchievement(String modID, String imgName, String id, boolean isHidden, TextureAtlas atlas) { + UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(id); + String name = uiStrings.TEXT[0]; + String description = uiStrings.TEXT[1]; + + TextureAtlas.AtlasRegion achievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); + TextureAtlas.AtlasRegion achievementImageLocked = atlas.findRegion("locked/" + imgName); + + ModAchievement achievement = new ModAchievement(name, description, id, isHidden, achievementImageUnlocked, achievementImageLocked, atlas); + + if (!modAchievements.containsKey(modID)) { + modAchievements.put(modID, new ArrayList<>()); + } + modAchievements.get(modID).add(achievement); } public static int getTotalAchievements() { - return modAchievements.values().stream().reduce(0, Integer::sum); + return modAchievements.values().stream() + .mapToInt(List::size) + .sum(); } // add character - the String characterID *must* be the exact same as what @@ -2109,6 +2126,19 @@ public static void saveEnergyOrbPortraitTexture(AbstractCard.CardColor color, co colorEnergyOrbPortraitTextureMap.put(color, tex); } + // + // Achievements + // + + public static void loadAchievement(AchievementGrid grid, String imgName, String id, boolean isHidden, TextureAtlas atlas) { + UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(id); + String name = uiStrings.TEXT[0]; + String description = uiStrings.TEXT[1]; + TextureAtlas.AtlasRegion AchievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); + TextureAtlas.AtlasRegion AchievementImageLocked = atlas.findRegion("locked/" + imgName); + grid.items.add(new ModAchievement(name, description, id, isHidden, AchievementImageUnlocked, AchievementImageLocked, atlas)); + } + // // Potions // @@ -2703,6 +2733,19 @@ public static void publishEditKeywords() { } unsubscribeLaterHelper(EditKeywordsSubscriber.class); } + public static void publishEditAchievements(AchievementGrid grid) { + logger.info("editing achievements"); + for (EditAchievementsSubscriber sub : editAchievementsSubscribers) { + sub.receiveEditAchievements(); + } + for (Map.Entry> entry : modAchievements.entrySet()) { + List achievements = entry.getValue(); + for (ModAchievement achievement : achievements) { + grid.items.add(achievement); + } + } + unsubscribeLaterHelper(EditAchievementsSubscriber.class); + } // publishOnPowersModified public static void publishOnPowersModified() { @@ -2906,6 +2949,7 @@ public static void subscribe(ISubscriber sub) { subscribeIfInstance(editCharactersSubscribers, sub, EditCharactersSubscriber.class); subscribeIfInstance(editStringsSubscribers, sub, EditStringsSubscriber.class); subscribeIfInstance(editKeywordsSubscribers, sub, EditKeywordsSubscriber.class); + subscribeIfInstance(editAchievementsSubscribers, sub, EditAchievementsSubscriber.class); subscribeIfInstance(postBattleSubscribers, sub, PostBattleSubscriber.class); subscribeIfInstance(setUnlocksSubscribers, sub, SetUnlocksSubscriber.class); subscribeIfInstance(postPotionUseSubscribers, sub, PostPotionUseSubscriber.class); @@ -2990,6 +3034,8 @@ public static void subscribe(ISubscriber sub, Class addit editStringsSubscribers.add((EditStringsSubscriber) sub); } else if (additionClass.equals(EditKeywordsSubscriber.class)) { editKeywordsSubscribers.add((EditKeywordsSubscriber) sub); + } else if (additionClass.equals(EditAchievementsSubscriber.class)) { + editAchievementsSubscribers.add((EditAchievementsSubscriber) sub); } else if (additionClass.equals(PostBattleSubscriber.class)) { postBattleSubscribers.add((PostBattleSubscriber) sub); } else if (additionClass.equals(SetUnlocksSubscriber.class)) { @@ -3064,6 +3110,7 @@ public static void unsubscribe(ISubscriber sub) { unsubscribeIfInstance(editCharactersSubscribers, sub, EditCharactersSubscriber.class); unsubscribeIfInstance(editStringsSubscribers, sub, EditStringsSubscriber.class); unsubscribeIfInstance(editKeywordsSubscribers, sub, EditKeywordsSubscriber.class); + unsubscribeIfInstance(editAchievementsSubscribers, sub, EditAchievementsSubscriber.class); unsubscribeIfInstance(postBattleSubscribers, sub, PostBattleSubscriber.class); unsubscribeIfInstance(setUnlocksSubscribers, sub, SetUnlocksSubscriber.class); unsubscribeIfInstance(postPotionUseSubscribers, sub, PostPotionUseSubscriber.class); @@ -3148,6 +3195,8 @@ public static void unsubscribe(ISubscriber sub, Class rem editStringsSubscribers.remove(sub); } else if (removalClass.equals(EditKeywordsSubscriber.class)) { editKeywordsSubscribers.remove(sub); + } else if (removalClass.equals(EditAchievementsSubscriber.class)) { + editAchievementsSubscribers.remove(sub); } else if (removalClass.equals(AddAudioSubscriber.class)) { addAudioSubscribers.remove(sub); } else if (removalClass.equals(PostBattleSubscriber.class)) { diff --git a/mod/src/main/java/basemod/ModAchievement.java b/mod/src/main/java/basemod/ModAchievement.java new file mode 100644 index 000000000..4a8d55f73 --- /dev/null +++ b/mod/src/main/java/basemod/ModAchievement.java @@ -0,0 +1,46 @@ +package basemod; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.screens.stats.AchievementItem; + +public class ModAchievement extends AchievementItem { + private TextureAtlas.AtlasRegion unlockedImg; + private TextureAtlas.AtlasRegion lockedImg; + public TextureAtlas.AtlasRegion currentImg; + private static final Color LOCKED_COLOR = new Color(1.0F, 1.0F, 1.0F, 0.8F); + public TextureAtlas atlas; + + public ModAchievement(String title, String desc, String key, boolean hidden, TextureAtlas.AtlasRegion unlockedImage, TextureAtlas.AtlasRegion lockedImage, TextureAtlas atlas) { + super(title, desc, "", key, hidden); + this.unlockedImg = unlockedImage; + this.lockedImg = lockedImage; + this.currentImg = lockedImage; + this.atlas = atlas; + } + + public void reloadImg() { + if (this.isUnlocked) { + this.unlockedImg = this.atlas.findRegion(this.unlockedImg.name); + } else { + this.lockedImg = this.atlas.findRegion(this.lockedImg.name); + } + } + + public void render(SpriteBatch sb, float x, float y) { + TextureAtlas.AtlasRegion currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; + this.currentImg = currentImg; + Color currentColor = this.isUnlocked ? Color.WHITE : LOCKED_COLOR; + sb.setColor(currentColor); + if (this.hb.hovered) { + sb.draw(currentImg, x - (float)currentImg.packedWidth / 2.0F, y - (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth / 2.0F, (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth, (float)currentImg.packedHeight, Settings.scale * 1.1F, Settings.scale * 1.1F, 0.0F); + } else { + sb.draw(currentImg, x - (float)currentImg.packedWidth / 2.0F, y - (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth / 2.0F, (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth, (float)currentImg.packedHeight, Settings.scale, Settings.scale, 0.0F); + } + + this.hb.move(x, y); + this.hb.render(sb); + } +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/ModAchievementUnlocker.java b/mod/src/main/java/basemod/ModAchievementUnlocker.java new file mode 100644 index 000000000..beba8fcf3 --- /dev/null +++ b/mod/src/main/java/basemod/ModAchievementUnlocker.java @@ -0,0 +1,19 @@ +package basemod; + +import com.megacrit.cardcrawl.core.CardCrawlGame; +import com.megacrit.cardcrawl.core.Settings; + +import static com.megacrit.cardcrawl.unlock.UnlockTracker.achievementPref; + +public class ModAchievementUnlocker { + public static void unlockAchievement(String key) { + if (!Settings.isShowBuild && Settings.isStandardRun()) { + CardCrawlGame.publisherIntegration.unlockAchievement(key); + if (!achievementPref.getBoolean(key, false)) { + achievementPref.putBoolean(key, true); + } + + achievementPref.flush(); + } + } +} diff --git a/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java b/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java new file mode 100644 index 000000000..9b0c92b12 --- /dev/null +++ b/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java @@ -0,0 +1,7 @@ +package basemod.interfaces; + +import com.megacrit.cardcrawl.screens.stats.AchievementGrid; + +public interface EditAchievementsSubscriber extends ISubscriber { + void receiveEditAchievements(); +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java new file mode 100644 index 000000000..af6eefaf0 --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java @@ -0,0 +1,16 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; + +import basemod.BaseMod; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; +import com.megacrit.cardcrawl.screens.stats.AchievementGrid; + +@SpirePatch(clz = AchievementGrid.class, method = "") +public class AchievementGridConstructor { + public AchievementGridConstructor() {} + + @SpirePostfixPatch + public static void Postfix(AchievementGrid instance) { + BaseMod.publishEditAchievements(instance); + } +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java new file mode 100644 index 000000000..b46594a5f --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java @@ -0,0 +1,22 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; + +import basemod.ModAchievement; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; +import com.megacrit.cardcrawl.screens.stats.AchievementItem; + +@SpirePatch( + clz = AchievementItem.class, + method = "reloadImg" +) +public class AchievementItemReloadImg { + public AchievementItemReloadImg() { + } + + @SpirePostfixPatch + public static void Postfix(AchievementItem __instance) { + if (__instance instanceof ModAchievement) { + ((ModAchievement) __instance).currentImg = ((ModAchievement) __instance).atlas.findRegion(((ModAchievement) __instance).currentImg.name); + } + } +} diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java index eff1eb592..900508b11 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java @@ -24,4 +24,4 @@ public static void Insert(StatsScreen __instance, @ByRef float[] renderY) { int rowsNeeded = totalAchievements / 5; renderY[0] -= 180.0f * rowsNeeded * Settings.scale; } -} +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java index 2c7cd4b2d..9b7b1efc9 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java @@ -41,4 +41,4 @@ public static void Postfix(StatsScreen __instance) } } } -} +} \ No newline at end of file From 146a87453bfba11fda40aa4aad87bd9820222647 Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 10 May 2024 04:06:05 -0400 Subject: [PATCH 4/9] First draft! Achievement support for mods. No pop-up or anything fancy just yet, but adding achievements is simple. --- mod/src/main/java/basemod/BaseMod.java | 53 ++++++++++++++------------ 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index 576e96afb..fa6811809 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -1709,27 +1709,6 @@ public static List getModdedCharacters() { return CardCrawlGame.characterManager.getAllCharacters().subList(lastBaseCharacterIndex+1, CardCrawlGame.characterManager.getAllCharacters().size()); } - public static void registerAchievement(String modID, String imgName, String id, boolean isHidden, TextureAtlas atlas) { - UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(id); - String name = uiStrings.TEXT[0]; - String description = uiStrings.TEXT[1]; - - TextureAtlas.AtlasRegion achievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); - TextureAtlas.AtlasRegion achievementImageLocked = atlas.findRegion("locked/" + imgName); - - ModAchievement achievement = new ModAchievement(name, description, id, isHidden, achievementImageUnlocked, achievementImageLocked, atlas); - - if (!modAchievements.containsKey(modID)) { - modAchievements.put(modID, new ArrayList<>()); - } - modAchievements.get(modID).add(achievement); - } - - public static int getTotalAchievements() { - return modAchievements.values().stream() - .mapToInt(List::size) - .sum(); - } // add character - the String characterID *must* be the exact same as what // you put in the PlayerClass enum @@ -2130,13 +2109,37 @@ public static void saveEnergyOrbPortraitTexture(AbstractCard.CardColor color, co // Achievements // - public static void loadAchievement(AchievementGrid grid, String imgName, String id, boolean isHidden, TextureAtlas atlas) { + public static void registerAchievement(String modID, String imgName, String id, boolean isHidden, TextureAtlas atlas) { UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(id); String name = uiStrings.TEXT[0]; String description = uiStrings.TEXT[1]; - TextureAtlas.AtlasRegion AchievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); - TextureAtlas.AtlasRegion AchievementImageLocked = atlas.findRegion("locked/" + imgName); - grid.items.add(new ModAchievement(name, description, id, isHidden, AchievementImageUnlocked, AchievementImageLocked, atlas)); + + TextureAtlas.AtlasRegion achievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); + TextureAtlas.AtlasRegion achievementImageLocked = atlas.findRegion("locked/" + imgName); + + ModAchievement newAchievement = new ModAchievement(name, description, id, isHidden, achievementImageUnlocked, achievementImageLocked, atlas); + + List achievements = modAchievements.get(modID); + if (achievements == null) { + achievements = new ArrayList<>(); + modAchievements.put(modID, achievements); + } else { + // Check if an achievement with the same ID has already been added + for (ModAchievement achievement : achievements) { + if (achievement.key.equals(id)) { + // Achievement already registered, do not add it again + return; + } + } + } + achievements.add(newAchievement); + } + + + public static int getTotalAchievements() { + return modAchievements.values().stream() + .mapToInt(List::size) + .sum(); } // From 0c2e7f54aed424fa88237811915a8bf07e1a4f9d Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 10 May 2024 05:11:56 -0400 Subject: [PATCH 5/9] Fixed a bug where modded achievements would unlock, but not visually display so until the game was restarted --- mod/src/main/java/basemod/BaseMod.java | 2 +- mod/src/main/java/basemod/ModAchievement.java | 4 ++++ .../java/basemod/ModAchievementUnlocker.java | 19 ++++++++++++++++--- .../StatsScreen/AchievementItemReloadImg.java | 4 +++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index fa6811809..1a48636ee 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -248,7 +248,7 @@ public class BaseMod { private static HashMap> unlockBundles; private static HashMap> unlockCards; private static HashMap maxUnlockLevel; - private static Map> modAchievements = new HashMap<>(); + public static Map> modAchievements = new HashMap<>(); private static HashMap customSaveFields = new HashMap<>(); private static HashMap customScreens = new HashMap<>(); diff --git a/mod/src/main/java/basemod/ModAchievement.java b/mod/src/main/java/basemod/ModAchievement.java index 4a8d55f73..e6869c6e8 100644 --- a/mod/src/main/java/basemod/ModAchievement.java +++ b/mod/src/main/java/basemod/ModAchievement.java @@ -29,6 +29,10 @@ public void reloadImg() { } } + public void updateImage() { + this.currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; + } + public void render(SpriteBatch sb, float x, float y) { TextureAtlas.AtlasRegion currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; this.currentImg = currentImg; diff --git a/mod/src/main/java/basemod/ModAchievementUnlocker.java b/mod/src/main/java/basemod/ModAchievementUnlocker.java index beba8fcf3..af9ee447c 100644 --- a/mod/src/main/java/basemod/ModAchievementUnlocker.java +++ b/mod/src/main/java/basemod/ModAchievementUnlocker.java @@ -3,6 +3,9 @@ import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.core.Settings; +import java.util.List; + +import static basemod.BaseMod.modAchievements; import static com.megacrit.cardcrawl.unlock.UnlockTracker.achievementPref; public class ModAchievementUnlocker { @@ -10,10 +13,20 @@ public static void unlockAchievement(String key) { if (!Settings.isShowBuild && Settings.isStandardRun()) { CardCrawlGame.publisherIntegration.unlockAchievement(key); if (!achievementPref.getBoolean(key, false)) { + BaseMod.logger.info("Attempting to unlock achievement with key: " + key); achievementPref.putBoolean(key, true); + achievementPref.flush(); + // Find the achievement and update its image + for (List achievements : modAchievements.values()) { + for (ModAchievement achievement : achievements) { + if (achievement.key.equals(key)) { + achievement.isUnlocked = true; + achievement.updateImage(); + break; + } + } + } } - - achievementPref.flush(); } } -} +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java index b46594a5f..63ae97fcc 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java @@ -16,7 +16,9 @@ public AchievementItemReloadImg() { @SpirePostfixPatch public static void Postfix(AchievementItem __instance) { if (__instance instanceof ModAchievement) { - ((ModAchievement) __instance).currentImg = ((ModAchievement) __instance).atlas.findRegion(((ModAchievement) __instance).currentImg.name); + ModAchievement modAchievement = (ModAchievement) __instance; + modAchievement.updateImage(); // Ensure this method switches images based on isUnlocked } } } + From e553ec92b68d53787ea818d0ff2823680bdf2fac Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 10 May 2024 05:19:50 -0400 Subject: [PATCH 6/9] Removed AI comments --- mod/src/main/java/basemod/ModAchievementUnlocker.java | 2 +- .../screens/stats/StatsScreen/AchievementItemReloadImg.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/src/main/java/basemod/ModAchievementUnlocker.java b/mod/src/main/java/basemod/ModAchievementUnlocker.java index af9ee447c..21a77fcaa 100644 --- a/mod/src/main/java/basemod/ModAchievementUnlocker.java +++ b/mod/src/main/java/basemod/ModAchievementUnlocker.java @@ -16,7 +16,7 @@ public static void unlockAchievement(String key) { BaseMod.logger.info("Attempting to unlock achievement with key: " + key); achievementPref.putBoolean(key, true); achievementPref.flush(); - // Find the achievement and update its image + for (List achievements : modAchievements.values()) { for (ModAchievement achievement : achievements) { if (achievement.key.equals(key)) { diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java index 63ae97fcc..9afc4b14b 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java @@ -17,7 +17,7 @@ public AchievementItemReloadImg() { public static void Postfix(AchievementItem __instance) { if (__instance instanceof ModAchievement) { ModAchievement modAchievement = (ModAchievement) __instance; - modAchievement.updateImage(); // Ensure this method switches images based on isUnlocked + modAchievement.updateImage(); } } } From a5265a6212086b8f2cb3935660dab75db155cf7b Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Tue, 11 Jun 2024 22:24:50 -0400 Subject: [PATCH 7/9] Removed comment and publisher integration --- mod/src/main/java/basemod/ModAchievementUnlocker.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/mod/src/main/java/basemod/ModAchievementUnlocker.java b/mod/src/main/java/basemod/ModAchievementUnlocker.java index 21a77fcaa..de62def00 100644 --- a/mod/src/main/java/basemod/ModAchievementUnlocker.java +++ b/mod/src/main/java/basemod/ModAchievementUnlocker.java @@ -1,6 +1,5 @@ package basemod; -import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.core.Settings; import java.util.List; @@ -11,9 +10,7 @@ public class ModAchievementUnlocker { public static void unlockAchievement(String key) { if (!Settings.isShowBuild && Settings.isStandardRun()) { - CardCrawlGame.publisherIntegration.unlockAchievement(key); if (!achievementPref.getBoolean(key, false)) { - BaseMod.logger.info("Attempting to unlock achievement with key: " + key); achievementPref.putBoolean(key, true); achievementPref.flush(); From b914ed9c10920711d4d966ee1eab3a2dd806da8e Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 21 Jun 2024 00:16:51 -0400 Subject: [PATCH 8/9] ACHIEVEMENTS V2 MY FRIEND --- mod/src/main/java/basemod/BaseMod.java | 79 +++++++++++-------- mod/src/main/java/basemod/ModAchievement.java | 61 +++++++++++--- .../main/java/basemod/ModAchievementGrid.java | 57 +++++++++++++ .../java/basemod/ModAchievementUnlocker.java | 29 +++---- .../EditAchievementsSubscriber.java | 2 - .../AchievementGridConstructor.java | 16 ---- .../AchievementGridRenderPatch.java | 43 ++++++++++ .../StatsScreen/AchievementItemReloadImg.java | 24 ------ .../stats/StatsScreen/AchievementOffset.java | 27 ------- .../stats/StatsScreen/UpdatePatch.java | 15 ++++ .../stats/StatsScreen/UpdateStats.java | 33 ++++---- 11 files changed, 244 insertions(+), 142 deletions(-) create mode 100644 mod/src/main/java/basemod/ModAchievementGrid.java delete mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java create mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridRenderPatch.java delete mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java delete mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java create mode 100644 mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdatePatch.java diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index 1a48636ee..f2f19e98c 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -16,7 +16,6 @@ import basemod.patches.whatmod.WhatMod; import basemod.screens.ModalChoiceScreen; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Input; import com.badlogic.gdx.Version; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -68,7 +67,7 @@ import com.megacrit.cardcrawl.screens.charSelect.CharacterOption; import com.megacrit.cardcrawl.screens.custom.CustomMod; import com.megacrit.cardcrawl.screens.custom.CustomModeCharacterButton; -import com.megacrit.cardcrawl.screens.stats.AchievementGrid; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; import com.megacrit.cardcrawl.shop.ShopScreen; import com.megacrit.cardcrawl.shop.StorePotion; import com.megacrit.cardcrawl.shop.StoreRelic; @@ -249,7 +248,7 @@ public class BaseMod { private static HashMap> unlockCards; private static HashMap maxUnlockLevel; public static Map> modAchievements = new HashMap<>(); - + public static Map modAchievementGrids = new HashMap<>(); private static HashMap customSaveFields = new HashMap<>(); private static HashMap customScreens = new HashMap<>(); @@ -259,6 +258,9 @@ public class BaseMod { private static FrameBuffer animationBuffer; private static Texture animationTexture; private static TextureRegion animationTextureRegion; + private static String achievementModID; + private static String achievementMakeID; + private static TextureAtlas achievementAtlas; public static boolean fixesEnabled = true; @@ -2109,37 +2111,48 @@ public static void saveEnergyOrbPortraitTexture(AbstractCard.CardColor color, co // Achievements // - public static void registerAchievement(String modID, String imgName, String id, boolean isHidden, TextureAtlas atlas) { - UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(id); + public static String getAchievementModID() { + return achievementModID; + } + + public static void registerAchievementGrid(String modID, TextureAtlas atlas, String headerText) { + achievementModID = modID; + achievementAtlas = atlas; + ModAchievementGrid grid = new ModAchievementGrid(modID, headerText); + modAchievementGrids.put(modID, grid); + } + + public static void registerAchievement(String id, boolean isHidden) { + if (achievementModID == null || achievementAtlas == null) { + throw new IllegalStateException("You must call registerAchievementGrid before registering achievements."); + } + + String fullID = achievementModID + ":" + id; + UIStrings uiStrings = CardCrawlGame.languagePack.getUIString(fullID); String name = uiStrings.TEXT[0]; String description = uiStrings.TEXT[1]; + TextureAtlas.AtlasRegion achievementImageUnlocked = achievementAtlas.findRegion("unlocked/" + id); + TextureAtlas.AtlasRegion achievementImageLocked = achievementAtlas.findRegion("locked/" + id); - TextureAtlas.AtlasRegion achievementImageUnlocked = atlas.findRegion("unlocked/" + imgName); - TextureAtlas.AtlasRegion achievementImageLocked = atlas.findRegion("locked/" + imgName); + if (achievementImageUnlocked == null || achievementImageLocked == null) { + BaseMod.logger.info("Failed to find achievement images for: " + fullID); + return; // Skip adding this achievement + } - ModAchievement newAchievement = new ModAchievement(name, description, id, isHidden, achievementImageUnlocked, achievementImageLocked, atlas); + ModAchievement newAchievement = new ModAchievement(name, description, fullID, isHidden, achievementImageUnlocked, achievementImageLocked, achievementAtlas); - List achievements = modAchievements.get(modID); - if (achievements == null) { - achievements = new ArrayList<>(); - modAchievements.put(modID, achievements); - } else { - // Check if an achievement with the same ID has already been added - for (ModAchievement achievement : achievements) { - if (achievement.key.equals(id)) { - // Achievement already registered, do not add it again - return; - } - } + ModAchievementGrid grid = modAchievementGrids.get(achievementModID); + if (grid == null) { + throw new IllegalStateException("Achievement grid for " + achievementModID + " not found. Make sure to call registerAchievementGrid first."); } - achievements.add(newAchievement); - } + for (ModAchievement achievement : grid.items) { + if (achievement.key.equals(fullID)) { + return; // Achievement already exists, skip adding + } + } - public static int getTotalAchievements() { - return modAchievements.values().stream() - .mapToInt(List::size) - .sum(); + grid.items.add(newAchievement); } // @@ -2736,16 +2749,18 @@ public static void publishEditKeywords() { } unsubscribeLaterHelper(EditKeywordsSubscriber.class); } - public static void publishEditAchievements(AchievementGrid grid) { + public static void publishEditAchievements(StatsScreen statsScreen) { logger.info("editing achievements"); for (EditAchievementsSubscriber sub : editAchievementsSubscribers) { sub.receiveEditAchievements(); } - for (Map.Entry> entry : modAchievements.entrySet()) { - List achievements = entry.getValue(); - for (ModAchievement achievement : achievements) { - grid.items.add(achievement); - } + try { + Method calculateScrollBoundsMethod = StatsScreen.class.getDeclaredMethod("calculateScrollBounds"); + calculateScrollBoundsMethod.setAccessible(true); + calculateScrollBoundsMethod.invoke(statsScreen); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + logger.error("Failed to invoke calculateScrollBounds method: " + e.getMessage()); + e.printStackTrace(); } unsubscribeLaterHelper(EditAchievementsSubscriber.class); } diff --git a/mod/src/main/java/basemod/ModAchievement.java b/mod/src/main/java/basemod/ModAchievement.java index e6869c6e8..aedf34189 100644 --- a/mod/src/main/java/basemod/ModAchievement.java +++ b/mod/src/main/java/basemod/ModAchievement.java @@ -4,40 +4,72 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.megacrit.cardcrawl.core.Settings; -import com.megacrit.cardcrawl.screens.stats.AchievementItem; +import com.megacrit.cardcrawl.helpers.Hitbox; +import com.megacrit.cardcrawl.helpers.TipHelper; +import com.megacrit.cardcrawl.helpers.input.InputHelper; +import com.megacrit.cardcrawl.unlock.UnlockTracker; -public class ModAchievement extends AchievementItem { +public class ModAchievement { private TextureAtlas.AtlasRegion unlockedImg; private TextureAtlas.AtlasRegion lockedImg; public TextureAtlas.AtlasRegion currentImg; private static final Color LOCKED_COLOR = new Color(1.0F, 1.0F, 1.0F, 0.8F); - public TextureAtlas atlas; + private TextureAtlas atlas; + private String title; + private String desc; + public String key; + public boolean isUnlocked; + public Hitbox hb; public ModAchievement(String title, String desc, String key, boolean hidden, TextureAtlas.AtlasRegion unlockedImage, TextureAtlas.AtlasRegion lockedImage, TextureAtlas atlas) { - super(title, desc, "", key, hidden); + this.hb = new Hitbox(160.0F * Settings.scale, 160.0F * Settings.scale); + this.isUnlocked = UnlockTracker.isAchievementUnlocked(key); + this.key = key; + this.title = title; + this.desc = desc; this.unlockedImg = unlockedImage; this.lockedImg = lockedImage; this.currentImg = lockedImage; this.atlas = atlas; + if (this.unlockedImg == null || this.lockedImg == null) { + BaseMod.logger.info("Failed to load images for achievement: " + key); + } + } + + + + public String getKey() { + return key; } public void reloadImg() { if (this.isUnlocked) { - this.unlockedImg = this.atlas.findRegion(this.unlockedImg.name); + this.unlockedImg = atlas.findRegion(this.unlockedImg.name); } else { - this.lockedImg = this.atlas.findRegion(this.lockedImg.name); + this.lockedImg = atlas.findRegion(this.lockedImg.name); } } - public void updateImage() { - this.currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; - } - public void render(SpriteBatch sb, float x, float y) { + if (sb == null) { + BaseMod.logger.info("SpriteBatch is null in ModAchievement.render"); + return; + } + TextureAtlas.AtlasRegion currentImg = this.isUnlocked ? this.unlockedImg : this.lockedImg; + if (currentImg == null) { + BaseMod.logger.info("Current image is null for achievement: " + this.key); + return; + } + this.currentImg = currentImg; Color currentColor = this.isUnlocked ? Color.WHITE : LOCKED_COLOR; sb.setColor(currentColor); + + if (this.hb == null) { + this.hb = new Hitbox(160.0F * Settings.scale, 160.0F * Settings.scale); + } + if (this.hb.hovered) { sb.draw(currentImg, x - (float)currentImg.packedWidth / 2.0F, y - (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth / 2.0F, (float)currentImg.packedHeight / 2.0F, (float)currentImg.packedWidth, (float)currentImg.packedHeight, Settings.scale * 1.1F, Settings.scale * 1.1F, 0.0F); } else { @@ -47,4 +79,13 @@ public void render(SpriteBatch sb, float x, float y) { this.hb.move(x, y); this.hb.render(sb); } + + public void update() { + if (this.hb != null) { + this.hb.update(); + if (this.hb.hovered) { + TipHelper.renderGenericTip((float) InputHelper.mX + 100.0F * Settings.scale, (float)InputHelper.mY, this.title, this.desc); + } + } + } } \ No newline at end of file diff --git a/mod/src/main/java/basemod/ModAchievementGrid.java b/mod/src/main/java/basemod/ModAchievementGrid.java new file mode 100644 index 000000000..9cd51b106 --- /dev/null +++ b/mod/src/main/java/basemod/ModAchievementGrid.java @@ -0,0 +1,57 @@ +package basemod; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.unlock.UnlockTracker; + +import java.util.ArrayList; + +public class ModAchievementGrid { + public ArrayList items = new ArrayList<>(); + private static final float SPACING = 200.0F * Settings.scale; + private static final int ITEMS_PER_ROW = 5; + public String modID; + public String headerText; + + public ModAchievementGrid(String modID, String headerText) { + this.modID = modID; + this.headerText = headerText; + } + + public void updateAchievementStatus() { + for (ModAchievement item : items) { + String achievementKey = item.getKey(); + boolean isUnlocked = UnlockTracker.isAchievementUnlocked(achievementKey); + item.isUnlocked = isUnlocked; + item.reloadImg(); + } + } + + public void render(SpriteBatch sb, float renderY) { + if (items == null) { + BaseMod.logger.info("Items list is null in ModAchievementGrid for mod: " + modID); + return; + } + for (int i = 0; i < items.size(); ++i) { + ModAchievement achievement = items.get(i); + if (achievement != null) { + achievement.render(sb, 560.0F * Settings.scale + (i % ITEMS_PER_ROW) * SPACING, renderY - (i / ITEMS_PER_ROW) * SPACING + 680.0F * Settings.yScale); + } else { + BaseMod.logger.info("Null achievement found in ModAchievementGrid for mod: " + modID); + } + } + } + + public float calculateHeight() { + int numRows = (items.size() + ITEMS_PER_ROW - 1) / ITEMS_PER_ROW; + float height = numRows * SPACING + 50.0F * Settings.scale; + return height; + } + + public void update() { + updateAchievementStatus(); + for (ModAchievement item : items) { + item.update(); + } + } +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/ModAchievementUnlocker.java b/mod/src/main/java/basemod/ModAchievementUnlocker.java index de62def00..df7ac0764 100644 --- a/mod/src/main/java/basemod/ModAchievementUnlocker.java +++ b/mod/src/main/java/basemod/ModAchievementUnlocker.java @@ -1,28 +1,23 @@ package basemod; import com.megacrit.cardcrawl.core.Settings; - -import java.util.List; - -import static basemod.BaseMod.modAchievements; import static com.megacrit.cardcrawl.unlock.UnlockTracker.achievementPref; public class ModAchievementUnlocker { - public static void unlockAchievement(String key) { + public static void unlockAchievement(String id) { + String currentModID = BaseMod.getAchievementModID(); + if (currentModID == null) { + BaseMod.logger.error("Attempted to unlock achievement without a registered mod ID: " + id); + return; + } + + String fullKey = currentModID + ":" + id; + if (!Settings.isShowBuild && Settings.isStandardRun()) { - if (!achievementPref.getBoolean(key, false)) { - achievementPref.putBoolean(key, true); + if (!achievementPref.getBoolean(fullKey, false)) { + achievementPref.putBoolean(fullKey, true); achievementPref.flush(); - - for (List achievements : modAchievements.values()) { - for (ModAchievement achievement : achievements) { - if (achievement.key.equals(key)) { - achievement.isUnlocked = true; - achievement.updateImage(); - break; - } - } - } + BaseMod.logger.info("Unlocked achievement: " + fullKey); } } } diff --git a/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java b/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java index 9b0c92b12..11b4f354e 100644 --- a/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java +++ b/mod/src/main/java/basemod/interfaces/EditAchievementsSubscriber.java @@ -1,7 +1,5 @@ package basemod.interfaces; -import com.megacrit.cardcrawl.screens.stats.AchievementGrid; - public interface EditAchievementsSubscriber extends ISubscriber { void receiveEditAchievements(); } \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java deleted file mode 100644 index af6eefaf0..000000000 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridConstructor.java +++ /dev/null @@ -1,16 +0,0 @@ -package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; - -import basemod.BaseMod; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; -import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; -import com.megacrit.cardcrawl.screens.stats.AchievementGrid; - -@SpirePatch(clz = AchievementGrid.class, method = "") -public class AchievementGridConstructor { - public AchievementGridConstructor() {} - - @SpirePostfixPatch - public static void Postfix(AchievementGrid instance) { - BaseMod.publishEditAchievements(instance); - } -} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridRenderPatch.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridRenderPatch.java new file mode 100644 index 000000000..52bc0fd3c --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementGridRenderPatch.java @@ -0,0 +1,43 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; + +import basemod.BaseMod; +import basemod.ModAchievementGrid; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.evacipated.cardcrawl.modthespire.lib.*; +import com.megacrit.cardcrawl.core.Settings; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; +import javassist.CtBehavior; + +import java.util.Iterator; + +@SpirePatch(clz = StatsScreen.class, method = "renderStatScreen") +public class AchievementGridRenderPatch { + private static boolean achievementsPublished = false; + @SpireInsertPatch(locator = Locator.class, localvars = {"renderY"}) + public static void Insert(StatsScreen __instance, SpriteBatch sb, @ByRef float[] renderY) { + if (!achievementsPublished) { + BaseMod.publishEditAchievements(__instance); + achievementsPublished = true; + } + boolean firstGrid = true; + for (ModAchievementGrid grid : BaseMod.modAchievementGrids.values()) { + if (firstGrid) { + renderY[0] += 50.0F * Settings.scale; + firstGrid = false; + } + StatsScreen.renderHeader(sb, grid.headerText, 300.0F * Settings.scale, renderY[0]); + grid.render(sb, renderY[0]); + renderY[0] -= grid.calculateHeight(); + renderY[0] -= 100.0F * Settings.scale; + } + } + + private static class Locator extends SpireInsertLocator { + @Override + public int[] Locate(CtBehavior ctMethodToPatch) throws Exception { + Matcher finalMatcher = new Matcher.MethodCallMatcher(Iterator.class, "hasNext"); + return LineFinder.findInOrder(ctMethodToPatch, finalMatcher); + } + } + +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java deleted file mode 100644 index 9afc4b14b..000000000 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementItemReloadImg.java +++ /dev/null @@ -1,24 +0,0 @@ -package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; - -import basemod.ModAchievement; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; -import com.evacipated.cardcrawl.modthespire.lib.SpirePostfixPatch; -import com.megacrit.cardcrawl.screens.stats.AchievementItem; - -@SpirePatch( - clz = AchievementItem.class, - method = "reloadImg" -) -public class AchievementItemReloadImg { - public AchievementItemReloadImg() { - } - - @SpirePostfixPatch - public static void Postfix(AchievementItem __instance) { - if (__instance instanceof ModAchievement) { - ModAchievement modAchievement = (ModAchievement) __instance; - modAchievement.updateImage(); - } - } -} - diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java deleted file mode 100644 index 900508b11..000000000 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/AchievementOffset.java +++ /dev/null @@ -1,27 +0,0 @@ -package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; - -import basemod.BaseMod; -import com.evacipated.cardcrawl.modthespire.lib.ByRef; -import com.evacipated.cardcrawl.modthespire.lib.SpireInsertPatch; -import com.evacipated.cardcrawl.modthespire.lib.SpirePatch2; -import com.megacrit.cardcrawl.core.Settings; -import com.megacrit.cardcrawl.screens.stats.StatsScreen; - -@SpirePatch2( - clz = StatsScreen.class, - method = "renderStatScreen" -) -public class AchievementOffset { - - public AchievementOffset() {} - - @SpireInsertPatch( - rloc = 8, - localvars = {"renderY"} - ) - public static void Insert(StatsScreen __instance, @ByRef float[] renderY) { - int totalAchievements = BaseMod.getTotalAchievements(); - int rowsNeeded = totalAchievements / 5; - renderY[0] -= 180.0f * rowsNeeded * Settings.scale; - } -} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdatePatch.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdatePatch.java new file mode 100644 index 000000000..42fe3c16f --- /dev/null +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdatePatch.java @@ -0,0 +1,15 @@ +package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; + +import basemod.BaseMod; +import basemod.ModAchievementGrid; +import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; +import com.megacrit.cardcrawl.screens.stats.StatsScreen; + +@SpirePatch(clz = StatsScreen.class, method = "update") +public class UpdatePatch { + public static void Postfix(StatsScreen __instance) { + for (ModAchievementGrid grid : BaseMod.modAchievementGrids.values()) { + grid.update(); + } + } +} \ No newline at end of file diff --git a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java index 9b7b1efc9..235d88ae3 100644 --- a/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java +++ b/mod/src/main/java/basemod/patches/com/megacrit/cardcrawl/screens/stats/StatsScreen/UpdateStats.java @@ -1,6 +1,7 @@ package basemod.patches.com.megacrit.cardcrawl.screens.stats.StatsScreen; import basemod.BaseMod; +import basemod.ModAchievementGrid; import com.evacipated.cardcrawl.modthespire.lib.SpirePatch; import com.megacrit.cardcrawl.core.Settings; import com.megacrit.cardcrawl.screens.stats.StatsScreen; @@ -9,31 +10,35 @@ import java.lang.reflect.Field; -public class UpdateStats -{ +public class UpdateStats { public static final Logger logger = LogManager.getLogger(BaseMod.class.getName()); - public static final float SIZE_PER_CHARACTER = 400.0F; - public static final float SIZE_PER_ACHIEVEMENT_ROW = 180.0F; // Assuming each row of achievements needs 180.0F of space @SpirePatch( clz=StatsScreen.class, method="calculateScrollBounds" ) - public static class ScrollBounds - { - public static void Postfix(StatsScreen __instance) - { + public static class ScrollBounds { + public static void Postfix(StatsScreen __instance) { try { Field scrollUpperBoundField = __instance.getClass().getDeclaredField("scrollUpperBound"); scrollUpperBoundField.setAccessible(true); - + float modAchievementsHeight = 0.0F; + boolean firstGrid = true; + for (ModAchievementGrid grid : BaseMod.modAchievementGrids.values()) { + float gridHeight = grid.calculateHeight(); + modAchievementsHeight += gridHeight; + if (firstGrid) { + modAchievementsHeight -= 50.0F * Settings.scale; + firstGrid = false; + } + modAchievementsHeight += 100.0F * Settings.scale; + } int characterCount = BaseMod.getModdedCharacters().size(); - int totalAchievements = BaseMod.getTotalAchievements(); - int achievementRows = totalAchievements / 5; - - float extraHeight = (SIZE_PER_CHARACTER * characterCount + SIZE_PER_ACHIEVEMENT_ROW * achievementRows) * Settings.scale; - scrollUpperBoundField.set(__instance, scrollUpperBoundField.getFloat(__instance) + extraHeight); + float characterHeight = SIZE_PER_CHARACTER * characterCount * Settings.scale; + float currentUpperBound = scrollUpperBoundField.getFloat(__instance); + float newUpperBound = currentUpperBound + characterHeight + modAchievementsHeight; + scrollUpperBoundField.set(__instance, newUpperBound); } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { logger.error("could not calculate updated scroll bounds"); logger.error("error was: " + e.toString()); From 7737869a4f4d7e65fb48bdc187df7476a04a0e41 Mon Sep 17 00:00:00 2001 From: Cany0udance Date: Fri, 5 Jul 2024 05:13:35 -0400 Subject: [PATCH 9/9] removed "hidden" parameter --- mod/src/main/java/basemod/BaseMod.java | 4 ++-- mod/src/main/java/basemod/ModAchievement.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/src/main/java/basemod/BaseMod.java b/mod/src/main/java/basemod/BaseMod.java index f2f19e98c..8d8994847 100644 --- a/mod/src/main/java/basemod/BaseMod.java +++ b/mod/src/main/java/basemod/BaseMod.java @@ -2122,7 +2122,7 @@ public static void registerAchievementGrid(String modID, TextureAtlas atlas, Str modAchievementGrids.put(modID, grid); } - public static void registerAchievement(String id, boolean isHidden) { + public static void registerAchievement(String id) { if (achievementModID == null || achievementAtlas == null) { throw new IllegalStateException("You must call registerAchievementGrid before registering achievements."); } @@ -2139,7 +2139,7 @@ public static void registerAchievement(String id, boolean isHidden) { return; // Skip adding this achievement } - ModAchievement newAchievement = new ModAchievement(name, description, fullID, isHidden, achievementImageUnlocked, achievementImageLocked, achievementAtlas); + ModAchievement newAchievement = new ModAchievement(name, description, fullID, achievementImageUnlocked, achievementImageLocked, achievementAtlas); ModAchievementGrid grid = modAchievementGrids.get(achievementModID); if (grid == null) { diff --git a/mod/src/main/java/basemod/ModAchievement.java b/mod/src/main/java/basemod/ModAchievement.java index aedf34189..ac11d3bef 100644 --- a/mod/src/main/java/basemod/ModAchievement.java +++ b/mod/src/main/java/basemod/ModAchievement.java @@ -21,7 +21,7 @@ public class ModAchievement { public boolean isUnlocked; public Hitbox hb; - public ModAchievement(String title, String desc, String key, boolean hidden, TextureAtlas.AtlasRegion unlockedImage, TextureAtlas.AtlasRegion lockedImage, TextureAtlas atlas) { + public ModAchievement(String title, String desc, String key, TextureAtlas.AtlasRegion unlockedImage, TextureAtlas.AtlasRegion lockedImage, TextureAtlas atlas) { this.hb = new Hitbox(160.0F * Settings.scale, 160.0F * Settings.scale); this.isUnlocked = UnlockTracker.isAchievementUnlocked(key); this.key = key;