Enter each player's current Elo and a score to see how much Elo the bot would award.
Several games played, but only one entry in the bot. This finds the single score whose Elo change comes closest to all games combined.
A port of FoosballEloRankingSystem from
Quantco/elo-slackbot. The numbers here match the bot to
floating-point precision.
Notation
- rating of player
- reduced rating of team
- points scored by team
- matches played by player
- rating gap that means “ten times as strong”, 500
- gain coefficient, 10
- participation bonus, 0.5
- placement matches, 5
Step 1 · Team rating
A logarithmic mean, not an arithmetic one. One strong player pulls the team rating above the average, which is why a ringer cannot be hidden behind a weak partner.
Step 2 · Expected point share
A logistic curve on the rating gap. At team A is expected to take of the points.
Step 3 · Actual point share
The point ratio counts, not the win. 10 : 9 barely moves anything, 10 : 0 moves a lot.
Step 4 · Raw change
Scaled by total points, so a long game carries more weight than a short one.
Step 5 · Per player
for team A and for team B; is the size of that player's team. Everyone collects the participation bonus , win or lose.
Step 6 · Placement damping
Players still inside their placement period take the full change; everyone else is damped by the least established player in the match. That is what stops people from farming Elo off newcomers. A 2 v 2 game counts as half a match per player, so grows by .
Constants
Why combining is never exact
The participation bonus is paid per entry, not per game played. Three games hand everyone Elo for free, a single entry only . That gap of hits every player equally and no score can make up for it, so it is reported separately in the result.