diff --git a/build.gradle b/build.gradle index 4dc04cc2d..ff698f062 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ allprojects { appName = 'Shattered Pixel Dungeon' appPackageName = 'com.shatteredpixel.shatteredpixeldungeon' - appVersionCode = 628 - appVersionName = '1.2.3' + appVersionCode = 630 + appVersionName = '1.3.0-ALPHA' appJavaCompatibility = JavaVersion.VERSION_1_8 diff --git a/core/src/main/assets/messages/windows/windows.properties b/core/src/main/assets/messages/windows/windows.properties index 3bde042c9..fa85c14c1 100644 --- a/core/src/main/assets/messages/windows/windows.properties +++ b/core/src/main/assets/messages/windows/windows.properties @@ -156,7 +156,7 @@ windows.wndranking.badges=Badges windows.wndranking$statstab.title=Level %1$d %2$s windows.wndranking$statstab.talents=Talents windows.wndranking$statstab.challenges=Challenges -windows.wndranking$statstab.health=Health +windows.wndranking$statstab.score=Score windows.wndranking$statstab.str=Strength windows.wndranking$statstab.duration=Game Duration windows.wndranking$statstab.depth=Maximum Depth @@ -164,7 +164,6 @@ windows.wndranking$statstab.enemies=Mobs Killed windows.wndranking$statstab.gold=Gold Collected windows.wndranking$statstab.food=Food Eaten windows.wndranking$statstab.alchemy=Items Crafted -windows.wndranking$statstab.ankhs=Ankhs Used windows.wndresurrect.title=Resurrection windows.wndresurrect.message=As you perish you can feel your ankh guiding your spirit back toward this world. It's giving you another chance to conquer the dungeon!\n\nYou can bring two of your items with you, but the rest will be left where you perished. Which items will you choose? diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java index b545e06f8..53c6cca09 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java @@ -58,6 +58,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.CityBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.HallsBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel; +import com.shatteredpixel.shatteredpixeldungeon.levels.RegularLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom; @@ -173,6 +174,8 @@ public class Dungeon { public static SparseArray> droppedItems; public static SparseArray> portedItems; + //first variable is only assigned when game is started, second is updated every time game is saved + public static int initialVersion; public static int version; public static long seed; @@ -180,7 +183,7 @@ public class Dungeon { public static void init() { - version = Game.versionCode; + initialVersion = version = Game.versionCode; challenges = SPDSettings.challenges(); mobsToChampion = -1; @@ -462,7 +465,8 @@ public class Dungeon { //chance is floors left / scrolls left return Random.Int(5 - floorThisSet) < asLeftThisSet; } - + + private static final String INIT_VER = "init_ver"; private static final String VERSION = "version"; private static final String SEED = "seed"; private static final String CUSTOM_SEED = "custom_seed"; @@ -485,8 +489,8 @@ public class Dungeon { try { Bundle bundle = new Bundle(); - version = Game.versionCode; - bundle.put( VERSION, version ); + bundle.put( INIT_VER, initialVersion ); + bundle.put( VERSION, version = Game.versionCode ); bundle.put( SEED, seed ); bundle.put( CUSTOM_SEED, usingCustomSeed ); bundle.put( CHALLENGES, challenges ); @@ -562,6 +566,7 @@ public class Dungeon { if (hero != null && (hero.isAlive() || WndResurrect.instance != null)) { Actor.fixTime(); + updateLevelExplored(); saveGame( GamesInProgress.curSlot ); saveLevel( GamesInProgress.curSlot ); @@ -578,6 +583,13 @@ public class Dungeon { Bundle bundle = FileUtils.bundleFromFile( GamesInProgress.gameFile( save ) ); + //pre-1.3.0 saves + if (bundle.contains(INIT_VER)){ + initialVersion = bundle.getInt( INIT_VER ); + } else { + initialVersion = bundle.getInt( VERSION ); + } + version = bundle.getInt( VERSION ); seed = bundle.contains( SEED ) ? bundle.getLong( SEED ) : DungeonSeed.randomSeed(); @@ -722,17 +734,28 @@ public class Dungeon { public static void fail( Class cause ) { if (WndResurrect.instance == null) { + updateLevelExplored(); + Statistics.gameWon = false; Rankings.INSTANCE.submit( false, cause ); } } public static void win( Class cause ) { + updateLevelExplored(); + Statistics.gameWon = true; + hero.belongings.identify(); Rankings.INSTANCE.submit( true, cause ); } + public static void updateLevelExplored(){ + if (branch == 0 && level instanceof RegularLevel){ + Statistics.floorsExplored.put( depth, level.isLevelExplored(depth)); + } + } + //default to recomputing based on max hero vision, in case vision just shrank/grew public static void observe(){ int dist = Math.max(Dungeon.hero.viewDistance, 8); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java index 0f96d26b2..ac48a45d2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Rankings.java @@ -30,6 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag; import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion; +import com.shatteredpixel.shatteredpixeldungeon.items.quest.CorpseDust; import com.shatteredpixel.shatteredpixeldungeon.items.rings.Ring; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; @@ -74,7 +75,7 @@ public enum Rankings { rec.armorTier = Dungeon.hero.tier(); rec.herolevel = Dungeon.hero.lvl; rec.depth = Dungeon.depth; - rec.score = score( win ); + rec.score = calculateScore(); Badges.validateHighScore( rec.score ); @@ -114,11 +115,73 @@ public enum Rankings { return (Statistics.goldCollected + Dungeon.hero.lvl * (win ? 26 : Dungeon.depth ) * 100) * (win ? 2 : 1); } + //assumes a ranking is loaded, or game is ending + public int calculateScore(){ + + if (Dungeon.initialVersion > ShatteredPixelDungeon.v1_2_3+1){ + Statistics.progressScore = Dungeon.hero.lvl * Statistics.deepestFloor * 65; + Statistics.progressScore = Math.min(Statistics.progressScore, 50_000); + + if (Statistics.heldItemValue == 0) { + for (Item i : Dungeon.hero.belongings) { + Statistics.heldItemValue += i.value(); + if (i instanceof CorpseDust && Statistics.deepestFloor >= 10){ + // in case player kept the corpse dust, for a necromancer run + Statistics.questScores[1] = 2000; + } + } + } + Statistics.treasureScore = Statistics.goldCollected + Statistics.heldItemValue; + Statistics.treasureScore = Math.min(Statistics.treasureScore, 20_000); + + int scorePerFloor = Statistics.floorsExplored.size * 50; + for (Boolean b : Statistics.floorsExplored.valueList()){ + if (b) Statistics.exploreScore += scorePerFloor; + } + + for (int i : Statistics.bossScores){ + if (i > 0) Statistics.totalBossScore += i; + } + + for (int i : Statistics.questScores){ + if (i > 0) Statistics.totalQuestScore += i; + } + + Statistics.winMultiplier = 1f; + if (Statistics.amuletObtained) Statistics.winMultiplier += 0.75f; + if (Statistics.gameWon) Statistics.winMultiplier += 0.25f; + if (Statistics.ascended) Statistics.winMultiplier += 0.25f; + + //pre v1.3.0 runs have different score calculations + //only progress and treasure score, and they are each up to 50% bigger + //win multiplier is a simple 2x if run was a win, challenge multi is the same as 1.3.0 + } else { + Statistics.progressScore = Dungeon.hero.lvl * Statistics.deepestFloor * 100; + Statistics.treasureScore = Math.min(Statistics.goldCollected, 30_000); + + Statistics.exploreScore = Statistics.totalBossScore = Statistics.totalQuestScore = 0; + + Statistics.winMultiplier = Statistics.gameWon ? 2 : 1; + + } + + Statistics.chalMultiplier = (float)Math.pow(1.25, Challenges.activeChallenges()); + Statistics.chalMultiplier = Math.round(Statistics.chalMultiplier*20f)/20f; + + Statistics.totalScore = Statistics.progressScore + Statistics.treasureScore + Statistics.exploreScore + + Statistics.totalBossScore + Statistics.totalQuestScore; + + Statistics.totalScore *= Statistics.winMultiplier * Statistics.chalMultiplier; + + return Statistics.totalScore; + } + public static final String HERO = "hero"; public static final String STATS = "stats"; public static final String BADGES = "badges"; public static final String HANDLERS = "handlers"; public static final String CHALLENGES = "challenges"; + public static final String GAME_VERSION = "game_version"; public void saveGameData(Record rec){ rec.gameData = new Bundle(); @@ -171,6 +234,8 @@ public enum Rankings { //save challenges rec.gameData.put( CHALLENGES, Dungeon.challenges ); + + rec.gameData.put( GAME_VERSION, Dungeon.initialVersion ); } public void loadGameData(Record rec){ @@ -197,6 +262,12 @@ public enum Rankings { Dungeon.challenges = data.getInt(CHALLENGES); + Dungeon.initialVersion = data.getInt(GAME_VERSION); + + if (Dungeon.initialVersion < ShatteredPixelDungeon.v1_2_3+1){ + Statistics.gameWon = rec.win; + } + rec.score = calculateScore(); } private static final String RECORDS = "records"; @@ -276,6 +347,7 @@ public enum Rankings { public Bundle gameData; public String gameID; + //Note this is for summary purposes, visible score should be re-calculated from game data public int score; public String desc(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 7e55440b9..a7709e36f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -36,12 +36,12 @@ public class ShatteredPixelDungeon extends Game { //variable constants for specific older versions of shattered, used for data conversion //versions older than v0.9.2b are no longer supported, and data from them is ignored - public static final int v0_9_2b = 531; - public static final int v0_9_3c = 557; //557 on iOS, 554 on other platforms + public static final int v0_9_2b = 531; + public static final int v0_9_3c = 557; //557 on iOS, 554 on other platforms - public static final int v1_0_3 = 574; - public static final int v1_1_2 = 587; - public static final int v1_2_0 = 609; + public static final int v1_0_3 = 574; + public static final int v1_1_2 = 587; + public static final int v1_2_3 = 627; public ShatteredPixelDungeon( PlatformSupport platform ) { super( sceneClass == null ? WelcomeScene.class : sceneClass, platform ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java index b0f7dd1ab..8b98591dc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Statistics.java @@ -22,9 +22,10 @@ package com.shatteredpixel.shatteredpixeldungeon; import com.watabou.utils.Bundle; +import com.watabou.utils.SparseArray; public class Statistics { - + public static int goldCollected; public static int deepestFloor; public static int enemiesSlain; @@ -32,7 +33,22 @@ public class Statistics { public static int itemsCrafted; public static int piranhasKilled; public static int ankhsUsed; - + + //These are used for score calculation + // some are built incrementally, most are assigned when full score is calculated + public static int progressScore; + public static int heldItemValue; + public static int treasureScore; + public static SparseArray floorsExplored = new SparseArray<>(); + public static int exploreScore; + public static int[] bossScores = new int[5]; + public static int totalBossScore; + public static int[] questScores = new int[5]; + public static int totalQuestScore; + public static float winMultiplier; + public static float chalMultiplier; + public static int totalScore; + //used for hero unlock badges public static int upgradesUsed; public static int sneakAttacks; @@ -47,6 +63,8 @@ public class Statistics { public static boolean qualifiedForBossChallengeBadge = false; public static boolean amuletObtained = false; + public static boolean gameWon = false; + public static boolean ascended = false; public static void reset() { @@ -57,6 +75,19 @@ public class Statistics { itemsCrafted = 0; piranhasKilled = 0; ankhsUsed = 0; + + progressScore = 0; + heldItemValue = 0; + treasureScore = 0; + floorsExplored = new SparseArray<>(); + exploreScore = 0; + bossScores = new int[5]; + totalBossScore = 0; + questScores = new int[5]; + totalQuestScore = 0; + winMultiplier = 1; + chalMultiplier = 1; + totalScore = 0; upgradesUsed = 0; sneakAttacks = 0; @@ -64,12 +95,14 @@ public class Statistics { spawnersAlive = 0; - duration = 0; + duration = 0; qualifiedForNoKilling = false; qualifiedForBossChallengeBadge = false; amuletObtained = false; + gameWon = false; + ascended = false; } @@ -80,6 +113,19 @@ public class Statistics { private static final String ALCHEMY = "potionsCooked"; private static final String PIRANHAS = "priranhas"; private static final String ANKHS = "ankhsUsed"; + + private static final String PROG_SCORE = "prog_score"; + private static final String ITEM_VAL = "item_val"; + private static final String TRES_SCORE = "tres_score"; + private static final String FLR_EXPL = "flr_expl"; + private static final String EXPL_SCORE = "expl_score"; + private static final String BOSS_SCORES = "boss_scores"; + private static final String TOT_BOSS = "tot_boss"; + private static final String QUEST_SCORES = "quest_scores"; + private static final String TOT_QUEST = "tot_quest"; + private static final String WIN_MULT = "win_mult"; + private static final String CHAL_MULT = "chal_mult"; + private static final String TOTAL_SCORE = "total_score"; private static final String UPGRADES = "upgradesUsed"; private static final String SNEAKS = "sneakAttacks"; @@ -92,7 +138,9 @@ public class Statistics { private static final String NO_KILLING_QUALIFIED = "qualifiedForNoKilling"; private static final String BOSS_CHALLENGE_QUALIFIED= "qualifiedForBossChallengeBadge"; - private static final String AMULET = "amuletObtained"; + private static final String AMULET = "amuletObtained"; + private static final String WON = "won"; + private static final String ASCENDED = "ascended"; public static void storeInBundle( Bundle bundle ) { bundle.put( GOLD, goldCollected ); @@ -102,6 +150,23 @@ public class Statistics { bundle.put( ALCHEMY, itemsCrafted ); bundle.put( PIRANHAS, piranhasKilled ); bundle.put( ANKHS, ankhsUsed ); + + bundle.put( PROG_SCORE, progressScore ); + bundle.put( ITEM_VAL, heldItemValue ); + bundle.put( TRES_SCORE, treasureScore ); + for (int i = 1; i < 26; i++){ + if (floorsExplored.containsKey(i)){ + bundle.put( FLR_EXPL+i, floorsExplored.get(i) ); + } + } + bundle.put( EXPL_SCORE, exploreScore ); + bundle.put( BOSS_SCORES, bossScores ); + bundle.put( TOT_BOSS, totalBossScore ); + bundle.put( QUEST_SCORES,questScores ); + bundle.put( TOT_QUEST, totalQuestScore ); + bundle.put( WIN_MULT, winMultiplier ); + bundle.put( CHAL_MULT, chalMultiplier ); + bundle.put( TOTAL_SCORE, totalScore ); bundle.put( UPGRADES, upgradesUsed ); bundle.put( SNEAKS, sneakAttacks ); @@ -112,10 +177,11 @@ public class Statistics { bundle.put( DURATION, duration ); bundle.put(NO_KILLING_QUALIFIED, qualifiedForNoKilling); - bundle.put(BOSS_CHALLENGE_QUALIFIED, qualifiedForBossChallengeBadge); bundle.put( AMULET, amuletObtained ); + bundle.put( WON, gameWon ); + bundle.put( ASCENDED, ascended ); } public static void restoreFromBundle( Bundle bundle ) { @@ -126,6 +192,26 @@ public class Statistics { itemsCrafted = bundle.getInt( ALCHEMY ); piranhasKilled = bundle.getInt( PIRANHAS ); ankhsUsed = bundle.getInt( ANKHS ); + + progressScore = bundle.getInt( PROG_SCORE ); + heldItemValue = bundle.getInt( ITEM_VAL ); + treasureScore = bundle.getInt( TRES_SCORE ); + floorsExplored.clear(); + for (int i = 1; i < 26; i++){ + if (bundle.contains( FLR_EXPL+i )){ + floorsExplored.put(i, bundle.getBoolean( FLR_EXPL+i )); + } + } + exploreScore = bundle.getInt( EXPL_SCORE ); + if (bundle.contains( BOSS_SCORES )) bossScores = bundle.getIntArray( BOSS_SCORES ); + else bossScores = new int[5]; + totalBossScore = bundle.getInt( TOT_BOSS ); + if (bundle.contains( QUEST_SCORES ))questScores = bundle.getIntArray( QUEST_SCORES ); + else questScores = new int[5]; + totalQuestScore = bundle.getInt( TOT_QUEST ); + winMultiplier = bundle.getFloat( WIN_MULT ); + chalMultiplier = bundle.getFloat( CHAL_MULT ); + totalScore = bundle.getInt( TOTAL_SCORE ); upgradesUsed = bundle.getInt( UPGRADES ); sneakAttacks = bundle.getInt( SNEAKS ); @@ -140,6 +226,8 @@ public class Statistics { qualifiedForBossChallengeBadge = bundle.getBoolean( BOSS_CHALLENGE_QUALIFIED ); amuletObtained = bundle.getBoolean( AMULET ); + gameWon = bundle.getBoolean( WON ); + ascended = bundle.getBoolean( ASCENDED ); } public static void preview( GamesInProgress.Info info, Bundle bundle ){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 5feb3e8e8..249ecf791 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -1062,6 +1062,7 @@ public class Hero extends Char { }); ready(); } else { + Statistics.ascended = true; Badges.silentValidateHappyEnd(); Dungeon.win( Amulet.class ); Dungeon.deleteGame( GamesInProgress.curSlot, true ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java index ea6274812..0a15bb31f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM300.java @@ -545,6 +545,7 @@ public class DM300 extends Mob { if (Statistics.qualifiedForBossChallengeBadge){ Badges.validateBossChallengeCompleted(); } + Statistics.bossScores[2] += 3000; LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); if (beacon != null) { @@ -653,6 +654,9 @@ public class DM300 extends Mob { Char ch = Actor.findChar(i); if (ch != null && !(ch instanceof DM300)){ Buff.prolong( ch, Paralysis.class, Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 5 : 3 ); + if (ch == Dungeon.hero){ + Statistics.bossScores[2] -= 100; + } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java index e247b40fd..ff62c813a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DwarfKing.java @@ -524,6 +524,7 @@ public class DwarfKing extends Mob { if (Statistics.qualifiedForBossChallengeBadge){ Badges.validateBossChallengeCompleted(); } + Statistics.bossScores[3] += 4000; Dungeon.level.unseal(); @@ -570,6 +571,14 @@ public class DwarfKing extends Mob { { state = HUNTING; } + + @Override + protected void zap() { + if (enemy == Dungeon.hero){ + Statistics.bossScores[3] -= 400; + } + super.zap(); + } } public static class DKGolem extends Golem { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java index 888e00917..b3ca15084 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Elemental.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Freezing; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; @@ -249,7 +250,10 @@ public abstract class Elemental extends Mob { @Override public void die(Object cause) { super.die(cause); - if (alignment == Alignment.ENEMY) Dungeon.level.drop( new Embers(), pos ).sprite.drop(); + if (alignment == Alignment.ENEMY) { + Dungeon.level.drop( new Embers(), pos ).sprite.drop(); + Statistics.questScores[1] = 2000; + } } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java index 3853881be..988092bab 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Goo.java @@ -68,7 +68,10 @@ public class Goo extends Mob { int max = (HP*2 <= HT) ? 12 : 8; if (pumpedUp > 0) { pumpedUp = 0; - Statistics.qualifiedForBossChallengeBadge = false; + if (enemy == Dungeon.hero) { + Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[0] -= 100; + } return Random.NormalIntRange( min*3, max*3 ); } else { return Random.NormalIntRange( min, max ); @@ -98,6 +101,7 @@ public class Goo extends Mob { if (Dungeon.level.water[pos] && HP < HT) { HP += healInc; + Statistics.bossScores[0] -= 10; Statistics.qualifiedForBossChallengeBadge = false; LockedFloor lock = Dungeon.hero.buff(LockedFloor.class); @@ -216,7 +220,10 @@ public class Goo extends Mob { boolean result = super.attack( enemy, dmgMulti, dmgBonus, accMulti ); if (pumpedUp > 0) { pumpedUp = 0; - Statistics.qualifiedForBossChallengeBadge = false; + if (enemy == Dungeon.hero) { + Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[0] -= 100; + } } return result; } @@ -272,6 +279,8 @@ public class Goo extends Mob { if (Statistics.qualifiedForBossChallengeBadge){ Badges.validateBossChallengeCompleted(); } + Statistics.bossScores[0] += 1050; //Goo has a 50 point gimme + Statistics.bossScores[0] = Math.min(1000, Statistics.bossScores[0]); yell( Messages.get(this, "defeated") ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Pylon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Pylon.java index 81a75dff0..3b1600112 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Pylon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Pylon.java @@ -127,6 +127,7 @@ public class Pylon extends Mob { if (ch == Dungeon.hero) { Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[2] -= 100; if (!ch.isAlive()) { Dungeon.fail(DM300.class); GLog.n(Messages.get(Electricity.class, "ondeath")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java index 6a49971c3..b09f10d05 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/RotHeart.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; @@ -101,6 +102,7 @@ public class RotHeart extends Mob { public void die(Object cause) { super.die(cause); Dungeon.level.drop( new Rotberry.Seed(), pos ).sprite.drop(); + Statistics.questScores[1] = 2000; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java index fb0645518..73f8a51d9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Tengu.java @@ -213,6 +213,7 @@ public class Tengu extends Mob { if (Statistics.qualifiedForBossChallengeBadge){ Badges.validateBossChallengeCompleted(); } + Statistics.bossScores[1] += 2000; LloydsBeacon beacon = Dungeon.hero.belongings.getItem(LloydsBeacon.class); if (beacon != null) { @@ -618,6 +619,7 @@ public class Tengu extends Mob { if (ch == Dungeon.hero){ Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[1] -= 100; if (!ch.isAlive()) { Dungeon.fail(Tengu.class); @@ -850,6 +852,7 @@ public class Tengu extends Mob { } if (ch == Dungeon.hero){ Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[1] -= 100; } if (Dungeon.level.flamable[cell]){ @@ -1034,6 +1037,7 @@ public class Tengu extends Mob { if (ch == Dungeon.hero){ Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[1] -= 100; if (!ch.isAlive()) { Dungeon.fail(Tengu.class); GLog.n(Messages.get(Electricity.class, "ondeath")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java index ee007f85e..24ab2bd51 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Warlock.java @@ -99,7 +99,7 @@ public class Warlock extends Mob implements Callback { //used so resistances can differentiate between melee and magical attacks public static class DarkBolt{} - private void zap() { + protected void zap() { spend( TIME_TO_ZAP ); if (hit( this, enemy, true )) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java index 58b6de823..8bc6de19b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/YogDzewa.java @@ -220,6 +220,9 @@ public class YogDzewa extends Mob { } else { ch.damage(Random.NormalIntRange(20, 30), new Eye.DeathGaze()); } + if (ch == Dungeon.hero){ + Statistics.bossScores[4] -= 500; + } if (Dungeon.level.heroFOV[pos]) { ch.sprite.flash(); @@ -446,7 +449,7 @@ public class YogDzewa extends Mob { public void aggro(Char ch) { for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { if (Dungeon.level.distance(pos, mob.pos) <= 4 && - (mob instanceof Larva || mob instanceof RipperDemon)) { + (mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio)) { mob.aggro(ch); } } @@ -457,7 +460,7 @@ public class YogDzewa extends Mob { public void die( Object cause ) { for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { - if (mob instanceof Larva || mob instanceof RipperDemon) { + if (mob instanceof Larva || mob instanceof YogRipper || mob instanceof YogEye || mob instanceof YogScorpio) { mob.die( cause ); } } @@ -471,6 +474,7 @@ public class YogDzewa extends Mob { } else { Statistics.qualifiedForBossChallengeBadge = false; } + Statistics.bossScores[4] += 5000 + 1250*Statistics.spawnersAlive; Dungeon.level.unseal(); super.die( cause ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java index a16ff21b9..8682e995f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Blacksmith.java @@ -24,6 +24,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal; @@ -120,6 +121,7 @@ public class Blacksmith extends NPC { Quest.completed = true; Quest.reforged = false; + Statistics.questScores[2] = 3000; } } else { @@ -140,6 +142,7 @@ public class Blacksmith extends NPC { Quest.completed = true; Quest.reforged = false; + Statistics.questScores[2] = 3000; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java index 159edd863..58e6e8e1b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Ghost.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.FetidRat; @@ -339,6 +340,7 @@ public class Ghost extends NPC { GLog.n( Messages.get(Ghost.class, "find_me") ); Sample.INSTANCE.play( Assets.Sounds.GHOST ); processed = true; + Statistics.questScores[0] = 1000; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java index 461881272..c0b704911 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Imp.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Golem; @@ -247,7 +248,8 @@ public class Imp extends NPC { public static void complete() { reward = null; completed = true; - + + Statistics.questScores[3] = 4000; Notes.remove( Notes.Landmark.IMP ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java index 7d7ef881c..e5617c40f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Wandmaker.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.Statistics; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; @@ -344,6 +345,7 @@ public class Wandmaker extends NPC { wand2 = null; Notes.remove( Notes.Landmark.WANDMAKER ); + Statistics.questScores[1] = 2000; } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java index 1e03decca..551f310ad 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/Heap.java @@ -74,6 +74,7 @@ public class Heap implements Bundlable { public ItemSprite sprite; public boolean seen = false; public boolean haunted = false; + public boolean autoExplored = false; //used to determine if this heap should count for exploration bonus public LinkedList items = new LinkedList<>(); @@ -403,6 +404,7 @@ public class Heap implements Bundlable { private static final String TYPE = "type"; private static final String ITEMS = "items"; private static final String HAUNTED = "haunted"; + private static final String AUTO_EXPLORED = "auto_explored"; @SuppressWarnings("unchecked") @Override @@ -427,7 +429,7 @@ public class Heap implements Bundlable { } haunted = bundle.getBoolean( HAUNTED ); - + autoExplored = bundle.getBoolean( AUTO_EXPLORED ); } @Override @@ -437,6 +439,7 @@ public class Heap implements Bundlable { bundle.put( TYPE, type.toString() ); bundle.put( ITEMS, items ); bundle.put( HAUNTED, haunted ); + bundle.put( AUTO_EXPLORED, autoExplored ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java index 01229a0c7..b636499a2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/CavesBossLevel.java @@ -801,6 +801,7 @@ public class CavesBossLevel extends Level { //took damage while DM-300 was supercharged Statistics.qualifiedForBossChallengeBadge = false; } + Statistics.bossScores[2] -= 200; if ( !ch.isAlive()) { Dungeon.fail(DM300.class); GLog.n(Messages.get(Electricity.class, "ondeath")); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java index f4a5f0e98..b625af78d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/Level.java @@ -1250,6 +1250,10 @@ public abstract class Level implements Bundlable { } } + + public boolean isLevelExplored( int depth ){ + return false; + } public int distance( int a, int b ) { int ax = a % width(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java index 534c46260..fc733df92 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -25,11 +25,14 @@ import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob; +import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.SacrificialFire; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GoldenMimic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; +import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Statue; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; @@ -38,13 +41,17 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose; import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation; import com.shatteredpixel.shatteredpixeldungeon.items.journal.GuidePage; import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey; +import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; +import com.shatteredpixel.shatteredpixeldungeon.journal.Journal; +import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.FigureEightBuilder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LoopBuilder; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.MagicalFireRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.PitRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom; @@ -561,7 +568,57 @@ public abstract class RegularLevel extends Level { return super.fallCell( false ); } - + + @Override + public boolean isLevelExplored( int depth ) { + //A level is considered fully explored if: + + //There are no levelgen heaps which are undiscovered, in an openable container, or which contain keys + for (Heap h : heaps.valueList()){ + if (h.autoExplored) continue; + + if (!h.seen || (h.type != Heap.Type.HEAP && h.type != Heap.Type.FOR_SALE && h.type != Heap.Type.CRYSTAL_CHEST)){ + return false; + } + for (Item i : h.items){ + if (i instanceof Key){ + return false; + } + } + } + + //There is no magical fire or sacrificial fire + for (Blob b : blobs.values()){ + if (b.volume > 0 && (b instanceof MagicalFireRoom.EternalFire || b instanceof SacrificialFire)){ + return false; + } + } + + //There are no statues or mimics (unless they were made allies) + for (Mob m : mobs.toArray(new Mob[0])){ + if (m.alignment != Char.Alignment.ALLY && (m instanceof Statue || m instanceof Mimic)){ + return false; + } + } + + //There are no barricades, locked doors, or hidden doors + for (int i = 0; i < length; i++){ + if (map[i] == Terrain.BARRICADE || map[i] == Terrain.LOCKED_DOOR || map[i] == Terrain.SECRET_DOOR){ + return false; + } + } + + //There are no unused keys for this depth in the journal + for (Notes.KeyRecord rec : Notes.getRecords(Notes.KeyRecord.class)){ + if (rec.depth() == depth){ + return false; + } + } + + //Note that it is NOT required for the player to see every tile or discover every trap. + return true; + } + @Override public void storeInBundle( Bundle bundle ) { super.storeInBundle( bundle ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalChoiceRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalChoiceRoom.java index 2aa2aaa18..8d62d47b9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalChoiceRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/CrystalChoiceRoom.java @@ -125,7 +125,10 @@ public class CrystalChoiceRoom extends SpecialRoom { Generator.Category.RING, Generator.Category.ARTIFACT )); - level.drop(hidden, level.pointToCell(room2.center())).type = Heap.Type.CHEST; + Heap chest = level.drop(hidden, level.pointToCell(room2.center())); + chest.type = Heap.Type.CHEST; + //opening the chest is optional, so it doesn't count for exploration bonus + chest.autoExplored = true; level.addItemToSpawn( new CrystalKey( Dungeon.depth ) ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java index 381da71bc..23f520374 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java @@ -97,7 +97,10 @@ public class PoisonDartTrap extends Trap { finalTarget.damage(dmg, trap); if (finalTarget == Dungeon.hero){ //for the poison dart traps in the Tengu fight - Statistics.qualifiedForBossChallengeBadge = false; + if (Dungeon.depth == 10) { + Statistics.qualifiedForBossChallengeBadge = false; + Statistics.bossScores[1] -= 100; + } if (!finalTarget.isAlive()) { Dungeon.fail(trap.getClass()); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 28ec4a32f..df6a0a10f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -922,6 +922,8 @@ public class GameScene extends PixelScene { public static void add( Heap heap ) { if (scene != null) { + //heaps that aren't added as part of levelgen don't count for exploration bonus + heap.autoExplored = true; scene.addHeapSprite( heap ); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java index 609bb62df..0e611dbf9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/WelcomeScene.java @@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.scenes; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Badges; -import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Chrome; import com.shatteredpixel.shatteredpixeldungeon.GamesInProgress; import com.shatteredpixel.shatteredpixeldungeon.Rankings; @@ -32,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.effects.BannerSprites; import com.shatteredpixel.shatteredpixeldungeon.effects.Fireball; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; -import com.shatteredpixel.shatteredpixeldungeon.messages.Languages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.Archs; import com.shatteredpixel.shatteredpixeldungeon.ui.Icons; @@ -40,7 +38,6 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton; import com.shatteredpixel.shatteredpixeldungeon.windows.WndError; import com.shatteredpixel.shatteredpixeldungeon.windows.WndHardNotification; -import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.watabou.glwrap.Blending; import com.watabou.noosa.Camera; import com.watabou.noosa.ColorBlock; @@ -50,10 +47,12 @@ import com.watabou.noosa.audio.Music; import com.watabou.utils.FileUtils; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; public class WelcomeScene extends PixelScene { - private static final int LATEST_UPDATE = ShatteredPixelDungeon.v1_2_0; + private static final int LATEST_UPDATE = 630; @Override public void create() { @@ -219,6 +218,7 @@ public class WelcomeScene extends PixelScene { ShatteredPixelDungeon.reportException(e); } } + Collections.sort(Rankings.INSTANCE.records, Rankings.scoreComparator); Rankings.INSTANCE.save(); } catch (Exception e) { //if we encounter a fatal error, then just clear the rankings diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v1_X_Changes.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v1_X_Changes.java index 626a80f24..e7dc99d20 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v1_X_Changes.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/changelist/v1_X_Changes.java @@ -268,7 +268,7 @@ public class v1_X_Changes { "Several recipes have also been buffed, in addition to the cost reductions:\n\n" + "_- Scroll of Foresight_ duration up to 400 from 250\n" + "_- Scroll of Dread_ now grants 1/2 exp for defeated enemies\n" + - "_- Potion of Shrouding Fog_ gas quantity increased bt 50%\n\n" + + "_- Potion of Shrouding Fog_ gas quantity increased by 50%\n\n" + "_-_ Items and effects which create water now douse fire\n\n" + "_- Caustic Brew_ damage per turn increased by 1\n" + "_- Infernal and Blizzard Brew_ now start their gas in a 3x3 AOE\n" + diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java index 1f6730f2a..4a3e2972b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndRanking.java @@ -225,27 +225,24 @@ public class WndRanking extends WndTabbed { pos += GAP; + //TODO score breakdown page! + pos = statSlot( this, "Score", Integer.toString( Statistics.totalScore ), pos ); + + pos += GAP; + int strBonus = Dungeon.hero.STR() - Dungeon.hero.STR; if (strBonus > 0) pos = statSlot(this, Messages.get(this, "str"), Dungeon.hero.STR + " + " + strBonus, pos); else if (strBonus < 0) pos = statSlot(this, Messages.get(this, "str"), Dungeon.hero.STR + " - " + -strBonus, pos ); else pos = statSlot(this, Messages.get(this, "str"), Integer.toString(Dungeon.hero.STR), pos); - pos = statSlot( this, Messages.get(this, "health"), Integer.toString( Dungeon.hero.HT ), pos ); - - pos += GAP; - pos = statSlot( this, Messages.get(this, "duration"), Integer.toString( (int)Statistics.duration ), pos ); - - pos += GAP; - pos = statSlot( this, Messages.get(this, "depth"), Integer.toString( Statistics.deepestFloor ), pos ); + + pos += GAP; + pos = statSlot( this, Messages.get(this, "enemies"), Integer.toString( Statistics.enemiesSlain ), pos ); pos = statSlot( this, Messages.get(this, "gold"), Integer.toString( Statistics.goldCollected ), pos ); - - pos += GAP; - pos = statSlot( this, Messages.get(this, "food"), Integer.toString( Statistics.foodEaten ), pos ); pos = statSlot( this, Messages.get(this, "alchemy"), Integer.toString( Statistics.itemsCrafted ), pos ); - pos = statSlot( this, Messages.get(this, "ankhs"), Integer.toString( Statistics.ankhsUsed ), pos ); } private float statSlot( Group parent, String label, String value, float pos ) { @@ -255,7 +252,7 @@ public class WndRanking extends WndTabbed { parent.add( txt ); txt = PixelScene.renderTextBlock( value, 7 ); - txt.setPos(WIDTH * 0.7f, pos); + txt.setPos(WIDTH * 0.6f, pos); PixelScene.align(txt); parent.add( txt );