## Proposal: New Rank & Team Rank Calculation

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 place | 25 points |

2nd place | 18 points |

3rd place | 15 points |

4th place | 12 points |

5th place | 10 points |

6th place | 8 points |

7th place | 6 points |

8th place | 4 points |

9th place | 2 points |

10th place | 1 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
```

Time | Old Points times 4 for comparison | New Points | Server | Team | |
---|---|---|---|---|---|

1. | 01:55 | 100 | 105 | Inner peace & ecaep rennI | |

2. | 02:01 | 72 | 67 | [D] paradise & paradise | |

3. | 02:01 | 60 | 67 | bed & qed | |

4. | 02:03 | 48 | 59 | paradise & qed | |

5. | 02:10 | 40 | 37 | Draci & Skadi | |

6. | 02:13 | 32 | 30 | TheJoker & ☯Mڶɴ3☯ | |

7. | 02:21 | 24 | 18 | [D] dope & dope | |

8. | 02:23 | 16 | 16 | VéNa & VéNaGoD | |

9. | 02:26 | 8 | 13 | Chyste & feña te amoooo | |

10. | 02:30 | 4 | 10 | [D] cheeser0613 & cheeser0613 | |

11. | 02:31 | 0 | 9 | MØtiv & obv dummy | |

12. | 02:33 | 0 | 8 | heebie & heebs | |

13. | 02:36 | 0 | 6 | Large & Nona | |

14. | 02:36 | 0 | 6 | (1)Trill & Trill | |

15. | 02:37 | 0 | 6 | Ventti~ & [D] Ventti~ | |

16. | 02:39 | 0 | 5 | ioi & 라라 | |

17. | 02:39 | 0 | 5 | Koksy & [D] Koksy | |

18. | 02:42 | 0 | 4 | NoRth & 歪比巴卜 | |

19. | 02:42 | 0 | 4 | Smetanolub & kys | |

20. | 02:44 | 0 | 4 | Dikjohnson & 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
```

Time | Old Points times 4 for comparison | New Points | Server | Rank | |
---|---|---|---|---|---|

1. | 34:36.74 | 100 | 143 | lost monke | |

2. | 49:36.90 | 72 | 81 | [Wu]*GzA | |

3. | 01:47:45.28 | 60 | 37 | Knuski | |

4. | 02:26:48.00 | 48 | 22 | RedFight | |

5. | 02:41:53.76 | 40 | 18 | I.K.U | |

6. | 03:27:49.30 | 32 | 10 | Starkiller |

## 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
```

## 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.