From 0c764c6505d77d239211d343c3405f2ef3f9423f Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 4 Sep 2020 18:00:13 -0400 Subject: [PATCH] v0.9.0: badges scene now shows badges that are missing --- .../shatteredpixeldungeon/Badges.java | 103 ++++++++++++------ .../scenes/BadgesScene.java | 49 +++++---- .../shatteredpixeldungeon/ui/BadgesList.java | 4 +- .../windows/WndBadge.java | 6 +- 4 files changed, 105 insertions(+), 57 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java index 0e9086eaf..f5691de49 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Badges.java @@ -36,6 +36,7 @@ import com.watabou.utils.FileUtils; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -848,12 +849,12 @@ public class Badges { saveNeeded = true; } } - - public static List filtered( boolean global ) { - - HashSet filtered = new HashSet<>(global ? Badges.global : Badges.local); - Iterator iterator = filtered.iterator(); + public static List filterReplacedBadges( boolean global ) { + + ArrayList badges = new ArrayList<>(global ? Badges.global : Badges.local); + + Iterator iterator = badges.iterator(); while (iterator.hasNext()) { Badge badge = iterator.next(); if ((!global && badge.meta) || badge.image == -1) { @@ -861,37 +862,42 @@ public class Badges { } } - leaveBest( filtered, Badge.MONSTERS_SLAIN_1, Badge.MONSTERS_SLAIN_2, Badge.MONSTERS_SLAIN_3, Badge.MONSTERS_SLAIN_4 ); - leaveBest( filtered, Badge.GOLD_COLLECTED_1, Badge.GOLD_COLLECTED_2, Badge.GOLD_COLLECTED_3, Badge.GOLD_COLLECTED_4 ); - leaveBest( filtered, Badge.BOSS_SLAIN_1, Badge.BOSS_SLAIN_2, Badge.BOSS_SLAIN_3, Badge.BOSS_SLAIN_4 ); - leaveBest( filtered, Badge.LEVEL_REACHED_1, Badge.LEVEL_REACHED_2, Badge.LEVEL_REACHED_3, Badge.LEVEL_REACHED_4 ); - leaveBest( filtered, Badge.STRENGTH_ATTAINED_1, Badge.STRENGTH_ATTAINED_2, Badge.STRENGTH_ATTAINED_3, Badge.STRENGTH_ATTAINED_4 ); - leaveBest( filtered, Badge.FOOD_EATEN_1, Badge.FOOD_EATEN_2, Badge.FOOD_EATEN_3, Badge.FOOD_EATEN_4 ); - leaveBest( filtered, Badge.ITEM_LEVEL_1, Badge.ITEM_LEVEL_2, Badge.ITEM_LEVEL_3, Badge.ITEM_LEVEL_4 ); - leaveBest( filtered, Badge.POTIONS_COOKED_1, Badge.POTIONS_COOKED_2, Badge.POTIONS_COOKED_3, Badge.POTIONS_COOKED_4 ); - leaveBest( filtered, Badge.DEATH_FROM_FIRE, Badge.YASD ); - leaveBest( filtered, Badge.DEATH_FROM_GAS, Badge.YASD ); - leaveBest( filtered, Badge.DEATH_FROM_HUNGER, Badge.YASD ); - leaveBest( filtered, Badge.DEATH_FROM_POISON, Badge.YASD ); - leaveBest( filtered, Badge.DEATH_FROM_GLYPH, Badge.YASD ); - leaveBest( filtered, Badge.DEATH_FROM_FALLING, Badge.YASD ); - leaveBest( filtered, Badge.ALL_WEAPONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_ARMOR_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_WANDS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_RINGS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_ARTIFACTS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_POTIONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.ALL_SCROLLS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); - leaveBest( filtered, Badge.GAMES_PLAYED_1, Badge.GAMES_PLAYED_2, Badge.GAMES_PLAYED_3, Badge.GAMES_PLAYED_4 ); - leaveBest( filtered, Badge.CHAMPION_1, Badge.CHAMPION_2, Badge.CHAMPION_3 ); - - ArrayList list = new ArrayList<>(filtered); - Collections.sort( list ); - - return list; + Collections.sort(badges); + + return filterReplacedBadges(badges); + } - private static void leaveBest( HashSet list, Badge...badges ) { + public static List filterReplacedBadges( List badges ) { + + leaveBest( badges, Badge.MONSTERS_SLAIN_1, Badge.MONSTERS_SLAIN_2, Badge.MONSTERS_SLAIN_3, Badge.MONSTERS_SLAIN_4 ); + leaveBest( badges, Badge.GOLD_COLLECTED_1, Badge.GOLD_COLLECTED_2, Badge.GOLD_COLLECTED_3, Badge.GOLD_COLLECTED_4 ); + leaveBest( badges, Badge.BOSS_SLAIN_1, Badge.BOSS_SLAIN_2, Badge.BOSS_SLAIN_3, Badge.BOSS_SLAIN_4 ); + leaveBest( badges, Badge.LEVEL_REACHED_1, Badge.LEVEL_REACHED_2, Badge.LEVEL_REACHED_3, Badge.LEVEL_REACHED_4 ); + leaveBest( badges, Badge.STRENGTH_ATTAINED_1, Badge.STRENGTH_ATTAINED_2, Badge.STRENGTH_ATTAINED_3, Badge.STRENGTH_ATTAINED_4 ); + leaveBest( badges, Badge.FOOD_EATEN_1, Badge.FOOD_EATEN_2, Badge.FOOD_EATEN_3, Badge.FOOD_EATEN_4 ); + leaveBest( badges, Badge.ITEM_LEVEL_1, Badge.ITEM_LEVEL_2, Badge.ITEM_LEVEL_3, Badge.ITEM_LEVEL_4 ); + leaveBest( badges, Badge.POTIONS_COOKED_1, Badge.POTIONS_COOKED_2, Badge.POTIONS_COOKED_3, Badge.POTIONS_COOKED_4 ); + leaveBest( badges, Badge.DEATH_FROM_FIRE, Badge.YASD ); + leaveBest( badges, Badge.DEATH_FROM_GAS, Badge.YASD ); + leaveBest( badges, Badge.DEATH_FROM_HUNGER, Badge.YASD ); + leaveBest( badges, Badge.DEATH_FROM_POISON, Badge.YASD ); + leaveBest( badges, Badge.DEATH_FROM_GLYPH, Badge.YASD ); + leaveBest( badges, Badge.DEATH_FROM_FALLING, Badge.YASD ); + leaveBest( badges, Badge.ALL_WEAPONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_ARMOR_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_WANDS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_RINGS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_ARTIFACTS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_POTIONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.ALL_SCROLLS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED ); + leaveBest( badges, Badge.GAMES_PLAYED_1, Badge.GAMES_PLAYED_2, Badge.GAMES_PLAYED_3, Badge.GAMES_PLAYED_4 ); + leaveBest( badges, Badge.CHAMPION_1, Badge.CHAMPION_2, Badge.CHAMPION_3 ); + + return badges; + } + + private static void leaveBest( Collection list, Badge...badges ) { for (int i=badges.length-1; i > 0; i--) { if (list.contains( badges[i])) { for (int j=0; j < i; j++) { @@ -901,4 +907,33 @@ public class Badges { } } } + + public static List filterHigherIncrementalBadges(List badges ) { + + leaveWorst( badges, Badge.MONSTERS_SLAIN_1, Badge.MONSTERS_SLAIN_2, Badge.MONSTERS_SLAIN_3, Badge.MONSTERS_SLAIN_4 ); + leaveWorst( badges, Badge.GOLD_COLLECTED_1, Badge.GOLD_COLLECTED_2, Badge.GOLD_COLLECTED_3, Badge.GOLD_COLLECTED_4 ); + leaveWorst( badges, Badge.BOSS_SLAIN_1, Badge.BOSS_SLAIN_2, Badge.BOSS_SLAIN_3, Badge.BOSS_SLAIN_4 ); + leaveWorst( badges, Badge.LEVEL_REACHED_1, Badge.LEVEL_REACHED_2, Badge.LEVEL_REACHED_3, Badge.LEVEL_REACHED_4 ); + leaveWorst( badges, Badge.STRENGTH_ATTAINED_1, Badge.STRENGTH_ATTAINED_2, Badge.STRENGTH_ATTAINED_3, Badge.STRENGTH_ATTAINED_4 ); + leaveWorst( badges, Badge.FOOD_EATEN_1, Badge.FOOD_EATEN_2, Badge.FOOD_EATEN_3, Badge.FOOD_EATEN_4 ); + leaveWorst( badges, Badge.ITEM_LEVEL_1, Badge.ITEM_LEVEL_2, Badge.ITEM_LEVEL_3, Badge.ITEM_LEVEL_4 ); + leaveWorst( badges, Badge.POTIONS_COOKED_1, Badge.POTIONS_COOKED_2, Badge.POTIONS_COOKED_3, Badge.POTIONS_COOKED_4 ); + leaveWorst( badges, Badge.GAMES_PLAYED_1, Badge.GAMES_PLAYED_2, Badge.GAMES_PLAYED_3, Badge.GAMES_PLAYED_4 ); + leaveWorst( badges, Badge.CHAMPION_1, Badge.CHAMPION_2, Badge.CHAMPION_3 ); + + Collections.sort( badges ); + + return badges; + } + + private static void leaveWorst( Collection list, Badge...badges ) { + for (int i=0; i < badges.length; i++) { + if (list.contains( badges[i])) { + for (int j=i+1; j < badges.length; j++) { + list.remove( badges[j] ); + } + break; + } + } + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java index eb0b22530..92993ff4b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/BadgesScene.java @@ -39,6 +39,7 @@ import com.watabou.noosa.audio.Sample; import com.watabou.noosa.ui.Button; import com.watabou.utils.Random; +import java.util.ArrayList; import java.util.List; public class BadgesScene extends PixelScene { @@ -73,28 +74,34 @@ public class BadgesScene extends PixelScene { Badges.loadGlobal(); - List badges = Badges.filtered( true ); + ArrayList lockedBadges = new ArrayList<>(); + for (Badges.Badge badge : Badges.Badge.values()){ + if (badge.image != -1 && !Badges.isUnlocked(badge)){ + lockedBadges.add(badge); + } + } + Badges.filterHigherIncrementalBadges(lockedBadges); - int blankBadges = 36; - blankBadges -= badges.size(); - if (badges.contains(Badges.Badge.ALL_ITEMS_IDENTIFIED)) blankBadges -= 6; - if (badges.contains(Badges.Badge.YASD)) blankBadges -= 5; - blankBadges = Math.max(0, blankBadges); + List badges = Badges.filterReplacedBadges( true ); - //guarantees a max of 5 rows in landscape, and 8 in portrait, assuming a max of 40 buttons - int nCols = landscape() ? 7 : 4; - if (badges.size() + blankBadges > 32 && !landscape()) nCols++; + int totalBadges = lockedBadges.size() + badges.size(); - int nRows = 1 + (blankBadges + badges.size())/nCols; + //4-5 columns in portrait, 6-8 in landscape + int nCols = landscape() ? 6 : 4; + if (!landscape() && totalBadges > 32) nCols++; + if (landscape() && totalBadges > 24) nCols++; + if (landscape() && totalBadges > 35) nCols++; + + int nRows = (int) Math.ceil(totalBadges/(float)nCols); float badgeWidth = (w - 2*left)/nCols; - float badgeHeight = (h - 2*top)/nRows; + float badgeHeight = (h - top - left)/nRows; - for (int i = 0; i < badges.size() + blankBadges; i++){ + for (int i = 0; i < totalBadges; i++){ int row = i / nCols; int col = i % nCols; - Badges.Badge b = i < badges.size() ? badges.get( i ) : null; - BadgeButton button = new BadgeButton( b ); + Badges.Badge b = i < badges.size() ? badges.get( i ) : lockedBadges.get( i - badges.size() ); + BadgeButton button = new BadgeButton( b, i < badges.size() ); button.setPos( left + col * badgeWidth + (badgeWidth - button.width()) / 2, top + row * badgeHeight + (badgeHeight - button.height()) / 2); @@ -125,16 +132,20 @@ public class BadgesScene extends PixelScene { private static class BadgeButton extends Button { private Badges.Badge badge; + private boolean unlocked; private Image icon; - public BadgeButton( Badges.Badge badge ) { + public BadgeButton( Badges.Badge badge, boolean unlocked ) { super(); this.badge = badge; - active = (badge != null); + this.unlocked = unlocked; - icon = active ? BadgeBanner.image(badge.image) : new Image( Assets.Interfaces.LOCKED ); + icon = BadgeBanner.image(badge.image); + if (!unlocked) { + icon.brightness(0.2f); + } add(icon); setSize( icon.width(), icon.height() ); @@ -152,7 +163,7 @@ public class BadgesScene extends PixelScene { public void update() { super.update(); - if (Random.Float() < Game.elapsed * 0.1) { + if (unlocked && Random.Float() < Game.elapsed * 0.1) { BadgeBanner.highlight( icon, badge.image ); } } @@ -160,7 +171,7 @@ public class BadgesScene extends PixelScene { @Override protected void onClick() { Sample.INSTANCE.play( Assets.Sounds.CLICK, 0.7f, 0.7f, 1.2f ); - Game.scene().add( new WndBadge( badge ) ); + Game.scene().add( new WndBadge( badge, unlocked ) ); } } } 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 6b8a29262..bc937cfca 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/BadgesList.java @@ -40,7 +40,7 @@ public class BadgesList extends ScrollPane { public BadgesList( boolean global ) { super( new Component() ); - for (Badges.Badge badge : Badges.filtered( global )) { + for (Badges.Badge badge : Badges.filterReplacedBadges( global )) { if (badge.image == -1) { continue; @@ -120,7 +120,7 @@ public class BadgesList extends ScrollPane { public boolean onClick( float x, float y ) { if (inside( x, y )) { Sample.INSTANCE.play( Assets.Sounds.CLICK, 0.7f, 0.7f, 1.2f ); - Game.scene().add( new WndBadge( badge ) ); + Game.scene().add( new WndBadge( badge, true ) ); return true; } else { return false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java index 3ee18aeb9..d2c5a08b2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndBadge.java @@ -33,18 +33,20 @@ public class WndBadge extends Window { private static final int WIDTH = 120; private static final int MARGIN = 4; - public WndBadge( Badges.Badge badge ) { + public WndBadge( Badges.Badge badge, boolean unlocked ) { super(); Image icon = BadgeBanner.image( badge.image ); icon.scale.set( 2 ); + if (!unlocked) icon.brightness(0.2f); add( icon ); RenderedTextBlock info = PixelScene.renderTextBlock( badge.desc(), 8 ); info.maxWidth(WIDTH - MARGIN * 2); info.align(RenderedTextBlock.CENTER_ALIGN); PixelScene.align(info); + if (!unlocked) info.hardlight( 0x777777 ); add(info); float w = Math.max( icon.width(), info.width() ) + MARGIN * 2; @@ -56,6 +58,6 @@ public class WndBadge extends Window { info.setPos((w - info.width()) / 2, icon.y + icon.height() + MARGIN); resize( (int)w, (int)(info.bottom() + MARGIN) ); - BadgeBanner.highlight( icon, badge.image ); + if (unlocked) BadgeBanner.highlight( icon, badge.image ); } }