Proposal: New Rank & Team Rank Calculation

2021-12-06

Disclaimer: This proposal is only about the global (team) rank points calculation, not the normal points, which you get for each map finish, can request with /points ingame, and have no change planned.

The old approach for calculating ranks and team ranks for the best times on a map is as follows:

1st place25 points
2nd place18 points
3rd place15 points
4th place12 points
5th place10 points
6th place8 points
7th place6 points
8th place4 points
9th place2 points
10th place1 point

This approach has irked me for a while as not ideal, so I thought about some things that should be improved in it:

Design Motivations

  • Player with top time should still get something for improving their time
  • Player in second place should get something for improving their time a bit, even if they don’t manage to reach rank 1
  • Still get points when there are many good ranks already on a popular map
  • Many players with close time should get similar points
  • Give some points also to worse players, don’t just cut off hard after 10 players
  • Worst rank shouldn’t affect the points you get (don’t use average, use median instead)

New approach

Top time (x=0): 100 points
Tenth best time: 10 points
Median time (x=1): 0 points
Inbetween (x between 0 and 1): Exponential decay: points(x) = floor(100 * e ^ (-λ * x))
  x = (ten - top) / (median - top)
  Calculate lambda based on tenth best time: λ = ln(10) / x
  points(time) = floor(100 * e ^ (-λ * (time - top) / (median - top)))
First rank bonus: X points for being X% faster than next best time
  floor(100 * (second / top - 1))

Example Calculation for Map Depressed

To make it easier to see, let’s just do an example calculation for the map Depressed, randomly chosen map with many ranks (2194 tees finished):

Top time:    01:55 = 115 s
Second time: 02:01 = 121 s
Tenth time:  02:30 = 150 s
Median time: 14:42 = 882 s

λ = ln(10) / ((150 - 115) / (882 - 115)) = 50

1st rank:
Basis: floor(100 * e ^ (-50 * (115 - 115) / (882 - 115))) = 100
Bonus: floor(100 * (121 / 115 - 1)) = 5
Total: 105 points

2nd rank:
Basis: floor(100 * e ^ (-50 * (121 - 115) / (882 - 115))) = 67
Total:  67 points

Median rank:
Basis: floor(100 * e ^ (-50 * (882 - 115) / (882 - 115))) = 0
Total:   0 points
TimeOld Points times 4 for comparisonNew PointsServerTeam
1.01:55100105GERInner peace & ecaep rennI
2.02:017267FRA[D] paradise & paradise
3.02:016067GERbed & qed
4.02:034859GERparadise & qed
5.02:104037RUSDraci & Skadi
6.02:133230BRATheJoker & ☯Mڶɴ3☯
7.02:212418GER[D] dope & dope
8.02:231616FRAVéNa & VéNaGoD
9.02:26813CHLChyste & feña te amoooo
10.02:30410SGP[D] cheeser0613 & cheeser0613
11.02:3109FRAMØtiv & obv dummy
12.02:3308USAheebie & heebs
13.02:3606GERLarge & Nona
14.02:3606ZAF(1)Trill & Trill
15.02:3706BRAVentti~ & [D] Ventti~
16.02:3905CHLioi & 라라
17.02:3905GERKoksy & [D] Koksy
18.02:4204CHNNoRth & 歪比巴卜
19.02:4204RUSSmetanolub & kys
20.02:4404GERDikjohnson & GeRRie

Example Calculation for Map Luna

Another calculation for a map with few ranks (only 6 tees finished): Luna:

Top time:    34:36 =  2076 s
Second time: 49:36 =  2976 s
Tenth time: 207:49 = 12469 s (doesn't exist, take last time)
Median time: 76:47 =  4007 s

λ = ln(10) / ((12469 - 2076) / (4007 - 2076)) = 0.43

1st rank:
Basis: floor(100 * e ^ (-0.43 * (2076 - 2076) / (4007 - 2076))) = 100
Bonus: floor(100 * (2976 / 2076 - 1)) = 43
Total: 143 points

2nd rank:
Basis: floor(100 * e ^ (-0.43 * (2976 - 2076) / (4007 - 2076))) = 81
Total:  81 points
TimeOld Points times 4 for comparisonNew PointsServerRank
1.34:36.74100143GERlost monke
2.49:36.907281RUS[Wu]*GzA
3.01:47:45.286037GERKnuski
4.02:26:48.004822GERRedFight
5.02:41:53.764018GERI.K.U
6.03:27:49.303210FRAStarkiller

Example Calculation for Map Springlobe 3

Another calculation for a map with very long ranks (196 tees finished): Springlobe 3:

Top time:    01:22:38 =  4958 s
Second time: 02:25:37 =  8737 s
Tenth time:  03:50:50 = 13850 s
Median time: 04:52:35 = 17555 s

λ = ln(10) / ((13850 - 4958) / (17555 - 4958)) = 3.26

1st rank:
Basis: 100
Bonus: floor(100 * (8737 / 4958 - 1)) = 76
Total: 176 points

2nd rank:
Basis: floor(100 * e ^ (-3.26 * (8737 - 4958) / (17555 - 4958))) = 37
Total:  37 points
TimeOld Points times 4 for comparisonNew PointsServerTeam
1.01:22:38100176GERCor & Spooky
2.02:25:377237GERFreezestyler & Spooky
3.02:54:596023GERCor, Ra!n & Vendetta
4.02:59:454822CHLColo-Colo, JULITO CESAR, Mømø, Rips, Vega, Zero Two & ☯Mڶɴ3☯
5.03:06:004020RUSNANAMAR, PaHDeRa & Soyler
6.03:12:043218CHLColo-Colo, JULITO CESAR, Mømø, Regedit|, Shawn. & [K]aoz
7.03:37:372412RUSInfern@L, Kandiifloss, Matrix, [Wu]*GzA & superdial
8.03:37:491612GERBoci, Cendren, Knuski, Mizkibo & MØtiv
9.03:49:28810GER-Twist°~, Cor, Gorden, Splash & Starkiller
10.03:50:50410GERBlurry, MØtiv, OnePiece & iParano
11.03:59:1908GER<BµmM>, Forris, Freezestyler, Genex, StarkillerJr.<3 & cc
12.03:59:5908GERDaGiese :>, Kei, Lord Kenny, bano, mrs. & nothing
13.04:01:5008CHLColo-Colo, Filis, Kandia, King, Wizh & Zuko
14.04:07:2107CHL<-Bulto-> Lyps0, Ayame, Colo-Colo, Flvsh, Regedit| & kiso
15.04:13:0907GER1d2k3s, Kicker, Krumplee, Lexin, Lwai, Pio gay & WojMen
16.04:13:1907RUS7ll, Aoe, Busted, Nekoma & sarelemele
17.04:17:4206GERBubble Gum, Cireme, Dropix, Eratyck, LCSG47 & Weedbärchiii
18.04:19:2906GER:0, Frucht, Mikka, MØtiv, Zhady & novaaah T'nP
19.04:19:4606GERBeard, Hesse, Knechtren, Lenah, ^b[Bro] flummi, maggi323 & ♫samu♫
20.04:23:2606BRA*ᴢʏᴇ ♥, JOAO EUTE ODEIO, Loonex, Razer, Shiro01, Spiritzin, Tarzan & pv

TL;DR

When you get faster, you’ll get more ranks points, even if you don’t move up a rank. No matter if you’re first on the map already or not. If you don’t make it into the top 10, but are pretty fast on the map, you’ll still get some ranks points. If a top player finishes multiple times in the top 10 with fakes names, they hurt their main ranks points.

If you have any thoughts on this, feel free to discuss on our Discord server. If the general feedback is good, I’m planning to implement this change soon.