From 3aab6468401d9d3b5606089bc6c8e7a126f0dc58 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 29 Aug 2024 14:47:00 -0400 Subject: [PATCH] v2.5.0: improved badge logic, most new badges now work in seeded runs --- .../main/assets/messages/misc/misc.properties | 2 +- .../shatteredpixeldungeon/Badges.java | 74 ++++++++++--------- .../scenes/PixelScene.java | 2 +- .../shatteredpixeldungeon/ui/BadgesGrid.java | 4 +- .../shatteredpixeldungeon/ui/BadgesList.java | 2 +- 5 files changed, 46 insertions(+), 38 deletions(-) diff --git a/core/src/main/assets/messages/misc/misc.properties b/core/src/main/assets/messages/misc/misc.properties index 235f28e7d..07f4faa3c 100644 --- a/core/src/main/assets/messages/misc/misc.properties +++ b/core/src/main/assets/messages/misc/misc.properties @@ -176,7 +176,7 @@ badges$badge.researcher_5.title=Grandmaster Researcher badges$badge.researcher_5.desc=Fill in every catalog entry in your journal badges$badge.catalog_one_equipment.title=Well Equipped badges$badge.catalog_one_equipment.desc=Fill in one catalog entry for every type of equipment item in your journal -badges$badge.catalog_potions_scrolls.title=Every Glyph and Color +badges$badge.catalog_potions_scrolls.title=Fully Stocked badges$badge.catalog_potions_scrolls.desc=Identify every regular potion and scroll in one run badges$badge.all_rare_enemies.title=Big Game Hunter badges$badge.all_rare_enemies.desc=Fill in all catalog entries for rare enemies in your journal diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index eebbb2994..6ab62efc8 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -53,7 +53,14 @@ import java.util.LinkedHashMap; import java.util.List; public class Badges { - + + public enum BadgeType { + HIDDEN, //internal badges used for data tracking + LOCAL, //unlocked on a per-run basis and added to overall player profile + GLOBAL, //unlocked for the save profile only, usually over multiple runs + JOURNAL //profile-based and also tied to the journal, which means they even unlock in seeded runs + } + public enum Badge { MASTERY_WARRIOR, MASTERY_MAGE, @@ -78,14 +85,14 @@ public class Badges { FOOD_EATEN_1 ( 13 ), ITEMS_CRAFTED_1 ( 14 ), BOSS_SLAIN_1 ( 15 ), - CATALOG_ONE_EQUIPMENT ( 16, true ), + CATALOG_ONE_EQUIPMENT ( 16, BadgeType.JOURNAL ), DEATH_FROM_FIRE ( 17 ), DEATH_FROM_POISON ( 18 ), DEATH_FROM_GAS ( 19 ), DEATH_FROM_HUNGER ( 20 ), DEATH_FROM_FALLING ( 21 ), - RESEARCHER_1 ( 22, true ), - GAMES_PLAYED_1 ( 23, true ), + RESEARCHER_1 ( 22, BadgeType.JOURNAL ), + GAMES_PLAYED_1 ( 23, BadgeType.GLOBAL ), HIGH_SCORE_1 ( 24 ), //silver @@ -118,9 +125,9 @@ public class Badges { BOSS_SLAIN_1_ROGUE, BOSS_SLAIN_1_HUNTRESS, BOSS_SLAIN_1_DUELIST, - BOSS_SLAIN_1_ALL_CLASSES ( 54, true ), - RESEARCHER_2 ( 55, true ), - GAMES_PLAYED_2 ( 56, true ), + BOSS_SLAIN_1_ALL_CLASSES ( 54, BadgeType.GLOBAL ), + RESEARCHER_2 ( 55, BadgeType.JOURNAL ), + GAMES_PLAYED_2 ( 56, BadgeType.GLOBAL ), HIGH_SCORE_2 ( 57 ), //gold @@ -145,13 +152,13 @@ public class Badges { BOSS_SLAIN_4 ( 78 ), ALL_RINGS_IDENTIFIED , //still exists internally for pre-2.5 saves ALL_ARTIFACTS_IDENTIFIED , //still exists internally for pre-2.5 saves - ALL_RARE_ENEMIES ( 79, true ), + ALL_RARE_ENEMIES ( 79, BadgeType.JOURNAL ), DEATH_FROM_GRIM_TRAP ( 80 ), //also disintegration traps VICTORY ( 81 ), BOSS_CHALLENGE_1 ( 82 ), BOSS_CHALLENGE_2 ( 83 ), - RESEARCHER_3 ( 84, true ), - GAMES_PLAYED_3 ( 85, true ), + RESEARCHER_3 ( 84, BadgeType.JOURNAL ), + GAMES_PLAYED_3 ( 85, BadgeType.GLOBAL ), HIGH_SCORE_3 ( 86 ), //platinum @@ -159,7 +166,7 @@ public class Badges { LEVEL_REACHED_5 ( 97 ), HAPPY_END ( 98 ), HAPPY_END_REMAINS ( 99 ), - RODNEY ( 100, true ), + RODNEY ( 100, BadgeType.JOURNAL ), ALL_WEAPONS_IDENTIFIED , //still exists internally for pre-2.5 saves ALL_ARMOR_IDENTIFIED , //still exists internally for pre-2.5 saves ALL_WANDS_IDENTIFIED , //still exists internally for pre-2.5 saves @@ -169,8 +176,8 @@ public class Badges { VICTORY_ROGUE, VICTORY_HUNTRESS, VICTORY_DUELIST, - VICTORY_ALL_CLASSES ( 101, true ), - DEATH_FROM_ALL ( 102, true ), + VICTORY_ALL_CLASSES ( 101, BadgeType.GLOBAL ), + DEATH_FROM_ALL ( 102, BadgeType.GLOBAL ), BOSS_SLAIN_3_GLADIATOR, BOSS_SLAIN_3_BERSERKER, BOSS_SLAIN_3_WARLOCK, @@ -181,18 +188,18 @@ public class Badges { BOSS_SLAIN_3_WARDEN, BOSS_SLAIN_3_CHAMPION, BOSS_SLAIN_3_MONK, - BOSS_SLAIN_3_ALL_SUBCLASSES ( 103, true ), + BOSS_SLAIN_3_ALL_SUBCLASSES ( 103, BadgeType.GLOBAL ), BOSS_CHALLENGE_3 ( 104 ), BOSS_CHALLENGE_4 ( 105 ), - RESEARCHER_4 ( 106, true ), - GAMES_PLAYED_4 ( 107, true ), + RESEARCHER_4 ( 106, BadgeType.JOURNAL ), + GAMES_PLAYED_4 ( 107, BadgeType.GLOBAL ), HIGH_SCORE_4 ( 108 ), CHAMPION_1 ( 109 ), //diamond BOSS_CHALLENGE_5 ( 120 ), - RESEARCHER_5 ( 121, true ), - GAMES_PLAYED_5 ( 122, true ), + RESEARCHER_5 ( 121, BadgeType.JOURNAL ), + GAMES_PLAYED_5 ( 122, BadgeType.GLOBAL ), HIGH_SCORE_5 ( 123 ), CHAMPION_2 ( 124 ), CHAMPION_3 ( 125 ); @@ -200,14 +207,19 @@ public class Badges { public boolean meta; public int image; - - Badge( int image ) { - this( image, false ); + public BadgeType type; + + Badge(){ + this(-1, BadgeType.HIDDEN); } - - Badge( int image, boolean meta ) { + + Badge( int image ) { + this( image, BadgeType.LOCAL ); + } + + Badge( int image, BadgeType type ) { this.image = image; - this.meta = meta; + this.type = type; } public String title(){ @@ -217,10 +229,6 @@ public class Badges { public String desc(){ return Messages.get(this, name()+".desc"); } - - Badge() { - this( -1 ); - } } private static HashSet global; @@ -1094,14 +1102,14 @@ public class Badges { } private static void displayBadge( Badge badge ) { - - if (badge == null || !Dungeon.customSeedText.isEmpty()) { + + if (badge == null || (badge.type != BadgeType.JOURNAL && !Dungeon.customSeedText.isEmpty())) { return; } if (isUnlocked( badge )) { - if (!badge.meta) { + if (badge.type == BadgeType.LOCAL) { GLog.h( Messages.get(Badges.class, "endorsed", badge.title()) ); GLog.newLine(); } @@ -1132,7 +1140,7 @@ public class Badges { } public static void unlock( Badge badge ){ - if (!isUnlocked(badge) && Dungeon.customSeedText.isEmpty()){ + if (!isUnlocked(badge) && (badge.type == BadgeType.JOURNAL || Dungeon.customSeedText.isEmpty())){ global.add( badge ); saveNeeded = true; } @@ -1145,7 +1153,7 @@ public class Badges { Iterator iterator = badges.iterator(); while (iterator.hasNext()) { Badge badge = iterator.next(); - if ((!global && badge.meta) || badge.image == -1) { + if ((!global && badge.type != BadgeType.LOCAL) || badge.type == BadgeType.HIDDEN) { iterator.remove(); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java index 563f8f3e7..57c7b4cbf 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/PixelScene.java @@ -385,7 +385,7 @@ public class PixelScene extends Scene { } WndJournal.last_index = 4; - WndJournal.BadgesTab.global = badge.meta; + WndJournal.BadgesTab.global = badge.type != Badges.BadgeType.LOCAL; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java index 95075dd8a..b35c33f33 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesGrid.java @@ -44,7 +44,7 @@ public class BadgesGrid extends Component { for (Badges.Badge badge : Badges.filterReplacedBadges( global )) { - if (badge.image == -1) { + if (badge.type == Badges.BadgeType.HIDDEN) { continue; } @@ -57,7 +57,7 @@ public class BadgesGrid extends Component { ArrayList lockedBadges = new ArrayList<>(); for (Badges.Badge badge : Badges.Badge.values()) { - if (badge.image != -1 && !Badges.isUnlocked(badge)) { + if (badge.type != Badges.BadgeType.HIDDEN && !Badges.isUnlocked(badge)) { lockedBadges.add(badge); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java index f2ebba6e0..bbbb0ec15 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java @@ -42,7 +42,7 @@ public class BadgesList extends ScrollPane { for (Badges.Badge badge : Badges.filterReplacedBadges( global )) { - if (badge.image == -1) { + if (badge.type == Badges.BadgeType.HIDDEN) { continue; }