Skip to content
Snippets Groups Projects
Commit a3fcd965 authored by Drahomír Karchňák's avatar Drahomír Karchňák
Browse files

#429 Added new rank calculating script for V3.3 games. Also added test for...

#429 Added new rank calculating script for V3.3 games. Also added test for rank calculating scripts...
parent 3d56669f
No related branches found
No related tags found
No related merge requests found
......@@ -121,7 +121,9 @@ public class CrimeSceneGame extends AbstractTablexiaGame<CrimeSceneGameState> {
@Override
public List<GameScore> getGameScoreList(GameDifficulty difficulty, GameResult result) {
return new ArrayList<GameScore>();
ArrayList gameScoreList = new ArrayList<GameScore>(1);
gameScoreList.add(new GameScore(SCORE_KEY_COUNT, String.valueOf(ResultStars.getScoreForGameResultAndDifficulty(result, difficulty))));
return gameScoreList;
}
}
......
......@@ -34,6 +34,20 @@ public enum ResultStars {
return AbstractTablexiaGame.GameResult.NO_STAR;
}
public static int getScoreForGameResultAndDifficulty(AbstractTablexiaGame.GameResult result, GameDifficulty gameDifficulty) {
for(ResultStars star : ResultStars.values()) {
if(star.gameResult == result) {
switch (gameDifficulty) {
case EASY: return star.easyScore + 1;
case MEDIUM: return star.mediumScore + 1;
case HARD: return star.hardScore + 1;
default: return 0;
}
}
}
return 0;
}
private int getScoreForDifficulty(GameDifficulty gameDifficulty) {
switch(gameDifficulty) {
case EASY:
......
......@@ -36,6 +36,40 @@ public class RunesGameResultResolver implements GameDefinition.GameResultResolve
@Override
public List<GameScore> getGameScoreList(GameDifficulty difficulty, AbstractTablexiaGame.GameResult result) {
return new ArrayList<GameScore>();
ArrayList<GameScore> gameScoresList = new ArrayList<GameScore>(1);
int[] scoreNeeded;
int actualScore = 0;
switch (difficulty) {
case EASY:
scoreNeeded = RunesGameProperties.CUPS_EASY;
break;
case MEDIUM:
scoreNeeded = RunesGameProperties.CUPS_MEDIUM;
break;
case HARD:
scoreNeeded = RunesGameProperties.CUPS_HARD;
break;
default:
scoreNeeded = new int[] {0, 0, 0};
break;
}
switch (result) {
case ONE_STAR:
actualScore = scoreNeeded[0] + 1;
break;
case TWO_STAR:
actualScore = scoreNeeded[1] + 1;
break;
case THREE_STAR:
actualScore = scoreNeeded[2] + 1;
break;
}
gameScoresList.add(new GameScore(RunesGameProperties.SCORE_TOTAL, String.valueOf(actualScore)));
return gameScoresList;
}
}
......@@ -22,6 +22,7 @@ import java.util.Comparator;
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.model.game.GameDAO;
import cz.nic.tablexia.shared.model.Game;
......@@ -31,22 +32,53 @@ import cz.nic.tablexia.shared.model.User;
* Created by drahomir on 8/11/16.
*/
public enum RankProcessingScript {
AllVersions(Game.DEFAULT_APPLICATION_VERSION_CODE); //All versions
BEFORE_3_3(
Game.DEFAULT_APPLICATION_VERSION_CODE, //Minor version
Integer.MAX_VALUE - 10, //Major Version //TODO - Use V3.3 Version Code - 1
new GameDefinition[] { //Games in this version
GameDefinition.ROBBERY,
GameDefinition.PURSUIT,
GameDefinition.KIDNAPPING,
GameDefinition.NIGHT_WATCH,
GameDefinition.SHOOTING_RANGE,
GameDefinition.IN_THE_DARKNESS
}
),
V3_3(Integer.MAX_VALUE - 9) { //All version since 3.3 and all games available //TODO - Use V3.3 Version Code
@Override
protected void beforeRankCompute(User user, UserRankManager.RankComputeData rankComputeData, List<Game> games) {
UserRankManager.UserRank prevRank = UserRankManager.UserRank.getPreviousRank(rankComputeData.getCurrentRank());
UserRankManager.UserRank nextRank = rankComputeData.getNextRank();
rankComputeData.getRankProgress(GameDefinition.RUNES.getGameNumber()).setMinXP(prevRank.getExperiencePointsNeeded());
rankComputeData.getRankProgress(GameDefinition.RUNES.getGameNumber()).setCurrXP(prevRank.getExperiencePointsNeeded());
rankComputeData.getRankProgress(GameDefinition.RUNES.getGameNumber()).setNextXP(nextRank.getExperiencePointsNeeded());
rankComputeData.getRankProgress(GameDefinition.CRIME_SCENE.getGameNumber()).setMinXP(prevRank.getExperiencePointsNeeded());
rankComputeData.getRankProgress(GameDefinition.CRIME_SCENE.getGameNumber()).setCurrXP(prevRank.getExperiencePointsNeeded());
rankComputeData.getRankProgress(GameDefinition.CRIME_SCENE.getGameNumber()).setNextXP(nextRank.getExperiencePointsNeeded());
}
}; //All versions
long minorVersion, majorVersion;
private final int minorVersion, majorVersion;
private final GameDefinition[] games;
RankProcessingScript(long minorVersion) {
this.minorVersion = minorVersion;
this.majorVersion = Long.MAX_VALUE;
RankProcessingScript(int minorVersion) {
this(minorVersion, Integer.MAX_VALUE);
}
RankProcessingScript(long minorVersion, long majorVersion) {
RankProcessingScript(int minorVersion, int majorVersion) {
this(minorVersion, majorVersion, GameDefinition.values());
}
RankProcessingScript(int minorVersion, int majorVersion, GameDefinition[] games) {
this.minorVersion = minorVersion;
this.majorVersion = majorVersion;
this.games = games;
}
public interface RankGamesRetriever {
List<Game> getGames(User user, long minorVersion, long majorVersion);
List<Game> getGames(User user, int minorVersion, int majorVersion);
}
/**
......@@ -65,7 +97,7 @@ public enum RankProcessingScript {
Arrays.sort(rankProcessingScripts, new Comparator<RankProcessingScript>() {
@Override
public int compare(RankProcessingScript o1, RankProcessingScript o2) {
return (int) (o1.getMinorVersion() - o2.getMinorVersion());
return o1.getMinorVersion() - o2.getMinorVersion();
}
});
......@@ -76,10 +108,22 @@ public enum RankProcessingScript {
return rankComputeData;
}
public long getMinorVersion() {
public static RankProcessingScript getRankProcessingScriptForMinorAndMajor(int minor, int major) {
for(RankProcessingScript script : values()) {
if(minor >= script.getMinorVersion() && major <= script.getMajorVersion()) return script;
}
return null;
}
public int getMinorVersion() {
return minorVersion;
}
public int getMajorVersion() {
return majorVersion;
}
private static int getExperiencePoints(int cupsCount, GameDifficulty difficulty) {
return cupsCount * difficulty.getExperiencePointsMultiplier();
}
......@@ -117,10 +161,17 @@ public enum RankProcessingScript {
rankComputeData.getRankProgress(gameNumber).capRankProgress();
//Checking if user ranked up after this game
if(rankComputeData.allRankProgressesCompleted())
if(checkUserRankUp(user, rankComputeData, game))
onRankUp(user, rankComputeData, game);
}
protected boolean checkUserRankUp(User user, UserRankManager.RankComputeData rankComputeData, Game game) {
for(GameDefinition gameDefinition : games) {
if(!rankComputeData.getRankProgress(gameDefinition.getGameNumber()).isComplete()) return false;
}
return true;
}
protected void onRankUp(User user, UserRankManager.RankComputeData rankComputeData, Game game) {
rankComputeData.setCurrentRank(rankComputeData.getNextRank());
rankComputeData.setNextRank(UserRankManager.UserRank.getNextRank(rankComputeData.getCurrentRank()));
......
......@@ -193,13 +193,6 @@ public class UserRankManager {
}
}
public boolean allRankProgressesCompleted() {
for(RankProgress rankProgress : getRankProgresses()) {
if(!rankProgress.isComplete()) return false;
}
return true;
}
public Long getLastRankUp() {
return lastRankUp;
}
......@@ -333,7 +326,7 @@ public class UserRankManager {
Log.info(getClass(), "Calculating rank for: " + user.getName() + ".");
RankComputeData rankComputeData = RankProcessingScript.calculateUsersRank(user, new RankProcessingScript.RankGamesRetriever() {
@Override
public List<Game> getGames(User user, long minorVersion, long majorVersion) {
public List<Game> getGames(User user, int minorVersion, int majorVersion) {
return GameDAO.selectUserGamesForRankManager(user.getId(), minorVersion, majorVersion);
}
});
......
......@@ -358,13 +358,13 @@ public class GameDAO {
return games;
}
public static List<Game> selectUserGamesForRankManager(long userId, long minorVersion, long majorVersion) {
public static List<Game> selectUserGamesForRankManager(long userId, int minorVersion, int majorVersion) {
List<Game> games = new ArrayList<Game>();
try {
PreparedStatement statement = TablexiaStorage.getInstance().prepareStatement(GAME_SELECT_FOR_RANK_MANAGER);
statement.setLong(1, userId);
statement.setLong(2, minorVersion);
statement.setLong(3, majorVersion);
statement.setInt(2, minorVersion);
statement.setInt(3, majorVersion);
try {
ResultSet resultSet = statement.executeQuery();
......
......@@ -17,6 +17,7 @@
package cz.nic.tablexia.test.games;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
......@@ -26,10 +27,8 @@ import cz.nic.tablexia.TablexiaSettings;
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.robbery.RobberyGame;
import cz.nic.tablexia.game.ranksystem.RankProcessingScript;
import cz.nic.tablexia.game.ranksystem.UserRankManager;
import cz.nic.tablexia.model.game.GameDAO;
import cz.nic.tablexia.shared.model.Game;
import cz.nic.tablexia.shared.model.GameScore;
import cz.nic.tablexia.shared.model.User;
......@@ -38,14 +37,14 @@ import cz.nic.tablexia.shared.model.User;
* Created by drahomir on 8/17/16.
*/
public class RankSystemTest {
private static long counter = 0;
private static long gameIdCounter = 0;
public static List<GameScore> getGameScoreList(GameDefinition gameDefinition, GameDifficulty gameDifficulty, AbstractTablexiaGame.GameResult gameResult) {
return gameDefinition.getGameResultResolver().getGameScoreList(gameDifficulty, gameResult);
}
public static Game createGame(User user, GameDefinition gameDefinition, GameDifficulty gameDifficulty, AbstractTablexiaGame.GameResult gameResult) {
Game game = new Game(counter++, user, gameDifficulty.getDifficultyNumber(), gameDefinition.getGameNumber(), 0L, 1L, 2L, 0, null, 1, null, 1, TablexiaSettings.BuildType.DEBUG.getId(), TablexiaSettings.Platform.DESKTOP.getId(), "-- NONE --");
Game game = new Game(gameIdCounter++, user, gameDifficulty.getDifficultyNumber(), gameDefinition.getGameNumber(), 0L, 1L, 2L, 0, null, 0, null, 1, TablexiaSettings.BuildType.DEBUG.getId(), TablexiaSettings.Platform.DESKTOP.getId(), "-- NONE --");
game.setGameScoreMap(getGameScoreList(gameDefinition, gameDifficulty, gameResult));
return game;
}
......@@ -56,40 +55,106 @@ public class RankSystemTest {
UserRankManager.RankComputeData data = RankProcessingScript.calculateUsersRank(user, new RankProcessingScript.RankGamesRetriever() {
@Override
public List<Game> getGames(User user, long minorVersion, long majorVersion) {
public List<Game> getGames(User user, int minorVersion, int majorVersion) {
List<Game> games = new ArrayList<Game>();
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.PURSUIT, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.SHOOTING_RANGE, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
/* RANK I */
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.TWO_STAR));
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.PURSUIT, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.ONE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.SHOOTING_RANGE, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
/* RANK II */
/* NO RANK */
//PRE 3.3 GAMES
if(RankProcessingScript.getRankProcessingScriptForMinorAndMajor(minorVersion, majorVersion) == RankProcessingScript.BEFORE_3_3) {
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.PURSUIT, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.SHOOTING_RANGE, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.EASY, AbstractTablexiaGame.GameResult.THREE_STAR));
/* RANK I */
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.PURSUIT, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.SHOOTING_RANGE, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.THREE_STAR));
/* RANK II */
games.add(createGame(user, GameDefinition.ROBBERY, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.PURSUIT, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.KIDNAPPING, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.NIGHT_WATCH, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
games.add(createGame(user, GameDefinition.SHOOTING_RANGE, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
//Two games of 'in the darkness' to makes sure that experience points stay at 0 after rank up
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.ONE_STAR));
games.add(createGame(user, GameDefinition.IN_THE_DARKNESS, GameDifficulty.HARD, AbstractTablexiaGame.GameResult.THREE_STAR));
/* RANK III - Ranked up, all progress is at 0... hopefully...*/
//This games is not possible. Crime Scene wasn't available in the version described by RankProcessingScript, so rank calculating scripts should skip that.
games.add(createGame(user, GameDefinition.CRIME_SCENE, GameDifficulty.MEDIUM, AbstractTablexiaGame.GameResult.TWO_STAR));
}
if(RankProcessingScript.getRankProcessingScriptForMinorAndMajor(minorVersion, majorVersion) == RankProcessingScript.V3_3) {
//These are V3.3 games
}
return games;
}
});
//TODO - Actual values checking using assert
System.out.println(data.getCurrentRank() + " -> " + data.getNextRank());
UserRankManager.UserRank currRank = data.getCurrentRank();
UserRankManager.UserRank nextRank = data.getNextRank();
//RANK CHECK
Assert.assertEquals(currRank, UserRankManager.UserRank.RANK_III);
Assert.assertEquals(nextRank, UserRankManager.UserRank.RANK_IV);
System.out.println("Checking Rank Progress For all Games! All games should be at 0 progress!");
//Robbery
UserRankManager.RankProgress robberyRankProgress = data.getRankProgress(GameDefinition.ROBBERY.getGameNumber());
System.out.println("Robbery: " + robberyRankProgress);
checkRankProgress(robberyRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//Pursuit
UserRankManager.RankProgress pursuitRankProgress = data.getRankProgress(GameDefinition.PURSUIT.getGameNumber());
System.out.println("Pursuit: " + pursuitRankProgress);
checkRankProgress(pursuitRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//Kidnapping
UserRankManager.RankProgress kidnappingRankProgress = data.getRankProgress(GameDefinition.KIDNAPPING.getGameNumber());
System.out.println("Kidnapping: " + kidnappingRankProgress);
checkRankProgress(kidnappingRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//NightWatch
UserRankManager.RankProgress nightWatchRankProgress = data.getRankProgress(GameDefinition.NIGHT_WATCH.getGameNumber());
System.out.println("Night Watch: " + nightWatchRankProgress);
checkRankProgress(nightWatchRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//ShootingRange
UserRankManager.RankProgress shootingRangeRankProgress = data.getRankProgress(GameDefinition.SHOOTING_RANGE.getGameNumber());
System.out.println("Shooting Range: " + shootingRangeRankProgress);
checkRankProgress(shootingRangeRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//InTheDarkness
UserRankManager.RankProgress inTheDarknessRankProgress = data.getRankProgress(GameDefinition.IN_THE_DARKNESS.getGameNumber());
System.out.println("In The Darkness: " + inTheDarknessRankProgress);
checkRankProgress(inTheDarknessRankProgress, currRank.getExperiencePointsNeeded(), currRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//Previous rank for new games
//New games start at previous rank points
UserRankManager.UserRank prevRank = UserRankManager.UserRank.getPreviousRank(currRank);
//Runes
UserRankManager.RankProgress runesRankProgress = data.getRankProgress(GameDefinition.RUNES.getGameNumber());
System.out.println("Runes: " + runesRankProgress);
checkRankProgress(runesRankProgress, prevRank.getExperiencePointsNeeded(), prevRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
//Crime Scene
UserRankManager.RankProgress crimeSceneRankProgress = data.getRankProgress(GameDefinition.CRIME_SCENE.getGameNumber());
System.out.println("CrimeScene: " + crimeSceneRankProgress);
checkRankProgress(crimeSceneRankProgress, prevRank.getExperiencePointsNeeded(), prevRank.getExperiencePointsNeeded(), nextRank.getExperiencePointsNeeded());
}
System.out.println(data.getRankProgress(GameDefinition.ROBBERY.getGameNumber()));
System.out.println(data.getRankProgress(GameDefinition.PURSUIT.getGameNumber()));
System.out.println(data.getRankProgress(GameDefinition.KIDNAPPING.getGameNumber()));
System.out.println(data.getRankProgress(GameDefinition.NIGHT_WATCH.getGameNumber()));
System.out.println(data.getRankProgress(GameDefinition.SHOOTING_RANGE.getGameNumber()));
System.out.println(data.getRankProgress(GameDefinition.IN_THE_DARKNESS.getGameNumber()));
public static void checkRankProgress(UserRankManager.RankProgress rankProgress, int min, int curr, int next) {
Assert.assertEquals(rankProgress.getMinXP(), min);
Assert.assertEquals(rankProgress.getCurrXP(), curr);
Assert.assertEquals(rankProgress.getNextXP(), next);
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment