Rating system

How the Durak score works

A game is scored as a set of soft head-to-head results. Every player is compared with every other player at the table. You gain points when your finish beats what your rating predicted, and you lose points when your finish is worse than expected. The Durak result matters most, while the exact order among non-Duraks matters softly.

+2.0 inflation per playerPairwise K = 40.0Rating scale = 800.0Non-Durak order strength = 0.25Finish distance power = 1.15Durak result strength = 0.50

Settings

The exact constants

6numbers

These are the full scoring settings currently used by the rating calculation. None of the results use fixed rating brackets or hard-coded intervals.

Inflation per player+2.0

Every player starts with +2 raw rating points for playing.

Pairwise K40.0

The total movement scale before it is divided across opponents.

Rating scale400.0

The Elo-style scale used when comparing rating gaps.

Non-Durak order strength0.25

The maximum soft edge for finishing earlier than another non-Durak.

Finish distance power1.15

Makes adjacent non-Durak places close together and bigger gaps matter more.

Durak result strength0.50

Makes every non-Durak score 1.0 against the Durak, and the Durak score 0.0 back.

Step 1

Convert finishing order into pairwise actual scores

Aᵢⱼactual result

Let n be the number of players. Let i be the player being scored and j be one opponent. Finish positions are zero-based inside the formula: 0 means first out and n − 1 means Durak.

Against the Durak

If opponent j is Durak: Aᵢⱼ = 0.5 + 0.50 = 1.000
If player i is Durak: Aᵢⱼ = 0.5 − 0.50 = 0.000

Among non-Duraks

slots = max(n − 2, 1)
distance = |j − i| / slots
margin = 0.25 × distance^1.15

If player i got out sooner than opponent j

Aᵢⱼ = 0.5 + margin

If player i got out later than opponent j

Aᵢⱼ = 0.5 − margin

The Durak comparison is a full win or loss. Non-Durak comparisons are softer: beating the next non-Durak is a small result, while finishing much earlier than another non-Durak is a larger result. The actual in-game score shown later is the average of Aᵢⱼ across all opponents.

Four-player actual scores

What the soft results look like

1.000beats Durak

In a four-player game, there are three non-Durak positions. The soft non-Durak scores are calculated from the same formula above, not from a lookup table.

1
1st out
vs 2nd: 0.613 · vs 3rd: 0.750 · vs Durak: 1.000
0.788average A
2
2nd out
vs 1st: 0.387 · vs 3rd: 0.613 · vs Durak: 1.000
0.667average A
3
3rd out
vs 1st: 0.250 · vs 2nd: 0.387 · vs Durak: 1.000
0.546average A
4
Durak
vs 1st: 0.000 · vs 2nd: 0.000 · vs 3rd: 0.000
0.000average A

Step 2

Calculate the expected score from ratings

Eᵢⱼexpected result

The system then asks what result was expected before the game. A player rated higher than an opponent is expected to score above 0.500 against them. A player rated lower is expected to score below 0.500.

One pairwise expectation

Eᵢⱼ = 1 / (1 + 10^((Rⱼ − Rᵢ) / 800.0))

Average expectation for the game

Eᵢ = average(Eᵢⱼ for every opponent j)
Rᵢ = this player's rating before the gameRⱼ = opponent's rating before the gameEqual ratings give Eᵢⱼ = 0.500The rating gap scale is exactly 800.0

Step 3

Turn each pair into raw rating points

40/(n−1)pair weight

The K value is fixed at 40.0, then divided by the number of opponents so that larger tables do not become wildly more volatile. The pair weight is therefore 40.0 / (n − 1).

Pair weight

w = 40.0 / (n − 1)

Pairwise points

pointsᵢⱼ = w × (Aᵢⱼ − Eᵢⱼ)

In the debug breakdown, this same pairwise number is split into two visible parts: finish-order points w × (Aᵢⱼ − 0.5) and rating-expectation points w × (0.5 − Eᵢⱼ). Those two pieces always add back to w × (Aᵢⱼ − Eᵢⱼ).

Step 4

Add inflation and total the raw delta

+2.0per player

Every player receives +2.0 raw points for playing. This means total rating in the pool creeps upward by exactly 2.0 × n raw points before rounding.

Raw rating change

rawΔᵢ = 2.0 + Σⱼ [w × (Aᵢⱼ − Eᵢⱼ)]

Equivalent debug breakdown

rawΔᵢ = inflation + nonDurakOrder + durakResult + ratingExpectation
inflation is always +2.0nonDurakOrder comes from non-Durak vs non-Durak pairsdurakResult comes from any pair involving the DurakratingExpectation comes from rating gaps

Step 5

Round while preserving total inflation

2ntotal gain

Raw deltas are decimal numbers, but stored rating changes are whole numbers. The rounding method keeps the whole table honest: after rounding, the sum of all rating changes is exactly round(2.0 × n). Since 2.0 is already whole, that is exactly 2 × n.

Rounding target

targetTotal = round(2.0 × n)

New rating

Rᵢ,new = Rᵢ,old + roundedΔᵢ

The algorithm first floors every raw delta. It then gives the remaining points to the players with the largest decimal remainders until the rounded deltas sum to the target. There is no rating floor in this rating update formula.

Worked example

Input tuple: (1000, 1150, 900, 1200)

+8total change

The tuple is already in finishing order: first out, second out, third out, Durak. This is a four-player game, so n = 4, w = 40.0 / 3 = 13.333..., and the rounded deltas must sum to 2 × 4 = +8.

1
1st out · rating 1000
A = 0.788 · E = 0.392 · inflation +2.00 · non-Durak order +4.84 · Durak result +6.67 · rating expectation +4.31 · raw Δ +17.81
+1810001018
2
2nd out · rating 1150
A = 0.667 · E = 0.647 · inflation +2.00 · non-Durak order +0.00 · Durak result +6.67 · rating expectation −5.87 · raw Δ +2.80
+311501153
3
3rd out · rating 900
A = 0.546 · E = 0.234 · inflation +2.00 · non-Durak order −4.84 · Durak result +6.67 · rating expectation +10.63 · raw Δ +14.46
+14900914
4
Durak · rating 1200
A = 0.000 · E = 0.727 · inflation +2.00 · non-Durak order +0.00 · Durak result −20.00 · rating expectation −9.07 · raw Δ −27.07
−2712001173

The high-rated Durak loses heavily because they were expected to do well and instead finished last. The 900-rated player still gains points despite coming third, because they avoided Durak against much stronger players. The raw deltas add to +8.00, and the rounded deltas add to +8.

Public leaderboard

Leaderboard score still includes an evidence penalty

−180/√gpenalty

Stored rating is the real rating. The public leaderboard uses a separate display score so a player with one lucky game does not immediately outrank players with more evidence.

Leaderboard score

LeaderboardScoreᵢ = round(Rᵢ − 180 / √(max(gamesᵢ, 1)))
1 game
Rating 1000
Evidence penalty: 180.0
820score
4 games
Rating 1000
Evidence penalty: 90.0
910score
9 games
Rating 1000
Evidence penalty: 60.0
940score
25 games
Rating 1000
Evidence penalty: 36.0
964score
100 games
Rating 1000
Evidence penalty: 18.0
982score

Summary

What this system rewards

Everyone gets +2.0 for playingAvoiding Durak is the biggest resultNon-Durak order matters softlyBeating stronger players is rewardedLosing to weaker players is punishedRounded deltas always sum to +2 × playersLeaderboard score penalizes low sample size