If there are no ranks, teams of disparate skill may match up against each other. This often leads to instances in which a player’s team dominates (awesome!) or gets demolished (fuck!).
That is, the outcome of the game is not decided by the actions of the players, but instead on how the teams happen to fall, which, without proper ranks, is seemingly random. This is not ideal for any kind of competitive game.
And furthermore, without ranks there is often no penalty for leaving the game early or ignoring objectives that ultimately lead to a win state. When there is little importance placed on winning, the game breaks down, as players will then play in whichever manner they find personally rewarding. While this is not necessarily bad from a player standpoint, it inhibits the competitive nature of the game and reduces it to a sandbox: things happen, a team wins.
Ranks resolve these issues by attempting to match players based on their skill and the skill of the two teams involved in order to provide a closer matchup, and by punishing quitters and those who don’t work toward the singular objective of winning the game.
If you win, you go up. If you lose, you go down. How much is the important part.
In a game, a player’s rank can be defined in many ways, but for the purposes of this equation, let’s say that this value is a simple decimal value (with 2 decimal places) that is greater than or equal to 1. Here are some valid ranks under this system:
1.00, 22.45, 1.97, 7.77, 8.44, 276.10, 78.75, 33.34, 88.03, 100783.83, 9999999999.99
This ranking equation tries to take into account the likelihood of your team winning the game by looking at several different heuristics, which I will explain in detail shortly.
That said, if your team wins when the odds are against you, you are rewarded more than if you were expected to win. Likewise, if your team loses when the odds are in your favor, you are punished more than if you were expected to lose.
Without further ado, here are the three Elo formulae of the ranking equation:
If your team wins,
R1 = R0 + R0/20 * (OA/YA) * (OT/YT)
If your team loses,
R1 = R0 - R0/20 * (YA/OA) * (YT/OT), or 1.00 (whichever is greater)
If it is a draw,
For the team with higher average skill, R1 = R0
For the team with lower average skill, R1 = R0 + R0/20 * (OA/YA) * (OT/YT)
If both teams have the same average skill, R1 = R0
R1 = your rank after the game
R0 = your rank before the game
OA = the other team's average rank
YA = your team’s average rank
OT = the total time spent in-game for the other team (seconds)
YT = the total time spent in-game for your team (seconds)
What it all means
When you start a match, you are essentially “wagering” a twentieth of your rank, modified by the factors described below:
Average rank modifier (blue)
If you win, you will rank up more if the other team had a higher average rank than your team.
If you win, you will rank up less if the other team had a lower average rank than your team.
If you lose, you will rank down more if the other team had a lower average rank than your team.
If you lose, you will rank down less if the other team had a higher average rank than your team.
If the average team ranks are the same, this modifier will be 1 and can therefore be disregarded.
That is, the closer this modifier is to 1, the better the matchup should theoretically be.
Quitter modifier (red)
If you win, you will rank up more if players on your team quit.
If you win, you will rank up less if players on the other team quit.
If you lose, you will rank down more if players on the other team quit.
If you lose, you will rank down less if players on your team quit.
If no one quits, this modifier will be 1 and can therefore be disregarded.
*If every player on the other team quits, you get an automatic win with modifiers of 1; that is, R1 = R0 + R0/20.
**If you quit, regardless of whether your team ultimately wins or loses, you get an automatic loss with modifiers of 1 (R1 = R0 - R0/20) or a loss calculated using the standard formula, whichever ranks you down more.
This means that in all scenarios, at least in terms of ranking, a player’s best interest is to stay in the game.
In the case of a draw
In a well-designed game, it should be relatively rare that the game ends in a tie. But if it does happen, the team with the lower average skill ranks up as if they had won the game and the other team’s ranks stay the same. If both teams have the same average skill, no player’s rank will change.
In other words, the system is self-correcting. If a lower-ranked team ties a higher-ranked team, we assume the teams are closer in skill than the ranks illustrate, and therefore the system tries to fix this.
In an ideal scenario (every player in the game is the exact same rank and no one quits), each player has a twentieth of their rank at stake in a game. This seems like a nice amount; it is small enough for most players to feel comfortable with the risk of losing it, but large enough to feel worthwhile as a reward for winning.
And lastly, this ranking system encourages all players to accept matches against opponents who are potentially of greater skill than they are (wherein there is a larger reward for winning and a smaller penalty for losing), and thereby improve at the game.
Note that the quitter modifier has been carefully designed to use the total time in-game rather than number of players remaining at the end of the game, as the latter can be very prone to exploitation.
For instance, consider a 4v4 match where the quitter penalty is only based on the number of players remaining at the end of the game. The first team is winning, and happens to consist of a player trying to artificially inflate their rank (the “boostee”) and 3 teammates using throwaway booster accounts. When the win is all but secured, the booster players quit out, and the boostee wins the game while down 3 players. By the equation, the quitter modifier is 4/1 = 4, giving the boostee 4x the rank-up they actually earned.
The issue is eliminated when in-game time is used as the modifier’s metric rather than the number of players. That is, to accomplish the same exploit would require that the boosters quit early in the match; assuming the game is well-designed, if the boostee is still able to win under such circumstances, they deserve the rank-up bonus.
Note that, as written in the formula for a loss, a player’s rank cannot go below the starting value of 1.00. This is to establish a well-defined bottom/beginning to the ranking spectrum, and also because ranks below 0.00 would not work with the equation.
Note that individual player contribution (be it kills, assists, objective points, or whatever other scoring metrics pertain to the game) is not included in the equation because the fundamental design of the system is that players win or lose as a team. Ranks, in a team-based competitive game, should in no way encourage players to work against their teammates in hopes of a bonus at the end of the match.
While it is not necessary to show a player’s decimal rank or the underlying equation, some notion of their standing should be publicly displayed in-game.
A simple way to do this is through a percentile system; take all active players (say, players that have completed a match in a given timeframe, such as in the last month) and group them into 100 percentiles, with the 1-percentile player(s) having the lowest ranks and the 100-percentile player(s) having the highest.
This is a particularly interesting way to construe the ranking information to players because the percentile values will be dynamically based on the population’s ranks, and will fluctuate over time.
Of course, there will need to be a certain number of placement matches played for a player’s percentile to steady before it is shown (otherwise, it may jump wildly; when the game releases, the first team to win a match will jump from the 1-percentile to the 100-percentile!).
Also note that this percentile system can easily be mapped to more traditional ranking systems, such as 1-100, 1-50, divisions, etc.
This entire system falls apart if matchmaking cannot provide good games, so it’s important to provide a strong infrastructure for matching players.
The base settings should strike a balance between close skill-matching and speed, with options for players to customize their matchmaking experience using filters.
Rank filter (loose or strict)
Assume the percentile system described above is in use. Find players within x percentiles of the player’s rank, customizable in percentile increments.
A loose filter will prioritize the chosen setting, but will “widen the net” if no suitable matches can be created in a given time limit. For instance, if a player sets a loose rank filter of within 2 percentiles, if not enough players are found, it may widen to within 5 percentiles, 10 percentiles, etc. in order to speed up matchmaking.
A strict filter will only find players that adhere to the chosen setting. This may make matchmaking take longer, but allows a player to find more desirable matches.
If a party of players enters matchmaking, the system can take into account the highest and lowest-reaching players’ filters to create the party’s filter.
And of course, the rank filter must work in parallel to networking filters for region, ping, etc.
Say I am a player with rank 21.84, and I go into matchmaking alone in a 6v6 game mode playlist where games last anywhere between 10 and 15 minutes. A game is created, and here are the ranks of every player on both teams (note that I am the first player on Team A):
We can now calculate the average rank of both teams (rounded to 2 decimal places):
YA = (21.84 + 19.71 + 19.94 + 20.87 + 18.43 + 24.05)/6 = 124.84/6 = 20.81
OA = (22.87 + 17.04 + 23.39 + 21.40 + 20.11 + 22.37)/6 = 127.18/6 = 21.20
Based on our rank heuristic, Team B is theoretically more likely to win the game than Team A.
The game plays out; Team A wins. It ends up lasting 13 minutes and 21 seconds, and one of the players on Team A quits 10 minutes and 9 seconds into the game.
Note that 13 minutes and 21 seconds is (13 * 60) + 21 = 801 seconds, and the player that quit was in the game (10 * 60) + 9 = 609 seconds.
We can now calculate the total in-game time for both teams:
YT = (801 + 801 + 801 + 801 + 801 + 609)/6 = 4614/6 = 769
OT = (801 + 801 + 801 + 801 + 801 + 801)/6 = 4806/6 = 801
Now, simply plug all of these values into the formula for a win to calculate my new rank:
R1 = R0 + R0/20 * (OA/YA) * (OT/YT)
R1 = 21.84 + 21.84/20 * (21.20/20.81) * (801/769)
R1 = 21.84 + 1.10 * (1.10) * (1.04)
R1 = 23.10
For winning the game, I ranked up a twentieth of my rank, plus bonuses because one of my teammates quit late in the match, and also because my team was theoretically less likely to win the match.