v1.3.0: fixed a few score errors and added a score breakdown window
This commit is contained in:
@@ -181,6 +181,23 @@ windows.wndsadghost.confirm=Confirm
|
|||||||
windows.wndsadghost.cancel=Cancel
|
windows.wndsadghost.cancel=Cancel
|
||||||
windows.wndsadghost.farewell=Farewell, adventurer!
|
windows.wndsadghost.farewell=Farewell, adventurer!
|
||||||
|
|
||||||
|
windows.wndscorebreakdown.title=Score Breakdown
|
||||||
|
windows.wndscorebreakdown.progress_title=Progression
|
||||||
|
windows.wndscorebreakdown.progress_desc=Based on maximum depth and hero level.
|
||||||
|
windows.wndscorebreakdown.treasure_title=Treasure
|
||||||
|
windows.wndscorebreakdown.treasure_desc=Based on gold collected and held item value.
|
||||||
|
windows.wndscorebreakdown.treasure_desc_old=Based on gold collected.
|
||||||
|
windows.wndscorebreakdown.explore_title=Exploration
|
||||||
|
windows.wndscorebreakdown.explore_desc=Based on floors with all items found, all secrets found, and all puzzles solved.
|
||||||
|
windows.wndscorebreakdown.bosses_title=Bosses
|
||||||
|
windows.wndscorebreakdown.bosses_desc=Based on bosses defeated, reduced by taking avoidable damage during boss fights.
|
||||||
|
windows.wndscorebreakdown.quests_title=Quests
|
||||||
|
windows.wndscorebreakdown.quests_desc=Based on quests completed.
|
||||||
|
windows.wndscorebreakdown.win_multiplier=Win Multiplier
|
||||||
|
windows.wndscorebreakdown.challenge_multiplier=Challenge Multiplier
|
||||||
|
windows.wndscorebreakdown.total=Total Score
|
||||||
|
windows.wndscorebreakdown.old_score_desc=Games started prior to v1.3 have fewer scoring categories, but progression is ~50% larger and treasure has a higher cap
|
||||||
|
|
||||||
windows.wndsettings$displaytab.title=Display Settings
|
windows.wndsettings$displaytab.title=Display Settings
|
||||||
windows.wndsettings$displaytab.fullscreen=Fullscreen
|
windows.wndsettings$displaytab.fullscreen=Fullscreen
|
||||||
windows.wndsettings$displaytab.saver=Power Saver
|
windows.wndsettings$displaytab.saver=Power Saver
|
||||||
|
|||||||
@@ -901,7 +901,6 @@ public class Badges {
|
|||||||
displayBadge( badge );
|
displayBadge( badge );
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO this is calibrated for scoring changes I plan to make
|
|
||||||
public static void validateHighScore( int score ){
|
public static void validateHighScore( int score ){
|
||||||
Badge badge = null;
|
Badge badge = null;
|
||||||
if (score >= 5000) {
|
if (score >= 5000) {
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ public enum Rankings {
|
|||||||
//assumes a ranking is loaded, or game is ending
|
//assumes a ranking is loaded, or game is ending
|
||||||
public int calculateScore(){
|
public int calculateScore(){
|
||||||
|
|
||||||
if (Dungeon.initialVersion > ShatteredPixelDungeon.v1_2_3+1){
|
if (Dungeon.initialVersion > ShatteredPixelDungeon.v1_2_3){
|
||||||
Statistics.progressScore = Dungeon.hero.lvl * Statistics.deepestFloor * 65;
|
Statistics.progressScore = Dungeon.hero.lvl * Statistics.deepestFloor * 65;
|
||||||
Statistics.progressScore = Math.min(Statistics.progressScore, 50_000);
|
Statistics.progressScore = Math.min(Statistics.progressScore, 50_000);
|
||||||
|
|
||||||
@@ -134,23 +134,25 @@ public enum Rankings {
|
|||||||
Statistics.treasureScore = Statistics.goldCollected + Statistics.heldItemValue;
|
Statistics.treasureScore = Statistics.goldCollected + Statistics.heldItemValue;
|
||||||
Statistics.treasureScore = Math.min(Statistics.treasureScore, 20_000);
|
Statistics.treasureScore = Math.min(Statistics.treasureScore, 20_000);
|
||||||
|
|
||||||
|
Statistics.exploreScore = 0;
|
||||||
int scorePerFloor = Statistics.floorsExplored.size * 50;
|
int scorePerFloor = Statistics.floorsExplored.size * 50;
|
||||||
for (Boolean b : Statistics.floorsExplored.valueList()){
|
for (Boolean b : Statistics.floorsExplored.valueList()){
|
||||||
if (b) Statistics.exploreScore += scorePerFloor;
|
if (b) Statistics.exploreScore += scorePerFloor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Statistics.totalBossScore = 0;
|
||||||
for (int i : Statistics.bossScores){
|
for (int i : Statistics.bossScores){
|
||||||
if (i > 0) Statistics.totalBossScore += i;
|
if (i > 0) Statistics.totalBossScore += i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Statistics.totalQuestScore = 0;
|
||||||
for (int i : Statistics.questScores){
|
for (int i : Statistics.questScores){
|
||||||
if (i > 0) Statistics.totalQuestScore += i;
|
if (i > 0) Statistics.totalQuestScore += i;
|
||||||
}
|
}
|
||||||
|
|
||||||
Statistics.winMultiplier = 1f;
|
Statistics.winMultiplier = 1f;
|
||||||
if (Statistics.amuletObtained) Statistics.winMultiplier += 0.75f;
|
if (Statistics.gameWon) Statistics.winMultiplier += 1f;
|
||||||
if (Statistics.gameWon) Statistics.winMultiplier += 0.25f;
|
if (Statistics.ascended) Statistics.winMultiplier += 0.5f;
|
||||||
if (Statistics.ascended) Statistics.winMultiplier += 0.25f;
|
|
||||||
|
|
||||||
//pre v1.3.0 runs have different score calculations
|
//pre v1.3.0 runs have different score calculations
|
||||||
//only progress and treasure score, and they are each up to 50% bigger
|
//only progress and treasure score, and they are each up to 50% bigger
|
||||||
@@ -264,7 +266,7 @@ public enum Rankings {
|
|||||||
|
|
||||||
Dungeon.initialVersion = data.getInt(GAME_VERSION);
|
Dungeon.initialVersion = data.getInt(GAME_VERSION);
|
||||||
|
|
||||||
if (Dungeon.initialVersion < ShatteredPixelDungeon.v1_2_3+1){
|
if (Dungeon.initialVersion <= ShatteredPixelDungeon.v1_2_3){
|
||||||
Statistics.gameWon = rec.win;
|
Statistics.gameWon = rec.win;
|
||||||
}
|
}
|
||||||
rec.score = calculateScore();
|
rec.score = calculateScore();
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ public class ShatteredPixelDungeon extends Game {
|
|||||||
public static final int v0_9_3c = 557; //557 on iOS, 554 on other platforms
|
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_0_3 = 574;
|
||||||
public static final int v1_1_2 = 587;
|
public static final int v1_1_2 = 588;
|
||||||
public static final int v1_2_3 = 627;
|
public static final int v1_2_3 = 628;
|
||||||
|
|
||||||
public ShatteredPixelDungeon( PlatformSupport platform ) {
|
public ShatteredPixelDungeon( PlatformSupport platform ) {
|
||||||
super( sceneClass == null ? WelcomeScene.class : sceneClass, platform );
|
super( sceneClass == null ? WelcomeScene.class : sceneClass, platform );
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesGrid;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesGrid;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesList;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.BadgesList;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton;
|
||||||
@@ -50,6 +51,7 @@ import com.watabou.noosa.audio.Sample;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Button;
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Button;
|
||||||
import com.watabou.noosa.ui.Component;
|
import com.watabou.noosa.ui.Component;
|
||||||
|
|
||||||
|
import java.text.NumberFormat;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public class WndRanking extends WndTabbed {
|
public class WndRanking extends WndTabbed {
|
||||||
@@ -225,24 +227,33 @@ public class WndRanking extends WndTabbed {
|
|||||||
|
|
||||||
pos += GAP;
|
pos += GAP;
|
||||||
|
|
||||||
//TODO score breakdown page!
|
NumberFormat num = NumberFormat.getInstance(Locale.US);
|
||||||
pos = statSlot( this, "Score", Integer.toString( Statistics.totalScore ), pos );
|
pos = statSlot( this, Messages.get(this, "score"), num.format( Statistics.totalScore ), pos );
|
||||||
|
|
||||||
|
IconButton scoreInfo = new IconButton(Icons.get(Icons.INFO)){
|
||||||
|
@Override
|
||||||
|
protected void onClick() {
|
||||||
|
super.onClick();
|
||||||
|
ShatteredPixelDungeon.scene().addToFront(new WndScoreBreakdown());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
scoreInfo.setSize(16, 16);
|
||||||
|
scoreInfo.setPos(WIDTH-scoreInfo.width(), pos-14);
|
||||||
|
add(scoreInfo);
|
||||||
pos += GAP;
|
pos += GAP;
|
||||||
|
|
||||||
int strBonus = Dungeon.hero.STR() - Dungeon.hero.STR;
|
int strBonus = Dungeon.hero.STR() - Dungeon.hero.STR;
|
||||||
if (strBonus > 0) pos = statSlot(this, Messages.get(this, "str"), Dungeon.hero.STR + " + " + strBonus, pos);
|
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 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);
|
else pos = statSlot(this, Messages.get(this, "str"), Integer.toString(Dungeon.hero.STR), pos);
|
||||||
pos = statSlot( this, Messages.get(this, "duration"), Integer.toString( (int)Statistics.duration ), pos );
|
pos = statSlot( this, Messages.get(this, "duration"), num.format( (int)Statistics.duration ), pos );
|
||||||
pos = statSlot( this, Messages.get(this, "depth"), Integer.toString( Statistics.deepestFloor ), pos );
|
pos = statSlot( this, Messages.get(this, "depth"), num.format( Statistics.deepestFloor ), pos );
|
||||||
|
|
||||||
pos += GAP;
|
pos += GAP;
|
||||||
|
|
||||||
pos = statSlot( this, Messages.get(this, "enemies"), Integer.toString( Statistics.enemiesSlain ), pos );
|
pos = statSlot( this, Messages.get(this, "enemies"), num.format( Statistics.enemiesSlain ), pos );
|
||||||
pos = statSlot( this, Messages.get(this, "gold"), Integer.toString( Statistics.goldCollected ), pos );
|
pos = statSlot( this, Messages.get(this, "gold"), num.format( Statistics.goldCollected ), pos );
|
||||||
pos = statSlot( this, Messages.get(this, "food"), Integer.toString( Statistics.foodEaten ), pos );
|
pos = statSlot( this, Messages.get(this, "food"), num.format( Statistics.foodEaten ), pos );
|
||||||
pos = statSlot( this, Messages.get(this, "alchemy"), Integer.toString( Statistics.itemsCrafted ), pos );
|
pos = statSlot( this, Messages.get(this, "alchemy"), num.format( Statistics.itemsCrafted ), pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
private float statSlot( Group parent, String label, String value, float pos ) {
|
private float statSlot( Group parent, String label, String value, float pos ) {
|
||||||
|
|||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Pixel Dungeon
|
||||||
|
* Copyright (C) 2012-2015 Oleg Dolya
|
||||||
|
*
|
||||||
|
* Shattered Pixel Dungeon
|
||||||
|
* Copyright (C) 2014-2022 Evan Debenham
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.shatteredpixel.shatteredpixeldungeon.windows;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Statistics;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.ui.Window;
|
||||||
|
import com.watabou.noosa.Group;
|
||||||
|
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class WndScoreBreakdown extends Window {
|
||||||
|
|
||||||
|
private static final int WIDTH = 115;
|
||||||
|
|
||||||
|
private int GAP = 4;
|
||||||
|
|
||||||
|
public WndScoreBreakdown(){
|
||||||
|
|
||||||
|
IconTitle title = new IconTitle( Icons.get(Icons.INFO), Messages.get(this, "title"));
|
||||||
|
title.setRect(0, 0, WIDTH, 16);
|
||||||
|
add(title);
|
||||||
|
|
||||||
|
float pos = title.bottom()+2;
|
||||||
|
|
||||||
|
NumberFormat num = NumberFormat.getInstance(Locale.US);
|
||||||
|
if (Dungeon.initialVersion > ShatteredPixelDungeon.v1_2_3) {
|
||||||
|
pos = statSlot(this, Messages.get(this, "progress_title"),
|
||||||
|
num.format(Statistics.progressScore), pos, Statistics.progressScore >= 50_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "progress_desc"), pos);
|
||||||
|
pos = statSlot(this, Messages.get(this, "treasure_title"),
|
||||||
|
num.format(Statistics.treasureScore), pos, Statistics.treasureScore >= 20_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "treasure_desc"), pos);
|
||||||
|
pos = statSlot(this, Messages.get(this, "explore_title"),
|
||||||
|
num.format(Statistics.exploreScore), pos, Statistics.exploreScore >= 20_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "explore_desc"), pos);
|
||||||
|
pos = statSlot(this, Messages.get(this, "bosses_title"),
|
||||||
|
num.format(Statistics.totalBossScore), pos, Statistics.totalBossScore >= 15_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "bosses_desc"), pos);
|
||||||
|
pos = statSlot(this, Messages.get(this, "quests_title"),
|
||||||
|
num.format(Statistics.totalQuestScore), pos, Statistics.totalQuestScore >= 10_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "quests_desc"), pos);
|
||||||
|
} else {
|
||||||
|
pos = statSlot(this, Messages.get(this, "progress_title"),
|
||||||
|
num.format(Statistics.progressScore), pos, Statistics.progressScore >= 78_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "progress_desc"), pos);
|
||||||
|
pos = statSlot(this, Messages.get(this, "treasure_title"),
|
||||||
|
num.format(Statistics.treasureScore), pos, Statistics.treasureScore >= 30_000);
|
||||||
|
pos = addInfo(this, Messages.get(this, "treasure_desc_old"), pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Statistics.winMultiplier > 1) {
|
||||||
|
pos = statSlot(this, Messages.get(this, "win_multiplier"), Statistics.winMultiplier + "x", pos, false);
|
||||||
|
}
|
||||||
|
if (Statistics.chalMultiplier > 1) {
|
||||||
|
pos = statSlot(this, Messages.get(this, "challenge_multiplier"), Statistics.chalMultiplier + "x", pos, false);
|
||||||
|
}
|
||||||
|
pos = statSlot(this, Messages.get(this, "total"), num.format(Statistics.totalScore), pos, false);
|
||||||
|
|
||||||
|
if (Dungeon.initialVersion <= ShatteredPixelDungeon.v1_2_3){
|
||||||
|
pos = addInfo(this, Messages.get(this, "old_score_desc"), pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
resize(WIDTH, (int)pos);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private float statSlot(Group parent, String label, String value, float pos, boolean highlight ) {
|
||||||
|
|
||||||
|
RenderedTextBlock txt = PixelScene.renderTextBlock( label, 7 );
|
||||||
|
if (highlight) txt.hardlight(Window.TITLE_COLOR);
|
||||||
|
txt.setPos(0, pos);
|
||||||
|
parent.add( txt );
|
||||||
|
|
||||||
|
txt = PixelScene.renderTextBlock( value, 7 );
|
||||||
|
if (highlight) txt.hardlight(Window.TITLE_COLOR);
|
||||||
|
txt.setPos(WIDTH * 0.7f, pos);
|
||||||
|
PixelScene.align(txt);
|
||||||
|
parent.add( txt );
|
||||||
|
|
||||||
|
return pos + GAP + txt.height();
|
||||||
|
}
|
||||||
|
|
||||||
|
private float addInfo(Group parent, String info, float pos){
|
||||||
|
|
||||||
|
RenderedTextBlock txt = PixelScene.renderTextBlock( info, 5 );
|
||||||
|
txt.maxWidth(WIDTH);
|
||||||
|
txt.hardlight(0x999999);
|
||||||
|
txt.setPos(0, pos-2);
|
||||||
|
parent.add( txt );
|
||||||
|
|
||||||
|
return pos - 2 + GAP + txt.height();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user