using HISP.Server; using HISP.Util; using System.Collections.Generic; namespace HISP.Player { public class Highscore { public class HighscoreTableEntry { public int UserId; public string GameName; public int Wins; public int Looses; public int TimesPlayed; public int Score; public string Type; } public HighscoreTableEntry[] HighscoreList { get { return highScoreList.ToArray(); } } private User baseUser; private ThreadSafeList highScoreList = new ThreadSafeList(); public Highscore(User user) { baseUser = user; HighscoreTableEntry[] highscores = Database.GetPlayerHighScores(user.Id); foreach (HighscoreTableEntry highscore in highscores) highScoreList.Add(highscore); } public HighscoreTableEntry GetHighscore(string gameTitle) { foreach (HighscoreTableEntry highscore in HighscoreList) { if (highscore.GameName == gameTitle) { return highscore; } } throw new KeyNotFoundException("Highscore for " + gameTitle + " Not found."); } public bool HasHighscore(string gameTitle) { foreach(HighscoreTableEntry highscore in HighscoreList) { if(highscore.GameName == gameTitle) { return true; } } return false; } public bool Loose(string gameTitle) { bool isNewScore = true; if (!HasHighscore(gameTitle)) { Database.AddNewWinner(baseUser.Id, gameTitle, 0, 1); HighscoreTableEntry newHighscore = new HighscoreTableEntry(); newHighscore.UserId = baseUser.Id; newHighscore.GameName = gameTitle; newHighscore.Wins = 0; newHighscore.Looses = 0; newHighscore.TimesPlayed = 1; newHighscore.Wins = 0; newHighscore.Looses = 1; newHighscore.Type = "WINLOSS"; highScoreList.Add(newHighscore); return isNewScore; } else { Database.UpdateHighscoreLooseGame(baseUser.Id, gameTitle); for (int i = 0; i < highScoreList.Count; i++) { if (highScoreList[i].GameName == gameTitle) { highScoreList[i].TimesPlayed += 1; highScoreList[i].Looses++; } } return isNewScore; } } public bool Win(string gameTitle) { bool isNewScore = true; if (!HasHighscore(gameTitle)) { Database.AddNewWinner(baseUser.Id, gameTitle, 1, 0); HighscoreTableEntry newHighscore = new HighscoreTableEntry(); newHighscore.UserId = baseUser.Id; newHighscore.GameName = gameTitle; newHighscore.Wins = 0; newHighscore.Looses = 0; newHighscore.TimesPlayed = 1; newHighscore.Wins = 1; newHighscore.Looses = 0; newHighscore.Type = "WINLOSS"; highScoreList.Add(newHighscore); return isNewScore; } else { Database.UpdateHighscoreWinGame(baseUser.Id, gameTitle); for (int i = 0; i < highScoreList.Count; i++) { if (highScoreList[i].GameName == gameTitle) { highScoreList[i].TimesPlayed += 1; highScoreList[i].Wins++; } } return isNewScore; } } public bool UpdateHighscore(string gameTitle, int score, bool time) { bool isNewScore = true; if (!HasHighscore(gameTitle)) { string type = time ? "TIME" : "SCORE"; Database.AddNewHighscore(baseUser.Id, gameTitle, score, type); HighscoreTableEntry newHighscore = new HighscoreTableEntry(); newHighscore.UserId = baseUser.Id; newHighscore.GameName = gameTitle; newHighscore.Wins = 0; newHighscore.Looses = 0; newHighscore.TimesPlayed = 1; newHighscore.Score = score; newHighscore.Type = type; highScoreList.Add(newHighscore); return isNewScore; } else { int currentScore = GetHighscore(gameTitle).Score; if (score < currentScore) { score = currentScore; isNewScore = false; } Database.UpdateHighscore(baseUser.Id, gameTitle, score); for(int i = 0; i < highScoreList.Count; i++) { if(highScoreList[i].GameName == gameTitle) { highScoreList[i].TimesPlayed += 1; highScoreList[i].Score = score; } } return isNewScore; } } } }