Wiki/PvP/ELO & Matchmaking

ELO & Matchmaking

PvP arena uses an ELO rating system to track skill and match players of similar strength. Wins against stronger opponents yield large gains, losses to weaker ones result in big drops, and draws use a half score.

Starting Rating

Every player begins with a rating of 1,000. Rating cannot drop below 0.

Expected Score

The expected score represents the probability that player A beats player B, based on their rating difference:

expectedA = 1 / (1 + 10^((ratingB - ratingA) / 400))

When both players have the same rating, expectedA = 0.5 (coin flip). A 400-point advantage gives roughly 91% expected win rate.

Rating Change

After each match, player A receives a score of 1 for a win, 0.5 for a draw, or 0 for a loss. Rating changes are then calculated from the difference between that score and the expected score:

deltaA = round(32 × (scoreA - expectedA)) // scoreA = 1 win, 0.5 draw, 0 loss
newRatingA = max(0, ratingA + deltaA) // rating floor at 0

The K-factor of 32 controls how much each match matters. A higher K-factor means faster rating swings.

Example Calculations

Player APlayer BResultExpectedDeltaNew Rating
10001000A wins50.0%+161016
10001000Draw50.0%01000
10001000A loses50.0%-16984
1200800A wins90.9%+31203
1200800A loses90.9%-291171
8001200A wins9.1%+29829
8001200A loses9.1%-3797
15001000A wins94.7%+21502
15001000A loses94.7%-301470

Key insight: beating a 1200-rated player from 800 rating grants +29 points (an upset), while beating an 800-rated player from 1200 rating only grants +3 points (expected win).

Matchmaking Bracket

The arena ladder shows opponents within a 25% rating bracket of your current rating. At minimum, 10 opponents are always shown (expanding the bracket if necessary to fill the list).

Constants Reference

ConstantValueDescription
STARTING_RATING1,000Initial ELO rating for all players
K_FACTOR32Maximum rating change per match
BRACKET_RANGE25%Rating bracket width for matchmaking
MIN_OPPONENTS_SHOWN10Minimum opponents displayed on the ladder
COOLDOWN_HOURS6Hours before re-challenging the same opponent