v0.9.0: badges scene now shows badges that are missing

This commit is contained in:
Evan Debenham 2020-09-04 18:00:13 -04:00
parent 81aab79cbd
commit 0c764c6505
4 changed files with 105 additions and 57 deletions

View File

@ -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<Badge> filtered( boolean global ) {
HashSet<Badge> filtered = new HashSet<>(global ? Badges.global : Badges.local);
Iterator<Badge> iterator = filtered.iterator();
public static List<Badge> filterReplacedBadges( boolean global ) {
ArrayList<Badge> badges = new ArrayList<>(global ? Badges.global : Badges.local);
Iterator<Badge> 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<Badge> list = new ArrayList<>(filtered);
Collections.sort( list );
return list;
Collections.sort(badges);
return filterReplacedBadges(badges);
}
private static void leaveBest( HashSet<Badge> list, Badge...badges ) {
public static List<Badge> filterReplacedBadges( List<Badge> 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<Badge> 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<Badge> filterHigherIncrementalBadges(List<Badges.Badge> 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<Badge> 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;
}
}
}
}

View File

@ -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.Badge> badges = Badges.filtered( true );
ArrayList<Badges.Badge> 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.Badge> 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 ) );
}
}
}

View File

@ -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;

View File

@ -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 );
}
}