v0.9.0a: Added a check for replaced badges when badges are loaded/saved

This commit is contained in:
Evan Debenham 2020-10-08 21:52:24 -04:00
parent d14cafa190
commit 714349f769

View File

@ -211,11 +211,15 @@ public class Badges {
ShatteredPixelDungeon.reportException(e);
}
}
addReplacedBadges(badges);
return badges;
}
public static void store( Bundle bundle, HashSet<Badge> badges ) {
addReplacedBadges(badges);
int count = 0;
String names[] = new String[badges.size()];
@ -239,16 +243,6 @@ public class Badges {
Bundle bundle = FileUtils.bundleFromFile( BADGES_FILE );
global = restore( bundle );
//fixes a bug with challenge badges in pre-0.9.0 saves
if (global.contains(Badge.CHAMPION_3)){
saveNeeded = !global.contains(Badge.CHAMPION_2) || global.contains(Badge.CHAMPION_1);
global.add(Badge.CHAMPION_2);
global.add(Badge.CHAMPION_1);
} else if (global.contains(Badge.CHAMPION_2)){
saveNeeded = !global.contains(Badge.CHAMPION_1);
global.add(Badge.CHAMPION_1);
}
} catch (IOException e) {
global = new HashSet<>();
}
@ -895,6 +889,36 @@ public class Badges {
return filterReplacedBadges(badges);
}
private static final Badge[][] tierBadgeReplacements = new Badge[][]{
{Badge.MONSTERS_SLAIN_1, Badge.MONSTERS_SLAIN_2, Badge.MONSTERS_SLAIN_3, Badge.MONSTERS_SLAIN_4},
{Badge.GOLD_COLLECTED_1, Badge.GOLD_COLLECTED_2, Badge.GOLD_COLLECTED_3, Badge.GOLD_COLLECTED_4},
{Badge.ITEM_LEVEL_1, Badge.ITEM_LEVEL_2, Badge.ITEM_LEVEL_3, Badge.ITEM_LEVEL_4},
{Badge.LEVEL_REACHED_1, Badge.LEVEL_REACHED_2, Badge.LEVEL_REACHED_3, Badge.LEVEL_REACHED_4},
{Badge.STRENGTH_ATTAINED_1, Badge.STRENGTH_ATTAINED_2, Badge.STRENGTH_ATTAINED_3, Badge.STRENGTH_ATTAINED_4},
{Badge.FOOD_EATEN_1, Badge.FOOD_EATEN_2, Badge.FOOD_EATEN_3, Badge.FOOD_EATEN_4},
{Badge.POTIONS_COOKED_1, Badge.POTIONS_COOKED_2, Badge.POTIONS_COOKED_3, Badge.POTIONS_COOKED_4 },
{Badge.BOSS_SLAIN_1, Badge.BOSS_SLAIN_2, Badge.BOSS_SLAIN_3, Badge.BOSS_SLAIN_4},
{Badge.GAMES_PLAYED_1, Badge.GAMES_PLAYED_2, Badge.GAMES_PLAYED_3, Badge.GAMES_PLAYED_4},
{Badge.CHAMPION_1, Badge.CHAMPION_2, Badge.CHAMPION_3}
};
private static final Badge[][] metaBadgeReplacements = new Badge[][]{
{Badge.DEATH_FROM_FIRE, Badge.YASD},
{Badge.DEATH_FROM_GAS, Badge.YASD},
{Badge.DEATH_FROM_HUNGER, Badge.YASD},
{Badge.DEATH_FROM_POISON, Badge.YASD},
{Badge.DEATH_FROM_GLYPH, Badge.YASD},
{Badge.DEATH_FROM_FALLING, Badge.YASD },
{Badge.ALL_WEAPONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_ARMOR_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_WANDS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_RINGS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_ARTIFACTS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_POTIONS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED},
{Badge.ALL_SCROLLS_IDENTIFIED, Badge.ALL_ITEMS_IDENTIFIED}
};
public static List<Badge> filterReplacedBadges( List<Badge> badges ) {
@ -906,21 +930,16 @@ public class Badges {
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 );
for (Badge[] tierReplace : tierBadgeReplacements){
leaveBest( badges, tierReplace );
}
for (Badge[] metaReplace : metaBadgeReplacements){
leaveBest( badges, metaReplace );
}
return badges;
}
@ -938,16 +957,9 @@ 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 );
for (Badge[] tierReplace : tierBadgeReplacements){
leaveWorst( badges, tierReplace );
}
Collections.sort( badges );
@ -964,4 +976,28 @@ public class Badges {
}
}
}
public static Collection<Badge> addReplacedBadges(Collection<Badges.Badge> badges ) {
for (Badge[] tierReplace : tierBadgeReplacements){
addLower( badges, tierReplace );
}
for (Badge[] metaReplace : metaBadgeReplacements){
addLower( badges, metaReplace );
}
return badges;
}
private static void addLower( 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++) {
list.add( badges[j] );
}
break;
}
}
}
}