How your rating works

Start with the plain-English version below. The complete master equation, full pseudocode, every constant and the trained weight tables follow further down. Values are the deployed parameters as of 2026-07-26.

The short version

1 · The bar. Before grading anyone the engine predicts the match: team skill, who's attacking, bots, console share, premades, this map's quirks — and where the matchmaker put you. Battle rating runs BR 1–5, and what counts is whether you were placed above the BR you brought: an up-tier is something done to you, so it lowers the bar. That prediction E is the bar — win as the heavy favorite and the result barely moves you; upset strong odds and it pays.

Your equipment does not rate you. Bringing better gear never raises your rating and bringing worse gear never lowers it. The only BR question the engine asks is the up-tier one above.

2 · The grade. Win and it's 80% how you played, 20% that you won. Lose and the stat line only counts half — 50/50 — so a pretty scoreboard can soften a loss but rarely erase it. "How you played" is 20 stats per minute, each measured against your own lobby and weighted by your job that match — and since 2026-07-16 dying while DEFENDING costs nothing by itself (defenders don't burn tickets; the penalty measured as noise), though K/D still counts. Valves: losing records get their stat credit damped, blowout winners aren't punished for coasting, newcomers are graded mostly on results for 8 games.

3 · The move. Step size scales with uncertainty squared — new players swing, veterans barely move. If you lost and the math still says "up", the gain is halved — losing is never a good way to climb. First 10 games clamped to ±100; skill estimate never goes below 200.

4 · Deserting. Play a third and quit: a loss your stats can't soften. Habitual early bailing strips your win credit until you stop — and the strip bites hardest when your quits are curated: bail mostly from matches you were losing and you lose the most credit; quit at a coin-flip rate (rage, queue life) and the brake barely touches you. Deserting a match your team went on to win still counts against you.

5 · The ladder. Ranked by μ−2σ, experience-shrunk — a confidence statement: "you're at least this good." Tiers are daily percentiles of the same number, so tier and rank can't disagree. Plus recent form (2026-07-26): the displayed rating adds a bonus (or malus) for how you've actually played in your last 20 matches versus the ladder average — playing a mountain of games can no longer outrank playing well. The form term is scaled down while your rating is still uncertain or you have under 100 rated games, and is zeroed for flagged lobby-shoppers, so a hot streak can't shortcut the ladder and a suppressed quit-record can't launder itself back up. Ranking-only: your underlying skill estimate, match predictions, and per-match deltas are untouched.

6 · Two ladders (2026-07-16). Matches with at least one PC player rate on the Main ladder; matches without PC players (all-console lobbies) rate on the Console ladder only. The relationship is one-way: a console player's games against PC players still inform their Console rating, but console-only games never touch the Main ladder — so a Main-ladder rank is always earned against the PC player pool. Console players carry both ratings; tiers are cut separately within each ladder.

Common questions

I lost but gained points — bug?
Rarer now, and deliberately small. In a loss the grade is only 50% performance (vs 80% in a win), and any upward move a loss does produce is halved on top. You can still eke out a few points by dominating a lobby as a heavy underdog — but losing streaks no longer climb the ladder.
Do deaths on defense hurt me?
Not directly, since 2026-07-16. Defenders don't burn a ticket pool, and the data showed the old defense-death penalty was noise — removing it made predictions better. K/D still counts on defense, so feeding isn't free.
Why is a worse K/D above me?
More proven games (smaller σ, less shrink), more wins, or value in the other 18 stats. K/D itself weighs 0.05–1.01 depending on the job.
Why did my first games move me so much?
σ starts at 377 — fast learning on purpose, capped at ±100/match for 10 games.
Can I farm bots?
Bot-heavy lobbies lower the bar E, and stats are z-scored against your own lobby, which farms the same bots.
Does my equipment BR matter?
No — your gear does not rate you. Bringing a top-tier arsenal does not raise your rating, and bringing weak gear does not lower it. The engine asks exactly one BR question: were you placed above the BR you brought? Battle rating runs BR 1–5. If the lobby's BR is higher than yours you were up-tiered — the matchmaker did that to you, so the bar drops. Matched at your own BR, the term is simply zero.

It is deliberately a placement flag, not a gear score. Because Enlisted matches within about one BR, the comparison is capped at one tier either way: bring BR 1 into a BR 5 lobby and you are graded as BR 4, never credited for a two-tier gap the matchmaker cannot create. Under-bringing is your choice, so it is never rewarded — and at the ends of the scale the question is one-sided: in a BR 5 lobby nobody can be down-tiered, and in a BR 1 lobby nobody can be up-tiered.

Your own BR is read from the loadout you spawned with, so picking a gun off a corpse — enemy or ally — cannot change it.
Why do I have two ratings?
Console players get one rating per ladder. The Main-ladder rating counts only your games with PC players in the lobby; the Console-ladder rating counts ALL your games (your mixed games still inform it — one-way). If your Main rating looks lower, it's because it only measures you against the PC player pool. Your player page shows both, and you can filter your match history to either set.

The technical version

Everything above, stated exactly: one master equation, the full pseudocode, the per-stat transforms and the complete 9×20 weight matrix.

The whole thing as one formula

Everything the engine does to your rating in a single match is this one update (each piece defined below):

μ' = max( 200,  μ + C10[ L½[  (Q / (1/σ² + Q²go²ê(1−ê))) · go · ( (1−a)·S* + a·P − ê ) ] ] )

where
L½ = in a LOSS, a positive step is halved (a loss can pay out at most half)  — loss-gain cap, 2026-07-16
ê = Λ( slopemap · Q · g · (μ̄you − μ̄them) + ctx )   — predicted win chance (the bar)
P = Λ( Σs∈20 stats W[mission:side][s] · zs / 1.5 ) · gate(record)   — your performance vs the lobby
S* = result (1/0), zeroed on wins for flagged lobby-shoppers
a = (0.8 if won, 0.5 if lost) · rampnew(games) · dampblowout(margin)   — how much the stat line counts (losses: less, since 2026-07-16)
C10 = clamp to ±100 during your first 10 games; Λ = logistic; Q = ln10/400

The full pseudocode

## CONSTANTS & PER-PLAYER STATE
Q          = ln(10)/400 = 0.005756       # classic Elo logit scale
μ          = 1000                          # skill estimate at first sight
σ          = 377.19                        # uncertainty; floor 25.81, shrinks every game
games      = rated matches so far          # W/L/D rows only
record     = career wins/games             # never includes the current match
desert_log = last 20 matches' quit flags    # rolling window
[AI]       = ONE shared rating for every bot

## STAGE 1 — BEFORE THE MATCH: predict P(team A wins) = E
# team skill: honest pre-match roster, softmax by μ with β=0.000329 (≈mean).
#   map-veto: drop anyone who played <2% of the match (loaded in, disliked the
#   map/mode, left at ~30s) — they were never really on the team:
w_i    = exp(0.000329 × (μ_i − max μ on team))
teamμ  = Σ w_i μ_i / Σ w_i ;   teamσ² = Σ w_i² σ_i² / (Σ w_i)²
g      = 1 / √(1 + 3 (Q √(teamσ²_A + teamσ²_B) / π)²)

slope  = SLOPE[mode]                       # inv 1.54 ass 1.37 dst 1.14 cnf 1.47 dom 1.58 other 0.64
f_map  = shrunk(map skill-agreement, k=20, centered on mode)
slope  = slope × (1 + 0.5 × (f_map − 1))

ctx  = −0.0578 × (premade-frac diff) + 0.4964 × (biggest-party-share diff)
     + attacker offset: inv +0.247  ass +0.782  dst +0.740
     + −0.4 × (bot-count diff) + −0.60 × (console-frac diff)
     + 0.5 × shrunk side-bias(map, k=20)   # symmetric maps only
     + w_tier × (tier̄_A − tier̄_B)              # up-tier placement, 2026-08-03

# tier = (lobby BR) − (your own BR), clamped to one tier either way and
#   to the real BR scale (BR runs 1..5, so no "BR 0" and no "BR 6"):
#     tier = matchBR − clip(yourBR, max(1, matchBR−1), min(5, matchBR+1))
#   POSITIVE = up-tiered = placed above what you brought = bar drops.
#   It lands in {−1, 0, +1}: a placement flag, NOT a gear score. Your
#   own BR is read from the loadout you SPAWNED with, so a gun picked up
#   off any corpse cannot move it, and the enemy's gear never enters at
#   all — equipment does not rate you.
#   Needs ≥3 BR-known humans per team, else the term drops out.
#
# w_tier is currently 0 — the term is defined and inert while its
# weight is re-measured against this definition. The earlier lineup-BR
# term (1.5 × team mean BR difference, 2026-07-26) has been RETIRED: it
# let your own equipment move your rating, which this engine must not do.

E = logistic( slope × Q × g × (teamμ_A − teamμ_B) + ctx )

## STAGE 2 — AFTER THE MATCH: grade every human player
x[stat] = raw / minutes_played             # 18 counting stats per minute; kd & killstreak raw
# z-pools: captures/points/obj_kills_att pool ATTACKERS only, obj_kills_def DEFENDERS;
# deaths pool the whole lobby. Transform per stat (table below), then:
z[stat] = (transform(x) − lobby mean) / lobby stddev     # missing → 0; winsor caps ±2
z = Σ W[mission:side][stat] × z[stat]    # full 9×20 matrix below
perf = logistic(z / 1.5)
if record < 50% (after 10 games): perf ×= max(0, 1 − 0.5(0.5−record)/0.5)

S = 1 if won else 0;  flagged lobby-shopper → S ×= 0 on wins
a = 0.8 if won else 0.5               # a lost match grades 50/50, not 80/20 (alpha_loss)
if WON a blowout: a ×= (1 − 0.7 × margin)     # coasting a stomp isn't punished
if games < 8:     a ×= 0.4 + 0.6 × games/8  # newcomers graded on RESULT
target = (1−a)×S + a×perf

## STAGE 3 — MOVE THE RATING (Glicko step, exact)
g_o   = 1 / √(1 + 3 (Q √(opponent teamσ²) / π)²)
e     = your team's E
d²    = 1 / (Q² g_o² max(e(1−e), 1e-6))
denom = 1/σ² + 1/d²
Δ = (Q / denom) × g_o × (target − e)      # scales with σ² when new
if LOST and Δ > 0: Δ ×= 0.5              # loss-gain cap — losing pays out at most half
if games < 10: Δ = clamp(Δ, ±100)         # placement cap — no first-game jackpots
μ = max(200, μ + Δ)                        # hard floor
σ = max(25.81, √(1/denom))

## STAGE 4 — DESERTION
left early, played ≤ 35% of match → ignored for rating, but REMEMBERED
left early, played > 35%        → a LOSS with target = 0 (stats can't soften it)
quits ≥ 33% of last 20          → FLAGGED: win credit stripped (scaled by selectivity)
# selectivity brake: how far your quits skew toward matches you were LOSING
#   (needs ≥ 8 quit outcomes on record, else no effect):
sel   = clamp( (loss_share_of_your_quits − 0.5) / 0.5, 0, 1 )
mult  = (1 − 0.5) + 0.5 × sel     # quit at ~50/50 → half strip; curate losses → full strip

## STAGE 5 — WHAT THE LADDER SHOWS
Elo    = μ ± σ
Rating = 825 + (μ − 2σ − 825) × (1 − e^(−games/30))
         # experience shrink: 49% of your edge at 20 games, 81% at 50, 96% at 100
Tier   = live percentile of Rating (rated ≥ 10, recut daily):
         Diamond top 0.5% · Platinum 3% · Gold 12% · Silver 40% · Bronze rest

Per-stat transforms

Each stat is reshaped before it's z-scored, so long-tailed counts don't swamp the grade. Grouped by the transform applied:

transformapplied towhat it does
sqrtkills, kd, building_usage, obj_kills_att, kills_as_inf, long_range_killscompresses big numbers — a 40-kill game isn't 4× a 10-kill game
log1pdeaths, killstreak, fortification_built, obj_kills_defstrong compression for counts with long tails; log(1+x) so 0 stays 0
ranksquad_deaths, vehicle_kills, human_kills, rally_usage, kills_as_vehreplaced by lobby rank — only the ordering matters, not the raw gap
winsor ±2assists, headshots, points_capturedkept linear but clipped at ±2σ so one outlier can't dominate
linearcaptures_credited, battle_scoreused as-is (after per-minute), then z-scored like everything else

The full weight matrix W

Your job that match picks the column: inv=invasion, ass=assault, dst=destruction, cnf=confrontation, dom=domination; att/def=side, sym=symmetric. Green = raises your grade (deeper = stronger); red = lowers it. A dash (—) means the stat isn’t scored for that side — capture stats only count for attackers, defend-kills only for defenders — so its trained weight there never touches the grade. Death penalties on the three DEFENDER columns were zeroed 2026-07-16: defenders don’t burn tickets, and the data showed those penalties were over-fit noise (removing them improved prediction).

weight strength: negative~00.30–0.800.80–1.201.20+— not scored for this side
statinv:attinv:defass:attass:defdst:attdst:defcnf:symdom:symother
kills1.371.421.460.900.150.991.831.060.88
deaths−0.480−0.920−0.600−0.27−1.490
assists1.041.811.290.530.311.440.140.230.29
captures_credited0.630.400.661.560.991.74
squad_deaths−1.100−0.820−0.240−1.47−0.21−1.82
vehicle_kills0.461.070.830.360.490.520.9100.71
building_usage0.460.330.440.170.880.590.300.601.44
battle_score0.340.610.060.250.880.860.611.491.04
kd0.250.331.010.880.090.050.360.160.34
obj_kills_att0.540.390.920.541.070.21
obj_kills_def00.620.460.880.620.59
headshots0.070.930.590.490.250.721.131.140.37
human_kills0.260.170.080.500.670.090.680.980.15
points_captured0.491.131.080.191.820.49
fortification_built0.1800.450.5400.891.240.130.38
killstreak0.3100.450.450.410.360.300.880.77
long_range_kills0.530.030.650.890.760.700.351.230.15
rally_usage1.320.180.830.071.810.330.040.471.05
kills_as_inf1.45000.540.200.840.541.180.78
kills_as_veh0.350.410.210.400.270.301.141.291.06

Everyone is re-rated from scratch, oldest match first, whenever the formula changes — the ladder is always one consistent formula end to end.

any match, any player, any weapon — find the most effective guns, the best maps for kills, and whether a player is really as good as they seem. Replays are decoded and discarded; only the stats live here. Columns click-to-sort. Early development — data extraction finalized.

Fan-made project — not affiliated with, endorsed by, or sponsored by Gaijin Entertainment or Darkflow Software. Stats are derived from publicly listed replay metadata; replay files are deleted after processing. Names appear as shown in-game. Questions or corrections? rollcallstats [at] gmail.com.