Results and ratings
Only the server decides
Results are accepted from the dedicated server of that session, authenticated by its server secret - never from a game client. A result must name two players of the match, and the winner's score must be higher than the loser's (or the scores equal, for a draw). Reporting is idempotent, so servers can retry safely.
Elo
Every player starts at 1000. After each match:
- Expected score follows the standard Elo curve (a 400-point gap is about 10 to 1).
- K = 40 for a player's first 30 matches, so new players reach their level quickly; K = 24 afterwards.
- A decisive result always moves a rating by at least one point. Ratings never go below zero.
- A draw between equals changes nothing; a draw against a stronger player earns a little.
Two established players at the same rating exchange 12 points. Beating someone 400 points above you earns 22; beating someone 400 below earns 2.
Forfeits and aborted matches
| Situation | Outcome |
|---|---|
| A player quits and the server reports it | A normal win for the opponent. |
| A player quits and the server exits without reporting | The player who stayed wins by forfeit (resultReason: FORFEIT). |
| A player is gone past the reconnect window (30 s) and no result arrives | Forfeit, awarded by the platform. |
| Everybody left, the server crashed, or a node was lost | ABORTED / FAILED - nobody's rating changes. |
| A player cancels before kick-off | ABORTED, reported separately from failures. |
Leagues and leaderboards
Ratings map to league tiers (every 100 points from 1100 up to a top tier at 2000). GET /me returns the player's league, the next league and its threshold, and their leaderboard rank. GET /leaderboard returns the top players of the project; GET /matches/me/history returns recent matches with the rating change of each.