After a finished match, the API loads each player's elo_before, team averages, and K/D/A, then runs the formula below. Results are saved to match_player_stats and applied via batch_update_elo.
Win or loss sets actual to 1.0 or 0.0. Expected score uses standard Elo team averages (divisor 400). Your performance modifier compares your stat line to teammates—capped between 0.5× and 1.5×, inverted on losses.
expected = 1 / (1 + 10^((opp_avg - team_avg) / 400))
perf_score = kills + assists * 0.5 - deaths
perf_factor = clamp(0.5, 1.5, 1 + (perf - team_avg) / team_std)
elo_delta = round(K * (actual - expected) * perf_factor)
divisor = 400 · actual = 1.0 win / 0.0 loss · expected = 1 / (1 + 10^((opp_avg − team_avg) / 400)) · perf = kills + assists×0.5 − deaths · delta = round(K × (actual − expected) × perf_factor)