v0.9.0: badges scene now shows badges that are missing
This commit is contained in:
parent
81aab79cbd
commit
0c764c6505
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user