public static RankProgress GetRankProgress(Account acc, IRatingSystem ratingSystem) { var rating = ratingSystem.GetPlayerRating(acc.AccountID); if (rating.Rank == int.MaxValue) { return(null); } //var stdev = Math.Min(10000, rating.EloStdev); var rank = acc.Rank; var bracket = ratingSystem.GetPercentileBracket(rank); var stdevUp = 1000.0; var stdevDown = 1000.0; var bracketOverlap = 0.2; //sets overlap in next rank: player needs to be at least this amount within the next rank if (ValidateRank(rank + 1)) { stdevUp = (ratingSystem.GetPercentileBracket(rank + 1).UpperEloLimit - ratingSystem.GetPercentileBracket(rank + 1).LowerEloLimit) * bracketOverlap; } if (ValidateRank(rank - 1)) { stdevDown = (ratingSystem.GetPercentileBracket(rank - 1).UpperEloLimit - ratingSystem.GetPercentileBracket(rank - 1).LowerEloLimit) * bracketOverlap; } var rankCeil = bracket.UpperEloLimit + stdevUp; var rankFloor = bracket.LowerEloLimit - stdevDown; //Trace.TraceInformation(acc.Name + ": bracket(" + bracket.LowerEloLimit + ", " + bracket.UpperEloLimit + ") requirements (" + rankFloor + ", " + rankCeil + ") current: " + rating.RealElo + " -> progress: " + bestProgress); return(new RankProgress() { ProgressRatio = (float)Math.Min(1, (rating.LadderElo - rankFloor) / (rankCeil - rankFloor)), RankCeilElo = (float)rankCeil, RankFloorElo = (float)rankFloor, CurrentElo = rating.LadderElo }); }
public static RankProgress GetRankProgress(Account acc, IRatingSystem ratingSystem) { var rating = ratingSystem.GetPlayerRating(acc.AccountID); //if (rating.Rank == int.MaxValue) return null; // ignore inactivity if (ratingSystem.GetActivePlayers() < GlobalConst.LadderSize) { return(null); } // don't count unused rating systems, e.g. planetwars var rank = acc.Rank; var bracket = ratingSystem.GetPercentileBracket(rank); var stdevUp = 0.0; var stdevDown = 0.0; var bracketOverlap = 0.2; //sets overlap in next rank: player needs to be at least this amount within the next rank var myBracketWidth = ratingSystem.GetPercentileBracket(rank).UpperEloLimit - ratingSystem.GetPercentileBracket(rank).LowerEloLimit; if (ValidateRank(rank + 1)) { var nextBracketWidth = ratingSystem.GetPercentileBracket(rank + 1).UpperEloLimit - ratingSystem.GetPercentileBracket(rank + 1).LowerEloLimit; stdevUp = Math.Min(myBracketWidth, nextBracketWidth) * bracketOverlap; } if (ValidateRank(rank - 1)) { var prevBracketWidth = ratingSystem.GetPercentileBracket(rank - 1).UpperEloLimit - ratingSystem.GetPercentileBracket(rank - 1).LowerEloLimit; stdevDown = Math.Min(myBracketWidth, prevBracketWidth) * bracketOverlap; } var rankCeil = bracket.UpperEloLimit + stdevUp; var rankFloor = bracket.LowerEloLimit - stdevDown; //Trace.TraceInformation(acc.Name + ": bracket(" + bracket.LowerEloLimit + ", " + bracket.UpperEloLimit + ") requirements (" + rankFloor + ", " + rankCeil + ") current: " + rating.RealElo + " -> progress: " + bestProgress); return(new RankProgress() { ProgressRatio = (float)Math.Min(1, (rating.LadderElo - rankFloor) / (rankCeil - rankFloor)), RankCeilElo = (float)rankCeil, RankFloorElo = (float)rankFloor, CurrentElo = rating.LadderElo }); }