internal virtual void GiveEveryoneNormalPoints(
IList<PlayerRank> playerRanks,
Dictionary<int, PointsScorecard> playerToPoints)
{
int totalNumberOfPlayers = playerRanks.Count;
int totalPointsToAllocate = totalNumberOfPlayers * POINTS_PER_PLAYER;
decimal denominator = FibonacciSum(totalNumberOfPlayers);
const int fibonacciOffset = 1;
int highestRankSlotNotConsumed = 1;
for (int rank = 1; rank <= totalNumberOfPlayers; rank++)
{
List<PlayerRank> playersWithThisRank = playerRanks.Where(x => x.GameRank == rank).ToList();
int numberOfPlayersWithThisRank = playersWithThisRank.Count;
if (numberOfPlayersWithThisRank > 0)
{
int finoacciEndIndex = totalNumberOfPlayers + fibonacciOffset - highestRankSlotNotConsumed;
int fibonacciStartIndex = finoacciEndIndex + fibonacciOffset - numberOfPlayersWithThisRank;
decimal numerator = FibonacciSum(fibonacciStartIndex, finoacciEndIndex) / numberOfPlayersWithThisRank;
int points = RoundUpIfNonNegligible(totalPointsToAllocate * (numerator / denominator));
foreach (var playerRank in playersWithThisRank)
{
playerToPoints.Add(playerRank.PlayerId, new PointsScorecard { BasePoints = points });
}
}
highestRankSlotNotConsumed += numberOfPlayersWithThisRank;
}
}