diff --git a/core/src/cz/nic/tablexia/game/GameDefinition.java b/core/src/cz/nic/tablexia/game/GameDefinition.java index a58c0962657dafa5c67e690318c8b6fad1a88b93..855035ec0925594171a970b73121fd4855ac56c3 100644 --- a/core/src/cz/nic/tablexia/game/GameDefinition.java +++ b/core/src/cz/nic/tablexia/game/GameDefinition.java @@ -47,10 +47,20 @@ public enum GameDefinition implements ApplicationEvent, IMenuItem { RUNES (7, ApplicationTextManager.ApplicationTextsAssets.GAME_RUNES_TITLE, ApplicationTextManager.ApplicationTextsAssets.GAME_RUNES_DESCRIPTION, RunesPageScreen.class, RunesGame.class, false, new RunesGameResultResolver(),ApplicationTextManager.ApplicationTextsAssets.GAME_SCORE, ApplicationTextManager.ApplicationTextsAssets.GAME_AVERAGE_SCORE), CRIME_SCENE (8, ApplicationTextManager.ApplicationTextsAssets.GAME_CRIME_SCENE_TITLE, ApplicationTextManager.ApplicationTextsAssets.GAME_CRIME_SCENE_DESCRIPTION, CrimeScenePageScreen.class, CrimeSceneGame.class, false, new CrimeSceneGame.GameResultResolver(), ApplicationTextManager.ApplicationTextsAssets.GAME_SCORE, ApplicationTextManager.ApplicationTextsAssets.GAME_AVERAGE_SCORE); - public interface GameResultResolver { - AbstractTablexiaGame.GameResult getGameCupsResult(Game game); - float getGameScoreResult(Game game); - List<GameScore> getGameScoreList(GameDifficulty difficulty, AbstractTablexiaGame.GameResult result); + public static abstract class GameResultResolver { + public abstract AbstractTablexiaGame.GameResult getGameCupsResult(Game game); + public abstract float getGameScoreResult(Game game); + public abstract List<GameScore> getGameScoreList(GameDifficulty difficulty, AbstractTablexiaGame.GameResult result); + + //Override this method if you want to use different values to sort graphs in statistics screen (eg. CrimeScene) + public float getStatisticsScore(Game game) { + return getGameScoreResult(game); + } + + //Override this method if you want to show different formatted score in graph detail dialogs in statistics screen (eg. Pursuit or CrimeScene) + public String getFormattedScoreForStatistics(Game game) { + return Integer.toString(Math.round(getGameScoreResult(game))); + } } private int gameNumber; diff --git a/core/src/cz/nic/tablexia/game/games/crime_scene/CrimeSceneGame.java b/core/src/cz/nic/tablexia/game/games/crime_scene/CrimeSceneGame.java index 23d4ca03c4ca28165d9e1e0c345195eebaaf3dcf..645ebf2e305da0c47b44082e416ef9229a68af53 100644 --- a/core/src/cz/nic/tablexia/game/games/crime_scene/CrimeSceneGame.java +++ b/core/src/cz/nic/tablexia/game/games/crime_scene/CrimeSceneGame.java @@ -108,7 +108,8 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> { private int actualRound = 1; private int wrongRounds = 0; - public static class GameResultResolver implements GameDefinition.GameResultResolver { + public static class GameResultResolver extends GameDefinition.GameResultResolver { + private static final String FORMATTED_TEXT_FOR_STATISTICS_FORMAT = "%d / %d"; @Override public AbstractTablexiaGame.GameResult getGameCupsResult(Game game) { @@ -121,6 +122,17 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> { return Float.parseFloat(game.getGameScore(SCORE_KEY_COUNT, String.valueOf(correctSounds))); } + @Override + public float getStatisticsScore(Game game) { + //Score to sort graph values in statistics is calculated as "actualScore / maxScore". So 2 cups on hard difficulty wont show up higher than 3 cups on medium difficulty. + return getGameScoreResult(game) / (float)(getMaxScoreForDifficulty(GameDifficulty.getGameDifficultyForDifficultyNumber(game.getGameDifficulty()))); + } + + @Override + public String getFormattedScoreForStatistics(Game game) { + return String.format(FORMATTED_TEXT_FOR_STATISTICS_FORMAT, Math.round(getGameScoreResult(game)), getMaxScoreForDifficulty(GameDifficulty.getGameDifficultyForDifficultyNumber(game.getGameDifficulty()))); + } + @Override public List<GameScore> getGameScoreList(GameDifficulty difficulty, GameResult result) { ArrayList gameScoreList = new ArrayList<GameScore>(1); @@ -549,14 +561,18 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> { actionsStripWidget.getSelectedActions().size() + objectsLayer.getChildren().size == getData().getSolution().size(); } - private int getMaxScore() { + private static int getMaxScoreForDifficulty(GameDifficulty gameDifficulty) { int maxScore = 0; for(int i = 0; i < MAX_ROUNDS; i++) { - maxScore += CrimeSceneDifficulty.getCrimeSceneDifficultyForGameDifficulty(getGameDifficulty()).getNumberOfObjects() + i; + maxScore += CrimeSceneDifficulty.getCrimeSceneDifficultyForGameDifficulty(gameDifficulty).getNumberOfObjects() + i; } return maxScore; } + private int getMaxScore() { + return getMaxScoreForDifficulty(getGameDifficulty()); + } + private void playAllSounds() { preparePlaySoundScreen(true); playSoundScreen.playSounds(); diff --git a/core/src/cz/nic/tablexia/game/games/crime_scene/model/ResultStars.java b/core/src/cz/nic/tablexia/game/games/crime_scene/model/ResultStars.java index be59c52d666e055424635b5f7c1bdd872415dd5d..906faed755f872724ace4d78a2cdd96c9786ac5c 100644 --- a/core/src/cz/nic/tablexia/game/games/crime_scene/model/ResultStars.java +++ b/core/src/cz/nic/tablexia/game/games/crime_scene/model/ResultStars.java @@ -48,7 +48,7 @@ public enum ResultStars { return 0; } - private int getScoreForDifficulty(GameDifficulty gameDifficulty) { + public int getScoreForDifficulty(GameDifficulty gameDifficulty) { switch(gameDifficulty) { case EASY: return easyScore; diff --git a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java index c6b8fa51d8ac134cfd749b0571c8dbe492d88984..d6c48092ac80ab48e03d9c2bbda08f8b21835ee9 100644 --- a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java +++ b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java @@ -66,7 +66,7 @@ import static com.badlogic.gdx.scenes.scene2d.actions.Actions.sequence; */ public class InTheDarknessGame extends AbstractTablexiaGame<List<MapWidget>> implements MapWidget.TileMapClickListener { - public static class GameResultResolver implements GameDefinition.GameResultResolver { + public static class GameResultResolver extends GameDefinition.GameResultResolver { public static final int ERROR_COUNT_THREE_STARS = 2; public static final int ERROR_COUNT_TWO_STARS = 4; public static final int ERROR_COUNT_ONE_STAR = 8; diff --git a/core/src/cz/nic/tablexia/game/games/kidnapping/util/KidnappingResultResolver.java b/core/src/cz/nic/tablexia/game/games/kidnapping/util/KidnappingResultResolver.java index 78f554df3b51ec32349920cdcb47cc9a0115ca59..b18ba6c30314ae2233bfcb3936c618f3d8240f16 100644 --- a/core/src/cz/nic/tablexia/game/games/kidnapping/util/KidnappingResultResolver.java +++ b/core/src/cz/nic/tablexia/game/games/kidnapping/util/KidnappingResultResolver.java @@ -6,17 +6,15 @@ import java.util.List; import cz.nic.tablexia.game.AbstractTablexiaGame; import cz.nic.tablexia.game.GameDefinition; import cz.nic.tablexia.game.difficulty.GameDifficulty; -import cz.nic.tablexia.game.games.kidnapping.KidnappingGame; import cz.nic.tablexia.game.games.kidnapping.Properties; import cz.nic.tablexia.game.games.kidnapping.model.GameState; -import cz.nic.tablexia.game.games.robbery.RobberyGame; import cz.nic.tablexia.shared.model.Game; import cz.nic.tablexia.shared.model.GameScore; /** * Created by lhoracek on 10/6/15. */ -public class KidnappingResultResolver implements GameDefinition.GameResultResolver { +public class KidnappingResultResolver extends GameDefinition.GameResultResolver { @Override public AbstractTablexiaGame.GameResult getGameCupsResult(Game game) { int[] levels = Properties.GAMERULE_CUPS[game.getGameDifficulty() - 1]; diff --git a/core/src/cz/nic/tablexia/game/games/night_watch/NightWatchGame.java b/core/src/cz/nic/tablexia/game/games/night_watch/NightWatchGame.java index 5e52bd016915392424b3172d792e4b544330daee..c02485db71db8405f6515b7d30d7a4b14c37873d 100644 --- a/core/src/cz/nic/tablexia/game/games/night_watch/NightWatchGame.java +++ b/core/src/cz/nic/tablexia/game/games/night_watch/NightWatchGame.java @@ -51,7 +51,7 @@ import cz.nic.tablexia.util.ui.dialog.components.TwoColumnContentDialogComponent * Created by Václav TarantĂk on 6.3.15. */ public class NightWatchGame extends AbstractTablexiaGame<int[][]> { - public static class GameResultResolver implements GameDefinition.GameResultResolver { + public static class GameResultResolver extends GameDefinition.GameResultResolver { @Override public GameResult getGameCupsResult(Game game) { int correctWindows = LEVELS_COUNT - Integer.valueOf(game.getGameScoreValue(SCORE_WRONG_WINDOWS)); diff --git a/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java b/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java index c24eddeec2f97b818fda9602a687a77ceddf51d1..904632d63915a953009d8f0bd66eacee7da5ccb0 100644 --- a/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java +++ b/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java @@ -66,7 +66,7 @@ import cz.nic.tablexia.util.ui.dialog.components.TwoColumnContentDialogComponent */ public class PursuitGame extends AbstractTablexiaGame<int[][]> { - public static class GameResultResolver implements GameDefinition.GameResultResolver { + public static class GameResultResolver extends GameDefinition.GameResultResolver { @Override public GameResult getGameCupsResult(Game game) { return GameRulesHelper.getNumberOfStarsForTime(GameDifficulty.getGameDifficultyForDifficultyNumber(game.getGameDifficulty()), GameDAO.getGameDuration(game, false)); @@ -83,6 +83,22 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> { gameScores.add(new GameScore(SCORE_KEY_MOVE_COUNT, Integer.toString(30))); return gameScores; } + + @Override + public String getFormattedScoreForStatistics(Game game) { + float time = getGameScoreResult(game); + + int minutes = (int) ((time / 1000) / 60); + int seconds = (int) ((time / 1000) % 60); + + if(minutes == 0) { + return seconds + "s"; + } else if (seconds == 0){ + return minutes + "m "; + } else { + return minutes + "m " + seconds + "s"; + } + } } private enum ResultMapping { diff --git a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java index 471f4d3cda892766c5336b5fba4482f931ccb6c4..c0d2377cabd6eb6bb9d4e21053d71ee22dfe1761 100644 --- a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java +++ b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java @@ -33,7 +33,7 @@ import cz.nic.tablexia.util.ui.dialog.components.TwoColumnContentDialogComponent public class RobberyGame extends AbstractTablexiaGame<GameRule> { - public static class GameResultResolver implements GameDefinition.GameResultResolver { + public static class GameResultResolver extends GameDefinition.GameResultResolver { public static final int FINAL_SCORE_THREE_STARS = 47; public static final int FINAL_SCORE_TWO_STARS = 29; public static final int FINAL_SCORE_ONE_STAR = 15; diff --git a/core/src/cz/nic/tablexia/game/games/runes/model/RunesGameResultResolver.java b/core/src/cz/nic/tablexia/game/games/runes/model/RunesGameResultResolver.java index 5a7453c850a31a501603be866584a6feceaee027..4d6dc3a8492adccbdf4ab40fa913cae48b5e09f9 100644 --- a/core/src/cz/nic/tablexia/game/games/runes/model/RunesGameResultResolver.java +++ b/core/src/cz/nic/tablexia/game/games/runes/model/RunesGameResultResolver.java @@ -12,7 +12,7 @@ import cz.nic.tablexia.shared.model.GameScore; /** * Created by Vitaliy Vashchenko on 25.4.16. */ -public class RunesGameResultResolver implements GameDefinition.GameResultResolver { +public class RunesGameResultResolver extends GameDefinition.GameResultResolver { @Override public AbstractTablexiaGame.GameResult getGameCupsResult(Game game) { int[][] CUPS = {RunesGameProperties.CUPS_EASY, RunesGameProperties.CUPS_MEDIUM, RunesGameProperties.CUPS_HARD}; diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/ShootingRangeResultResolver.java b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/ShootingRangeResultResolver.java index 83f8769a9f122b98da715050c7138022cd6867cd..b192a48c1c70a7ad8446c3fd8983806e41f09077 100644 --- a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/ShootingRangeResultResolver.java +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/ShootingRangeResultResolver.java @@ -14,7 +14,7 @@ import cz.nic.tablexia.shared.model.GameScore; /** * Created by lhoracek on 10/6/15. */ -public class ShootingRangeResultResolver implements GameDefinition.GameResultResolver { +public class ShootingRangeResultResolver extends GameDefinition.GameResultResolver { @Override public AbstractTablexiaGame.GameResult getGameCupsResult(Game game) { int[][] CUPS = {Properties.CUPS_EASY, Properties.CUPS_MEDIUM, Properties.CUPS_HARD}; diff --git a/core/src/cz/nic/tablexia/screen/statistics/StatisticsGameScoreResolver.java b/core/src/cz/nic/tablexia/screen/statistics/StatisticsGameScoreResolver.java index c1f3af4bdf59ae78979a2db45772c0cd20e9d72f..27005f9dbe012eb2a06f8c27e3102eb093760b22 100644 --- a/core/src/cz/nic/tablexia/screen/statistics/StatisticsGameScoreResolver.java +++ b/core/src/cz/nic/tablexia/screen/statistics/StatisticsGameScoreResolver.java @@ -36,7 +36,7 @@ public class StatisticsGameScoreResolver { index = 1; } lastTime = game.getGameStartTime(); - score += selectedGameDefinition.getGameResultResolver().getGameScoreResult(game); + score += selectedGameDefinition.getGameResultResolver().getStatisticsScore(game); point = score / index; index++; } @@ -81,7 +81,7 @@ public class StatisticsGameScoreResolver { public float getMaxScore(List<Game> games) { float maxScore = -Float.MAX_VALUE; for (Game game : games) { - float score = selectedGameDefinition.getGameResultResolver().getGameScoreResult(game); + float score = selectedGameDefinition.getGameResultResolver().getStatisticsScore(game); if (score > maxScore) maxScore = score; } return maxScore; @@ -90,7 +90,7 @@ public class StatisticsGameScoreResolver { public float getMinScore(List<Game> games) { float minScore = Float.MAX_VALUE; for (Game game : games) { - float score = selectedGameDefinition.getGameResultResolver().getGameScoreResult(game); + float score = selectedGameDefinition.getGameResultResolver().getStatisticsScore(game); if (score < minScore) minScore = score; } return minScore; diff --git a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java index dd9e957c98e624f65d26cf8aeb51098000d1cec2..cdd88074c640c427ab4b503dd1f3324cfec26449 100644 --- a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java +++ b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java @@ -464,7 +464,7 @@ public class StatisticsScreen extends AbstractTablexiaScreen<Void> { dateText, String.format("%s %s", ApplicationTextManager.getInstance().getText(GameDefinition.getGameDefinitionForGameNumber(game.getGameNumber()).getStatisticsAverageScoreDialogText()), - getCorrectedScore(selectedGameDefinition, averageScore))); + getCorrectedScore(selectedGameDefinition, game))); } @Override @@ -599,30 +599,8 @@ public class StatisticsScreen extends AbstractTablexiaScreen<Void> { return false; } - /**In some games is time used as score (less means better). - In order to calculate graph points, it is converted to 1/time. - This function makes the opposite to show real time. - Other scores are converted to text representing minutes and seconds */ private String getCorrectedScore(GameDefinition gameDefinition, Game game) { - return getCorrectedScore(gameDefinition, gameDefinition.getGameResultResolver().getGameScoreResult(game)); - } - - private String getCorrectedScore(GameDefinition gameDefinition, float score) { - if(gameDefinition == GameDefinition.PURSUIT) return millisecondsToTimeText(score); - return String.valueOf(Math.round(score)); - } - - private String millisecondsToTimeText(float time) { - int minutes = (int) (time/1000) / 60; - int seconds = (int) ((time/1000) % 60); - - if(minutes == 0) { - return seconds + "s"; - } else if (seconds == 0){ - return minutes + "m "; - } else { - return minutes + "m " + seconds + "s"; - } + return gameDefinition.getGameResultResolver().getFormattedScoreForStatistics(game); } /**returning absolute value of clicked position on X axis on screen*/ diff --git a/core/src/cz/nic/tablexia/screen/statistics/views/GraphPane.java b/core/src/cz/nic/tablexia/screen/statistics/views/GraphPane.java index 165d63f2e9f159d27ca43482919d41898d782879..a866c590365d9b7be45981a0e5c92ee6d3b8e2d5 100644 --- a/core/src/cz/nic/tablexia/screen/statistics/views/GraphPane.java +++ b/core/src/cz/nic/tablexia/screen/statistics/views/GraphPane.java @@ -155,7 +155,7 @@ public class GraphPane extends WidgetGroup { private void createScorePoints(List<Game> games) { for (Game game : games) { - float score = selectedGameDefinition.getGameResultResolver().getGameScoreResult(game); + float score = selectedGameDefinition.getGameResultResolver().getStatisticsScore(game); createPoint(game, score, getGamesByDifficulty(GameDifficulty.getByGame(game)).size(), games.indexOf(game), -1, null); } }