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
            });
        }