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, since 2026-07-26, equipment BR: each team's average battle rating, measured from the gear players actually used this match. Rolling up-tier lobbies with BR-V gear sets a higher bar; winning into an up-tier pays more. That prediction E is the bar — win as the heavy favorite and the result barely moves you; upset strong odds and it pays.

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?
Since 2026-07-26 the prediction knows each team's average battle rating, read from the gear actually used that match — not what you own. Stomping a down-tiered lobby with top-tier gear raises your bar (the win pays less); getting up-tiered and winning anyway pays more. Picking up an enemy rifle mid-match doesn't change your BR — only your own faction's gear counts (soft cross-faction items and vehicles excepted). Since 2026-07-27 picking up a fallen ally's gun doesn't either: a BR tier only counts once you have two kills at or above it — either from one weapon, or from several high-tier weapons. Bring a top-tier arsenal and it counts; grab one rifle off a teammate's body and it doesn't.
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
     + 1.5 × (team̄BR_A − team̄BR_B)         # lineup BR, 2026-07-26 (see below)

# team̄BR = mean over the team's humans of each player's BR THIS match =
#   the highest-BR weapon/vehicle they actually used. Two pickup guards:
#   (1) enemy-faction weapons don't count (faction-tracked); captured/lend-
#       lease gear listed for both sides, and all vehicles, do.
#   (2) KILL EVIDENCE (2026-07-27): a BR tier counts only with ≥2 kills
#       at-or-above it — one weapon with 2+ kills, OR several 1-kill weapons
#       (a pile of high-tier guns IS a high-tier loadout; exactly one is
#       likely a gun grabbed off a fallen ally). A player with one kill
#       total keeps that weapon's BR. Vehicles skip this: taking a sortie
#       proves you brought it.
#   Needs ≥3 BR-known humans per team, else the term drops out.

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.