Hi! Due to the recent rating system being developed, and many players' desire
for it to rate players by their playing skill (as opposed to amount of time
played), I have decided to make this thread.
Before you read any further:
1. Please do not post a reply in this thread unless you read the entire OP.
2. This OP is very long, and will take a while to read. For your own
convenience, prepare a sandwich and some coffee before reading. Take short
breaks while reading and take-in every section of information before you move
on to the next one.
3. While I try to keep most of this article objective, there is going to be
some opinion-based information. If you disagree with it and would like to
comment on that, please be specific and say exactly what part you disagree with,
and take the time to write a well-explained reason and counter-argument. Avoid
being vague or else it will be unclear what you mean.
4. Please stay on topic and don't derail this thread. If you're quoting someone,
make sure you stay on the main topic and don't start wandering off into some
sub-topic. To be clear, the main topic is: making a skill-based rating system.
Hopefully this thread will be insightful for all reader, and answer some
questions. I'll get straight to the point and cover the main one:
Q: Is it possible to make a skill-based rating system?
A: Yes. However, it won't be perfect - but it can be very close to perfect.
I'll place little bold lines with numbers to help you read this in parts if you want.
Again, please do not post any reply until you finished reading the whole thing.
------------01------------
As it stands right now, there is a pseudo player-made skill-based rating system.
In other words, if you ask a group of players to take a look at two players,
watch them play, and say which one is better - the players will be able to tell
you that "Player A generally plays better than Player B".
This system has two problems:
1. It's not automatic.
2. It's not accurate.
If we were to create an automatic skill-based rating system, that would rate
player skill with a number - I'll call this number SR from now on - the way to
know if this automatic system works would be to compare the SRs it gives
various players. If for every two players A and B that we take a look at, the
community says that A definitely plays better than B, and A's SR is higher than
B's SR, then we can conclude that the system works correctly.
Once proven to work, the system will shed insight that mere human observation
cannot reach. For example, if there are two players where the community can't
tell for sure who is better, but one of them has a slightly higher SR, than the
community will have to accept that the player with higher SR is slightly better.
Furthermore, this system will be automatic, so you won't have to poll people's
opinions every time you want to compare skills. The SR will always be
up-to-date for each player.
In other words, an automatic skill-based rating system should basically do the
same as asking experienced players how good is each player, except it would fix
the two problems of asking players:
It would be automatic.
It would be accurate.
------------02------------
* SR = Skill Rating. A number that indicates a player's skill in osu. Can be
compared against other players' SRs to know which player is more skilled.
Before we go on and create the skill-based rating system, its nature dictates
that we must understand what "skill" is. If you don't have a solid definition
for what "skill" means in osu, then there's no way you can make a system that
rates players by their "skill".
Is the score you get on a map related to skill? Is the accuracy you get on a
map related to skill? Is the amount of maps you can play before you get tired
related to skill? Is there a difference between the first run on a map and
repeated runs on a map in relation to skill?
Regardless of what skill is, one thing is clear: the only way to measure skill
is with information from playing osu. Nothing else is relevant to your skill in
osu. The only times when you can judge how good a player is, is the times when
he plays on a map, and you would judge it based on information from his results
on that run.
Lets think about all of those points. When you observe two players, is it
possible that one would get a lower score on a map, but you'd still consider
him more skilled in osu? It's possible that a player would miss a note in the
middle (because of a long repeating slider for example) but do perfectly on
almost the entire map, and get a bad score, while another player would do poorly
on the entire map, but manage to hold a longer combo and end up with a higher
score. Would the score help you indicate who played better here? No.
Conclusion: score on a map is not related to skill. Because of that, a skill
based rating system should not take scores into account.
- with this said, please keep scores as they are. They're exciting and fun,
and managing to get a full clear on a map you could barely pass is a nice
reward for your effort. Even that this shouldn't get involved in skill
calculation, don't just abandon the current scoring system. I think it's fine.
Next, if two players play the same map and get more or less equal results on it,
but one player has played it for the first time just now, and the other one
played that map 50 times before that run, who would you consider more skilled?
I believe most people would agree that the one who did better on the first run
is more skilled than the one who needed to practice the map to do well on it.
Conclusion: skill rating should take into account how many times you played on
a map while rating you for your plays on it.
- this means that for a skill-based rating system to exist, the game has to
keep record of how many times the player has played each map. The good news is
that the game already does this.
Next, what if two players play a series of maps in a row without breaks and
get various results on them, and do slightly better or worse during different
times of their sessions. Should the time they have been playing affect the
skill calculation of their plays?
Some might argue that the longer you play in a row, the more you get tired, and
it becomes harder to keep doing well. Others might say it has absolutely no
effect how long have you been playing. Some others can even say that as you go
on and play, you warm up and start doing better towards the end.
Conclusion: the amount you've been playing is unrelated to skill. Even if it is
related somehow, the relation is very vague and there is no good way for a
system to objectively rate you by it, so it shouldn't be included in skill
calculation.
- this was just one example to show that, there are many factors that some
people might consider that they're related to skill, while others would not.
Since the point is to create an objectively accurate system that everyone would
agree on, all vague and unmeasurable factors should be ignored.
Finally, the accuracy you get. This is the factor I believe is most closely and
objectively related to player skill in his run through a map. Regardless of
what score you get, or which parts you played better or worse, if two players
play the same map for the first time and one of them gets a higher accuracy
than the other, then it's evident that - at that run - the player with the
higher accuracy played better.
------------03------------
The goal in osu is to hit everything correctly. There will be obstacles, such
as jumps, stacks, streams, direction change, etc, but in the end - they're just
different levels of difficulty in keeping you away from hitting everything
correctly. If you manage to hit everything correctly, you get 100% accuracy.
For every inaccuracy in hitting a note, regardless of whether it was because of
a jump, or a stack, or whatever, you lose accuracy equally.
In the end, the final accuracy you get is what dictates how well you did.
Lets sum this up:
For the purpose of skill-rating, each player would have an SR. His skill rating.
This SR would be automatically changed every time the player finishes playing on
a map.
The factors that would affect how much his SR changes would be:
1. How many times has he played that map before*
*note: I'll later also introduce the importance of how long ago was the last
play on a map by that player.
2. How much accuracy did the player get on the map
Would this be enough, tho? No, there is one more important factor to take into
account, which is in fact the most important one:
The map difficulty.
If two players play a map for the first time, and get the same accuracy, but
one player played a harder map than the other player, whose SR will get higher?
Obviously, the player who played the harder map would get more SR.
WHICH BRINGS UP THE FOLLOWING KEY POINT
A skill-based rating system cannot exist until osu is able to rate how difficult
a map is. Until the game is capable of telling apart every two maps in the
aspect of "which one is harder" correctly, the game won't be able to correctly
rate which player is more skilled.
The current map difficulty rating, the "star rating", is far from accurate.
Not only that it is not accurate, but it is also limited... it only goes up to
5 stars with 0.5 fractions. This is not enough to evaluate skill!
In order for automatic skill-based rating to exist, the game has to be able to
rate each map's difficulty with a number that is unrestricted by limitations
(large range variable), and this number would affect your SR after your plays.
There is going to be a large section in this post dedicated to explaining how
to correctly rate map difficulty. I will go over an algorithm that should rate
map difficulty very closely to perfection. However for now, lets put this aside
and assume this problem is already solved.
In other words, lets ASSUME for now that each map already has a certain MD
number attached to it, that is calculated by osu once every time the map is
saved in Edit mode.
* MD = Map difficulty. A variable attached to each map that indicates how hard
is it, or in other words, how much skill does the map require. MD will be
accurate enough to determine for every two random maps you pick which of the
two is harder. (higher MD = harder map). MD will be used for SR calculation.
------------04------------
So, lets recap:
Skill-based rating system would rate player skill based on their plays on maps.
Every time a player finishes playing a map, the following variables will be
available:
1. The player's current SR.
2. The map's MD.
3. The accuracy that the player got on that run on the map.
4. The amount of times that player has previously played the map.
5. The amount of time that passed since the last time that player has played
this map, if he played it at least once before.
Again, #5 is a new point that I mentioned but haven't covered yet, I'll cover it
shortly. Also, #1 is a point I was yet to mention - the way that skill based
rating would work, the SR addition or reduction you get from your plays on maps
will depends on your existing SR. For those familiar with ELO rating, this is
going to work pretty similar. It's the world's most proven skill-rating system,
and frankly it just makes sense; I'll cover it shortly later for the osu
perspective.
As far as last time played goes (point 5), playing a map a lot of times in a
row creates an element on memorization that eliminates the reaction time
requirement of maps, in other words, it affects that skills that are required
to get a good accuracy on the map. Regardless of whether it gets harder or
easier over time, it gets different, so skill-calculation must take note of
this.
Now, if you didn't play a map for a long time, you will eventually forget it,
and the memorization versus reaction ratio will once again lean towards reaction
instead of memorization. Because of this, osu should record when was your last
play on a map, and use (CurrentTime minus LastPlayed) as a variable in the
skill calculation system, as a factor for the AmountOfPlays variable.
------------05------------
At this point, here is where we stand:
> I have to introduce an algorithm to correctly rate map difficulty, or in
other words, skill requirement. This is vital for the skill calculation.
Other than this, everything else is in place. Lets assume this system exists
and give a few examples on how it works, to explain why existing SR affects
SR gain or loss from map runs.
Each player should start with a certain SR once he starts playing osu. The
actual number doesn't matter, so lets say 1000. When you create an account, it
has 1000 SR. Every time you play, this SR will either go up or down.
The harder a map you play is, the faster your SR will go up if you do well on
it, and the slower it would go down if you do badly on it.
The easier a map you play is, the faster your SR will go down on doing poorly,
and the slower it would go up if you do well on it.
The more times you have played a map recently, the slower of an SR gain you will
get from doing well on it, and doing poorly on it won't be affected by this.
If you played a map a lot of times, but not recently, the slowdown on the SR
gain by playing it will be more marginal.
How well you do on a map will be purely dictated by your accuracy. Every other
factor, such as score for example, will be saved for other ratings that can be
fun for people to follow, but they will be unrelated to the by-skill rating.
So basically, at this point, those are the entire foundations for the skill
based rating system. The actual factors and numbers you apply here don't matter,
as long as they're consistent within themselves (the only consistency you need
is between SR gain and SR loss).
Whether you end up with a system that gives player A 7213 SR and player B 6102,
or player A 1447 and player B 1413, the system will still equally spread the
entire playerbase on a graph from "most skilled" to "least skilled".
------------06------------
Before I go into the map difficulty rating issue, there are a few points left
to cover:
1. Skill decay over time
2. High level players playing easy maps
Lets say an SR system is already in place. And then a player with a very high
SR, who normally gets very good scores on very difficult maps, suddenly decides
to play an easy map, and of course he gets SS on it on his first try. Should
this increase his SR, at all?
If the SR system works correctly, then, it will barely increase his SR if at
all. He'll have to play 1000 [Easy] maps to barely get 1 extra point to his SR
if he's a player who can normally breeze through insanes.
Not only that, but if he ever gets below 100% accuracy on those easy maps,
it might actually hurt his SR and lower it slightly.
The result would be: players would be discouraged from playing maps too easy
for their level. Whether this is good or bad is up to you to decide, but it
does pose a big problem: once all maps are correctly rated by difficulty,
players will know which map is the hardest. Once a player beats the hardest map
perfectly, everything else he plays will only potentially reduce his SR, so
if he doesn't just "play for fun", but rather plays for rank, he'll have no
reason to keep playing.
This is just one corner case to demonstrate a big issue that comes up with this
system across the entire graph: players would be discouraged from playing osu
if the system perfectly rates their skill. It would make it too pressuring and
not fun to play many random maps or random levels.
Because of this, you must introduce SR decay. Basically, over time, the current
SR you have will decrease and go down until returning to the default (whether
it was zero, or 1000 like I suggested, or whatever number is the default).
Make this decay start after a week, and end after a few months. For example,
start a decay of 5% per day from the moment you haven't played for a week.
Note that 5% per day does not mean 100% loss in 20 days, it will chip away from
your SR for 5% per day at that point of time, so it will never actually return
all the way to "zero", it will just slowly close in on it.
Since the decay starts from the last time you played, playing more maps would
be useful to keep your SR high, even if they're below your level. Also, due to
the nature of skill calculation, it would be more rewarding to keep playing
newly released maps, instead of replaying an old hardass map you beat in the
past that you already have some runs on. So basically, this solves the issue.
However, a perfect reset isn't good enough. If you just reset the decay startup
to zero every time you play any map, then players would only need to play one
map per week to keep their SR from decaying. Instead, make playing a map belate
the decay startup time, but not fully. Apply a factor.
For example, lets say the factor is 50%. It's been a week since I last played,
and now I play a map. After I played it, the week of "time since I last played"
will not reset to zero, but be reduced to 3.5 days, which means my decay will
start in 3.5 days. When I play another map, it will be reduced to 1.75 days,
which means my decay will only start in a little over 5 days.
With a 50% factor you only need to play about 3 maps a week, so maybe it's
better to use a much smaller factor, to encourage people to play more maps to
avoid losing their skill rating which they gained from beating hard maps.
It kinda makes sense, too. You keep playing to prove you're still solid.
If you quit playing for two months, the system would display you as not so
skilled anymore, which makes sense because you probably also started being worse
due to not playing for so long.
And if you quit for several months, the moment you start playing again, if you
just return to playing maps in your old level, you'll quickly regain the SR
you used to have, so you don't lose anything from this decay (unlike in a
rate-by-time-played system, where losing points over time would be a huge
annoyance because you'd need to spend a ton of time to regain points lost, in a
truly skill-based system the points would come back instantly as long as you
still have the skill to deserve them).
Also, you can apply a different decay-startup-pushaway factor for first runs on
maps and repeated runs on maps, to encourage players to play new maps. In other
words, make re-playing maps you already had lots of runs on have little effect
on pushing away your skill decay, at least, much less than playing new maps
that you haven't played before.
So, hopefully the importance of decay is clear now. It kills two birds in one
stone - it encourages players to keep playing maps of all levels, and trying
out new maps - while keeping the skill rating board up to date, and pushing
players who stopped playing down the board by gradually reducing their rating.
------------07------------
Here is the big moment you've all been waiting for: MD how?
How do we rate map difficulty? If we just solve this missing link, a perfect
automatic skill-based rating system can exist.
Before we go any further, let me say this: You can already try out the skill
based rating system to see how it works, by taking a small sample of maps and
giving them player-made number ratings of difficulty, and then just let players
play on those maps and see what results they get, compare this output to
opinions of spectators who saw them play, and see how accurately the systrem
rates people by skill.
However, for this system to truly be autonomous, osu itself has to be able to
numerically rate map difficulty. So, lets create this algorithm now.
Side bonus: once osu can rate map difficulty correctly, you can replace the
current star-rating with an improved star rating that's based on the MD numbers,
and then have correct star ratings for all maps to be used as map level
indication when you download/try out maps.
1star=easy, 2star=normal, 3star=hard, 4star=insane, 5star=veryXinsane,
won't that be nice?
------------08------------
So,
The best way to write a good algorithm is to collect a lot of information. I'll
cover this and guide you through it, to convince you in the correctness of it,
and to explain how it came to be.
Mission: to find out what makes maps difficult.
What we know: the goal in osu is to hit everything correctly, i.e. to get a
300 on every single note in the map and to spin as much as possible.
Everything that keeps the player away from getting any 300 is a difficulty.
So lets start by finding all of the things that keep people away from getting
300s. The first one is very obvious: the [Overall Difficulty] map property.
The higher it is, the less of a frame window you have to hit notes for a 300,
and thus this increases the map difficulty.
What about circle size, approach rate, and HP drain? Those are more complicated
in how they affect skill requirement, and I'll cover them over time as we go on.
Things that are known to add difficulty:
1. Jumps - movement between two points that is faster than the common movement
pace for that section of the map. Reason for difficulty: inconsistency
(different movement speed), speed (jumps are faster than regular movement),
cursor accuracy (the end of the jump - gets harder due to speed, since you have
less time to place your cursor on the correct spot).
2. Faster beats - doesn't nessecarily have to be in a stack, every time the
map suddenly changes from 1/1 into a series of 1/2s, or from 1/2s into a set
of 1/4s, etc, this adds difficulty. Reason for difficulty: inconsistency
(different clicking speed required), speed (need to click faster).
3. Patterns - sections in the map that repeat themselves. This can either
increase or decrease difficulty. For every time there's a very close pattern
repetition, the difficulty of it is reduced, because you know what to expect.
However, when the pattern happens partially and then breaks, this increases
the difficulty, because it's essentially a consistency trap.
4. The BPM of a map - in the end, no matter how you look at it, faster is
harder. Reason: speed (need to hit notes faster and move faster).
Note however that, something general like "BPM" isn't good for correct
difficulty calculation. You need to use raw information. By this I mean,
the actual time (in program loop frames) between actions. Similar to this,
every measure related to speed of clicking and cursor movement, should be
measured by program loop frames and not by musical-term numbers.
Also, it's important to take into account how the human mind works when you
consider this raw information. There are some breakpoints to consider here.
1. The human reaction time is approximately 1/4 of a second. On a 60FPS game,
this would translate into 15 frames, however osu does not have a set FPS,
however it still uses some sort of timing clock, so time should be evaluated on
a raw program scale and not on musical-term scale.
2. Humans can only process up to five items in one pattern. If you see six
items, your brain processes them as either 1+5, 2+4 or 3+3. However, you can
recursively see patterns inside patterns. i.e. a star of triangles, your mind
will process that as a 5pattern of five 3patterns. However if the triangles
are inconsistent with each other you will not see a 5pattern at all.
Patterns are an important part of difficulty, as difficulty basically comes
from three things:
1. The speed you need to do things
2. The accuracy level you need to correctly do those things
3. How easy is it to predict what to do
(4. length of a map)
#3 is decided by pattern creation and breaking during maps.
For example, lets say that for a large part of a map, notes appear more or less
in a line, with only under 60 degrees angle of a different between the movement
line you're required to do with the cursor from one note to another, and then
suddenly a direction change happens and a note appears at a stop that is more
than 60 degrees angle away from your current line. This specific movement will
be harder to do, even if it's not a jump and not a faster note, simply because
it doesn't follow a pattern your mind was following.
In order to have an MD rating for all maps that is consistent between different
maps of all types, osu has to be able to:
1. Rate how hard is it to accurately hit a 300 on a map. In other words,
measure the total frame window for hitting a 300. For example, if this is
tested in a 120FPS loop, there might be a global 6-frame window to hit a 300
per note, this would affect the MD.
2. Rate how fast of an action-taking the map requires you to do. This breaks
into several parts, as there are two actions you do: clicking and moving the
cursor. So basically, there's going to be a rating for clicking speed, and a
rating for movement speed. Note that difficulty isn't a consistent thing for a
map, some parts in the map can be harder or easier than others. You must make
an average out of all click speed and movement speed sections.
i.e. if I need to hit three notes: A...B...C
there are two speed sections and two movement sections here: the first "..."
and the second "...". Movement and clicking are related, and those factors
should be mutltiplied for exponential factoring.
Also, movement speed should be considered as movement between the middle of
one note to the edge of the next note (you can count this as: length between
the middles of both points, minus the circle radi of point2, which is consistent
for the entire map anyway, so basically just minus the circle radi). This is
where circle size will affect the difficulty rating, but not the only place.
Speed of clicking and movement, and accuracy of hitting a 300 - those are
consistent skills related to execution that are not affected by memorization,
although you could argue muscle memory affects this. Either way, they are not
skills related to reaction time.
Patterns and pattern break, though, is directly related to reaction time.
Patterns exist in two flavors: timing patterns and movement patterns. Both
should be taken into account seperately, although they still affect each other.
Since the game is able to play itself on Auto, I don't think it'll be a problem
to add a factor of info-gathering for auto. Basically, collect patterns.
For timing: collect timing sections. Place a limit on it to conserve memory.
Since humans can't process over 5 items simultaneously a limit wouldn't lose
much from real life difficulty; a limit of 15 for timing would be enough.
So for example, for a map with 20 notes, the patterns to try to find would be:
1 through 2, 1 through 3, 1 through 4, etc, until 1 through 15 (limit).
Then 2 through 3, 2 through 4, etc, until 2 through 16.
Once this list of timing patterns is saved, compare them against each other,
and find repetitions. If anything repeated itself exactly twice, it's a
questionable pattern, and if anything repeated at least 3 times it's a definite
pattern.
(as you're already guessing, this comparing is a N^2 loop on two lists, so
pressing "Save" while Editing a map would be time consuming... to avoid this,
simply have an option to "Save without MD calculation", which just saves the
map without calculating its difficulty. You'll only need to calculate a map's
MD once you finished mapping it anyway)
------------09------------
As for movement, the following factors affect patterns:
Type-1: movement speed - this pattern gives you a clue on where is the next
note going to appear, in a circle area at a specific radi from your position.
For every time the next note actually appears in that range, MD is reduced,
while for times it appears too close or too far, MD is increased, at that is
a pattern breaker.
Type-2: angle range between movement lines - this pattern requires long term
memory, you can place a limit of something like 15 on this too. Basically,
constantly remember the average, min, and max angle of difference between the
last 15 (~ or whatever limit) notes, and use this to predict the angle for the
next upcoming movement. When movement follow the recent consensus, MD is
lowered, while when movement suddenly behaves inconsistently, MD increase.
There is also the visual factor to take into account. When notes are stacked
on top of each other, patterns have bigger impact on your ability to either
300, or fail to 300, the stacked notes, especially when the circle approach
rate is below human reaction time.
NOTE THAT, the circle approach rate is never below human reaction time.
HOWEVER, it becomes that, once notes appear faster than human reaction time.
i.e. a stack of three notes with 1/8 timing difference appears in a 200+
BPM song. You're only going to be able to react to the approach circle of the
first circle, the remaining two you will time by pattern recognition, not by
individually reacting to them. At times when this pattern breaks, i.e.
you had several points with fast stacks and suddenly a slow stack appeared that
has the same shape - this kind of thing increases MD, as it's a pattern break.
This might seem trivial when the whole thing is above human reaction time,
but on very fast maps that have below human reaction speeds, patterns like this
are make-or-break and they test your reaction time to patterns.
------------10------------
Ok this is a big of a mess. Lets recap:
For osu to correctly calculate MD per map, it needs to do the following:
1. Rate the speed of the map in non-music terms based on non-program loops
between note hits.
To elaborate on this: you can't simply check the average from start to end.
You need to do a full collection of timing differences and keep them in an
array. i.e.
1/8s difference between two notes: 8 of those
1/4s: 215 of those
1/2s: 119 of those
1/1s: 23 of those
2 ticks: 1 of those
3 ticks: 7 of those
5 ticks: 1 of those
etc
And then take into account what was the most common timing difference, for
example 1/4s, and have the raw loop time of THIS speed requirement have the
biggest impact on the average calculation of the map's speed, while corner
cases with little appearances can be completely ignored as they will usually
be either breaks or a few slow sections in a map that don't truly indicate
the general speed of it.
2. Rate the speed of the movement the map requires. Since players can choose
whatever window size they want, the pixels-per-second doesn't really matter.
DPI is dynamic too. What does matter as far as distance go is movement
relative to circle size. i.e. if I need to move 20 pixels between two circles
with 5px radi in 1 second on one map, or 40 pixels between two circles with
10px radi in 1 second on another map, their movement speed is THE SAME.
3. Rate the level of pattern repeat and pattern break based on both timing
and movement patterns, by going over timing sections and comparing them, and
going over movement speed/direction and spotting inconsistencies.
------------11------------
Things that happen during one approach circles: this is the last difficulty
issue I'd like to talk about.
I hope I'm not the only one who thinks that the "Easy" mod actually makes maps
harder. This is for a good reason.
In the area of time between the appearance of one note and then another,
while you get full reaction time to the first approach circle, the second one
receives less reaction time. As long as you still didn't hit the first note,
you can keep building a queue of timing differences in your head based on
the showup of notes, but once you hit one note and have to start moving on to
the next one you enter a situation where you have to both empty a queue and
add items to a stack at the same time, which is problematic. Every pattern
inconsistency inside this realm has more impact than outside of it.
In other words, the way that MD addition from pattern breaks adds to the map's
MD will be affected by the amount of notes that appear during the timeframe of
the approach rate. Or in other words, sometimes approach rate will actually
make a map harder. If the approach rate is too slow for the map's timing speed,
then it has essentially the same effect as Hidden.
As long as approach rate is higher than borderline human reaction time -
which is 1/2 of a second - it doesn't make a map any easier, so it can only
potentially make it harder. If things inside approach rates happen faster than
human reaction time - which is 1/4 of a second - this adds difficulty too.
Again, this only refers to a case where enough things happen to have stuff
showing up after you already hit a first note of a queue of hits you had.
It's a common case but you need to address it correctly as far as finding each
time it starts and ends and a queue is restarted.
------------12------------
There's a few more things I wanted to talk about but I want to take a break
from writing this as it already got too long. I hope most of this made sense to
you so far.
To sum everything up:
1. A skill rating can exist. It will rate players every time they finish playing
a map. The factors it will use to rate them and either increase or decrease
their current SR would be:
1 - Their current SR.
2 - The map's MD.
3 - The accuracy the player had that run.
4 - Amount of times previously played on that map.
5 - Time of last play on that map versus the current time.
2. There has to be an SR decay system with fast decay, to keep SR tables up
to date with players' activity and to encourage players to keep playing.
3. To create a correct MD for maps that will be useful for SR calculation, the
MD has to be a large range variable, and it should be decided based on raw
speed/accuracy information, not based on musical terms. It should also take
into account patterns in the map, and increase difficulty for pattern breaks
while reducing or just not affecting difficulty for pattern maintaining.
------------13------------
Ok, one more thing I forgot to mention: apply a factor to SR change from map
completion. i.e. if the MD and accuracy of a run I did is supposed to give me
2500 SR, and I currently have 2000 SR, I wouldn't jump to 2500 instantly.
I would get maybe 10% from this run, so my +500 would only give me +50 and I'd
move to 2050. This is to avoid flukes or random mishaps from having drastic
effect on players' SR. Your SR will slowly crawl towards the number you truly
deserve as you play more, and if you have random good or bad runs along the
way they won't instantly break your SR. Pretty similar to ELO? Simpler tho.
------------14 (final)------------
I hope this was insightful for anybody who read this far.
It would be nice if osu had a true skill-based rating system, and I believe
this is the closest you can get. If anybody thinks you can get any closer than
this, please tell, because I'm curious.
It's not too hard to implement this, but there's a lot of corner cases to cover
and factor-effect testing to do to apply this, so it would take at least a few
months to create this.
Would you support a system like this? Do you like this idea?
Do you think this can rate player skill well?
Can you bring up any example where this would rate player skill incorrectly
and give one player a higher skill rating over time than another player?
Note how this system is barely affected by the amount you play, and just playing
a few hard maps will instantly shoot your SR higher than players who play a lot
of easy maps, but at the same time this system still encourages you to play a
lot to truly reach the edge of the SR you can get on your play level.
Good? Bad? Feedback please -> gogogo
for it to rate players by their playing skill (as opposed to amount of time
played), I have decided to make this thread.
Before you read any further:
1. Please do not post a reply in this thread unless you read the entire OP.
2. This OP is very long, and will take a while to read. For your own
convenience, prepare a sandwich and some coffee before reading. Take short
breaks while reading and take-in every section of information before you move
on to the next one.
3. While I try to keep most of this article objective, there is going to be
some opinion-based information. If you disagree with it and would like to
comment on that, please be specific and say exactly what part you disagree with,
and take the time to write a well-explained reason and counter-argument. Avoid
being vague or else it will be unclear what you mean.
4. Please stay on topic and don't derail this thread. If you're quoting someone,
make sure you stay on the main topic and don't start wandering off into some
sub-topic. To be clear, the main topic is: making a skill-based rating system.
Hopefully this thread will be insightful for all reader, and answer some
questions. I'll get straight to the point and cover the main one:
Q: Is it possible to make a skill-based rating system?
A: Yes. However, it won't be perfect - but it can be very close to perfect.
I'll place little bold lines with numbers to help you read this in parts if you want.
Again, please do not post any reply until you finished reading the whole thing.
------------01------------
As it stands right now, there is a pseudo player-made skill-based rating system.
In other words, if you ask a group of players to take a look at two players,
watch them play, and say which one is better - the players will be able to tell
you that "Player A generally plays better than Player B".
This system has two problems:
1. It's not automatic.
2. It's not accurate.
If we were to create an automatic skill-based rating system, that would rate
player skill with a number - I'll call this number SR from now on - the way to
know if this automatic system works would be to compare the SRs it gives
various players. If for every two players A and B that we take a look at, the
community says that A definitely plays better than B, and A's SR is higher than
B's SR, then we can conclude that the system works correctly.
Once proven to work, the system will shed insight that mere human observation
cannot reach. For example, if there are two players where the community can't
tell for sure who is better, but one of them has a slightly higher SR, than the
community will have to accept that the player with higher SR is slightly better.
Furthermore, this system will be automatic, so you won't have to poll people's
opinions every time you want to compare skills. The SR will always be
up-to-date for each player.
In other words, an automatic skill-based rating system should basically do the
same as asking experienced players how good is each player, except it would fix
the two problems of asking players:
It would be automatic.
It would be accurate.
------------02------------
* SR = Skill Rating. A number that indicates a player's skill in osu. Can be
compared against other players' SRs to know which player is more skilled.
Before we go on and create the skill-based rating system, its nature dictates
that we must understand what "skill" is. If you don't have a solid definition
for what "skill" means in osu, then there's no way you can make a system that
rates players by their "skill".
Is the score you get on a map related to skill? Is the accuracy you get on a
map related to skill? Is the amount of maps you can play before you get tired
related to skill? Is there a difference between the first run on a map and
repeated runs on a map in relation to skill?
Regardless of what skill is, one thing is clear: the only way to measure skill
is with information from playing osu. Nothing else is relevant to your skill in
osu. The only times when you can judge how good a player is, is the times when
he plays on a map, and you would judge it based on information from his results
on that run.
Lets think about all of those points. When you observe two players, is it
possible that one would get a lower score on a map, but you'd still consider
him more skilled in osu? It's possible that a player would miss a note in the
middle (because of a long repeating slider for example) but do perfectly on
almost the entire map, and get a bad score, while another player would do poorly
on the entire map, but manage to hold a longer combo and end up with a higher
score. Would the score help you indicate who played better here? No.
Conclusion: score on a map is not related to skill. Because of that, a skill
based rating system should not take scores into account.
- with this said, please keep scores as they are. They're exciting and fun,
and managing to get a full clear on a map you could barely pass is a nice
reward for your effort. Even that this shouldn't get involved in skill
calculation, don't just abandon the current scoring system. I think it's fine.
Next, if two players play the same map and get more or less equal results on it,
but one player has played it for the first time just now, and the other one
played that map 50 times before that run, who would you consider more skilled?
I believe most people would agree that the one who did better on the first run
is more skilled than the one who needed to practice the map to do well on it.
Conclusion: skill rating should take into account how many times you played on
a map while rating you for your plays on it.
- this means that for a skill-based rating system to exist, the game has to
keep record of how many times the player has played each map. The good news is
that the game already does this.
Next, what if two players play a series of maps in a row without breaks and
get various results on them, and do slightly better or worse during different
times of their sessions. Should the time they have been playing affect the
skill calculation of their plays?
Some might argue that the longer you play in a row, the more you get tired, and
it becomes harder to keep doing well. Others might say it has absolutely no
effect how long have you been playing. Some others can even say that as you go
on and play, you warm up and start doing better towards the end.
Conclusion: the amount you've been playing is unrelated to skill. Even if it is
related somehow, the relation is very vague and there is no good way for a
system to objectively rate you by it, so it shouldn't be included in skill
calculation.
- this was just one example to show that, there are many factors that some
people might consider that they're related to skill, while others would not.
Since the point is to create an objectively accurate system that everyone would
agree on, all vague and unmeasurable factors should be ignored.
Finally, the accuracy you get. This is the factor I believe is most closely and
objectively related to player skill in his run through a map. Regardless of
what score you get, or which parts you played better or worse, if two players
play the same map for the first time and one of them gets a higher accuracy
than the other, then it's evident that - at that run - the player with the
higher accuracy played better.
------------03------------
The goal in osu is to hit everything correctly. There will be obstacles, such
as jumps, stacks, streams, direction change, etc, but in the end - they're just
different levels of difficulty in keeping you away from hitting everything
correctly. If you manage to hit everything correctly, you get 100% accuracy.
For every inaccuracy in hitting a note, regardless of whether it was because of
a jump, or a stack, or whatever, you lose accuracy equally.
In the end, the final accuracy you get is what dictates how well you did.
Lets sum this up:
For the purpose of skill-rating, each player would have an SR. His skill rating.
This SR would be automatically changed every time the player finishes playing on
a map.
The factors that would affect how much his SR changes would be:
1. How many times has he played that map before*
*note: I'll later also introduce the importance of how long ago was the last
play on a map by that player.
2. How much accuracy did the player get on the map
Would this be enough, tho? No, there is one more important factor to take into
account, which is in fact the most important one:
The map difficulty.
If two players play a map for the first time, and get the same accuracy, but
one player played a harder map than the other player, whose SR will get higher?
Obviously, the player who played the harder map would get more SR.
WHICH BRINGS UP THE FOLLOWING KEY POINT
A skill-based rating system cannot exist until osu is able to rate how difficult
a map is. Until the game is capable of telling apart every two maps in the
aspect of "which one is harder" correctly, the game won't be able to correctly
rate which player is more skilled.
The current map difficulty rating, the "star rating", is far from accurate.
Not only that it is not accurate, but it is also limited... it only goes up to
5 stars with 0.5 fractions. This is not enough to evaluate skill!
In order for automatic skill-based rating to exist, the game has to be able to
rate each map's difficulty with a number that is unrestricted by limitations
(large range variable), and this number would affect your SR after your plays.
There is going to be a large section in this post dedicated to explaining how
to correctly rate map difficulty. I will go over an algorithm that should rate
map difficulty very closely to perfection. However for now, lets put this aside
and assume this problem is already solved.
In other words, lets ASSUME for now that each map already has a certain MD
number attached to it, that is calculated by osu once every time the map is
saved in Edit mode.
* MD = Map difficulty. A variable attached to each map that indicates how hard
is it, or in other words, how much skill does the map require. MD will be
accurate enough to determine for every two random maps you pick which of the
two is harder. (higher MD = harder map). MD will be used for SR calculation.
------------04------------
So, lets recap:
Skill-based rating system would rate player skill based on their plays on maps.
Every time a player finishes playing a map, the following variables will be
available:
1. The player's current SR.
2. The map's MD.
3. The accuracy that the player got on that run on the map.
4. The amount of times that player has previously played the map.
5. The amount of time that passed since the last time that player has played
this map, if he played it at least once before.
Again, #5 is a new point that I mentioned but haven't covered yet, I'll cover it
shortly. Also, #1 is a point I was yet to mention - the way that skill based
rating would work, the SR addition or reduction you get from your plays on maps
will depends on your existing SR. For those familiar with ELO rating, this is
going to work pretty similar. It's the world's most proven skill-rating system,
and frankly it just makes sense; I'll cover it shortly later for the osu
perspective.
As far as last time played goes (point 5), playing a map a lot of times in a
row creates an element on memorization that eliminates the reaction time
requirement of maps, in other words, it affects that skills that are required
to get a good accuracy on the map. Regardless of whether it gets harder or
easier over time, it gets different, so skill-calculation must take note of
this.
Now, if you didn't play a map for a long time, you will eventually forget it,
and the memorization versus reaction ratio will once again lean towards reaction
instead of memorization. Because of this, osu should record when was your last
play on a map, and use (CurrentTime minus LastPlayed) as a variable in the
skill calculation system, as a factor for the AmountOfPlays variable.
------------05------------
At this point, here is where we stand:
> I have to introduce an algorithm to correctly rate map difficulty, or in
other words, skill requirement. This is vital for the skill calculation.
Other than this, everything else is in place. Lets assume this system exists
and give a few examples on how it works, to explain why existing SR affects
SR gain or loss from map runs.
Each player should start with a certain SR once he starts playing osu. The
actual number doesn't matter, so lets say 1000. When you create an account, it
has 1000 SR. Every time you play, this SR will either go up or down.
The harder a map you play is, the faster your SR will go up if you do well on
it, and the slower it would go down if you do badly on it.
The easier a map you play is, the faster your SR will go down on doing poorly,
and the slower it would go up if you do well on it.
The more times you have played a map recently, the slower of an SR gain you will
get from doing well on it, and doing poorly on it won't be affected by this.
If you played a map a lot of times, but not recently, the slowdown on the SR
gain by playing it will be more marginal.
How well you do on a map will be purely dictated by your accuracy. Every other
factor, such as score for example, will be saved for other ratings that can be
fun for people to follow, but they will be unrelated to the by-skill rating.
So basically, at this point, those are the entire foundations for the skill
based rating system. The actual factors and numbers you apply here don't matter,
as long as they're consistent within themselves (the only consistency you need
is between SR gain and SR loss).
Whether you end up with a system that gives player A 7213 SR and player B 6102,
or player A 1447 and player B 1413, the system will still equally spread the
entire playerbase on a graph from "most skilled" to "least skilled".
------------06------------
Before I go into the map difficulty rating issue, there are a few points left
to cover:
1. Skill decay over time
2. High level players playing easy maps
Lets say an SR system is already in place. And then a player with a very high
SR, who normally gets very good scores on very difficult maps, suddenly decides
to play an easy map, and of course he gets SS on it on his first try. Should
this increase his SR, at all?
If the SR system works correctly, then, it will barely increase his SR if at
all. He'll have to play 1000 [Easy] maps to barely get 1 extra point to his SR
if he's a player who can normally breeze through insanes.
Not only that, but if he ever gets below 100% accuracy on those easy maps,
it might actually hurt his SR and lower it slightly.
The result would be: players would be discouraged from playing maps too easy
for their level. Whether this is good or bad is up to you to decide, but it
does pose a big problem: once all maps are correctly rated by difficulty,
players will know which map is the hardest. Once a player beats the hardest map
perfectly, everything else he plays will only potentially reduce his SR, so
if he doesn't just "play for fun", but rather plays for rank, he'll have no
reason to keep playing.
This is just one corner case to demonstrate a big issue that comes up with this
system across the entire graph: players would be discouraged from playing osu
if the system perfectly rates their skill. It would make it too pressuring and
not fun to play many random maps or random levels.
Because of this, you must introduce SR decay. Basically, over time, the current
SR you have will decrease and go down until returning to the default (whether
it was zero, or 1000 like I suggested, or whatever number is the default).
Make this decay start after a week, and end after a few months. For example,
start a decay of 5% per day from the moment you haven't played for a week.
Note that 5% per day does not mean 100% loss in 20 days, it will chip away from
your SR for 5% per day at that point of time, so it will never actually return
all the way to "zero", it will just slowly close in on it.
Since the decay starts from the last time you played, playing more maps would
be useful to keep your SR high, even if they're below your level. Also, due to
the nature of skill calculation, it would be more rewarding to keep playing
newly released maps, instead of replaying an old hardass map you beat in the
past that you already have some runs on. So basically, this solves the issue.
However, a perfect reset isn't good enough. If you just reset the decay startup
to zero every time you play any map, then players would only need to play one
map per week to keep their SR from decaying. Instead, make playing a map belate
the decay startup time, but not fully. Apply a factor.
For example, lets say the factor is 50%. It's been a week since I last played,
and now I play a map. After I played it, the week of "time since I last played"
will not reset to zero, but be reduced to 3.5 days, which means my decay will
start in 3.5 days. When I play another map, it will be reduced to 1.75 days,
which means my decay will only start in a little over 5 days.
With a 50% factor you only need to play about 3 maps a week, so maybe it's
better to use a much smaller factor, to encourage people to play more maps to
avoid losing their skill rating which they gained from beating hard maps.
It kinda makes sense, too. You keep playing to prove you're still solid.
If you quit playing for two months, the system would display you as not so
skilled anymore, which makes sense because you probably also started being worse
due to not playing for so long.
And if you quit for several months, the moment you start playing again, if you
just return to playing maps in your old level, you'll quickly regain the SR
you used to have, so you don't lose anything from this decay (unlike in a
rate-by-time-played system, where losing points over time would be a huge
annoyance because you'd need to spend a ton of time to regain points lost, in a
truly skill-based system the points would come back instantly as long as you
still have the skill to deserve them).
Also, you can apply a different decay-startup-pushaway factor for first runs on
maps and repeated runs on maps, to encourage players to play new maps. In other
words, make re-playing maps you already had lots of runs on have little effect
on pushing away your skill decay, at least, much less than playing new maps
that you haven't played before.
So, hopefully the importance of decay is clear now. It kills two birds in one
stone - it encourages players to keep playing maps of all levels, and trying
out new maps - while keeping the skill rating board up to date, and pushing
players who stopped playing down the board by gradually reducing their rating.
------------07------------
Here is the big moment you've all been waiting for: MD how?
How do we rate map difficulty? If we just solve this missing link, a perfect
automatic skill-based rating system can exist.
Before we go any further, let me say this: You can already try out the skill
based rating system to see how it works, by taking a small sample of maps and
giving them player-made number ratings of difficulty, and then just let players
play on those maps and see what results they get, compare this output to
opinions of spectators who saw them play, and see how accurately the systrem
rates people by skill.
However, for this system to truly be autonomous, osu itself has to be able to
numerically rate map difficulty. So, lets create this algorithm now.
Side bonus: once osu can rate map difficulty correctly, you can replace the
current star-rating with an improved star rating that's based on the MD numbers,
and then have correct star ratings for all maps to be used as map level
indication when you download/try out maps.
1star=easy, 2star=normal, 3star=hard, 4star=insane, 5star=veryXinsane,
won't that be nice?
------------08------------
So,
The best way to write a good algorithm is to collect a lot of information. I'll
cover this and guide you through it, to convince you in the correctness of it,
and to explain how it came to be.
Mission: to find out what makes maps difficult.
What we know: the goal in osu is to hit everything correctly, i.e. to get a
300 on every single note in the map and to spin as much as possible.
Everything that keeps the player away from getting any 300 is a difficulty.
So lets start by finding all of the things that keep people away from getting
300s. The first one is very obvious: the [Overall Difficulty] map property.
The higher it is, the less of a frame window you have to hit notes for a 300,
and thus this increases the map difficulty.
What about circle size, approach rate, and HP drain? Those are more complicated
in how they affect skill requirement, and I'll cover them over time as we go on.
Things that are known to add difficulty:
1. Jumps - movement between two points that is faster than the common movement
pace for that section of the map. Reason for difficulty: inconsistency
(different movement speed), speed (jumps are faster than regular movement),
cursor accuracy (the end of the jump - gets harder due to speed, since you have
less time to place your cursor on the correct spot).
2. Faster beats - doesn't nessecarily have to be in a stack, every time the
map suddenly changes from 1/1 into a series of 1/2s, or from 1/2s into a set
of 1/4s, etc, this adds difficulty. Reason for difficulty: inconsistency
(different clicking speed required), speed (need to click faster).
3. Patterns - sections in the map that repeat themselves. This can either
increase or decrease difficulty. For every time there's a very close pattern
repetition, the difficulty of it is reduced, because you know what to expect.
However, when the pattern happens partially and then breaks, this increases
the difficulty, because it's essentially a consistency trap.
4. The BPM of a map - in the end, no matter how you look at it, faster is
harder. Reason: speed (need to hit notes faster and move faster).
Note however that, something general like "BPM" isn't good for correct
difficulty calculation. You need to use raw information. By this I mean,
the actual time (in program loop frames) between actions. Similar to this,
every measure related to speed of clicking and cursor movement, should be
measured by program loop frames and not by musical-term numbers.
Also, it's important to take into account how the human mind works when you
consider this raw information. There are some breakpoints to consider here.
1. The human reaction time is approximately 1/4 of a second. On a 60FPS game,
this would translate into 15 frames, however osu does not have a set FPS,
however it still uses some sort of timing clock, so time should be evaluated on
a raw program scale and not on musical-term scale.
2. Humans can only process up to five items in one pattern. If you see six
items, your brain processes them as either 1+5, 2+4 or 3+3. However, you can
recursively see patterns inside patterns. i.e. a star of triangles, your mind
will process that as a 5pattern of five 3patterns. However if the triangles
are inconsistent with each other you will not see a 5pattern at all.
Patterns are an important part of difficulty, as difficulty basically comes
from three things:
1. The speed you need to do things
2. The accuracy level you need to correctly do those things
3. How easy is it to predict what to do
(4. length of a map)
#3 is decided by pattern creation and breaking during maps.
For example, lets say that for a large part of a map, notes appear more or less
in a line, with only under 60 degrees angle of a different between the movement
line you're required to do with the cursor from one note to another, and then
suddenly a direction change happens and a note appears at a stop that is more
than 60 degrees angle away from your current line. This specific movement will
be harder to do, even if it's not a jump and not a faster note, simply because
it doesn't follow a pattern your mind was following.
In order to have an MD rating for all maps that is consistent between different
maps of all types, osu has to be able to:
1. Rate how hard is it to accurately hit a 300 on a map. In other words,
measure the total frame window for hitting a 300. For example, if this is
tested in a 120FPS loop, there might be a global 6-frame window to hit a 300
per note, this would affect the MD.
2. Rate how fast of an action-taking the map requires you to do. This breaks
into several parts, as there are two actions you do: clicking and moving the
cursor. So basically, there's going to be a rating for clicking speed, and a
rating for movement speed. Note that difficulty isn't a consistent thing for a
map, some parts in the map can be harder or easier than others. You must make
an average out of all click speed and movement speed sections.
i.e. if I need to hit three notes: A...B...C
there are two speed sections and two movement sections here: the first "..."
and the second "...". Movement and clicking are related, and those factors
should be mutltiplied for exponential factoring.
Also, movement speed should be considered as movement between the middle of
one note to the edge of the next note (you can count this as: length between
the middles of both points, minus the circle radi of point2, which is consistent
for the entire map anyway, so basically just minus the circle radi). This is
where circle size will affect the difficulty rating, but not the only place.
Speed of clicking and movement, and accuracy of hitting a 300 - those are
consistent skills related to execution that are not affected by memorization,
although you could argue muscle memory affects this. Either way, they are not
skills related to reaction time.
Patterns and pattern break, though, is directly related to reaction time.
Patterns exist in two flavors: timing patterns and movement patterns. Both
should be taken into account seperately, although they still affect each other.
Since the game is able to play itself on Auto, I don't think it'll be a problem
to add a factor of info-gathering for auto. Basically, collect patterns.
For timing: collect timing sections. Place a limit on it to conserve memory.
Since humans can't process over 5 items simultaneously a limit wouldn't lose
much from real life difficulty; a limit of 15 for timing would be enough.
So for example, for a map with 20 notes, the patterns to try to find would be:
1 through 2, 1 through 3, 1 through 4, etc, until 1 through 15 (limit).
Then 2 through 3, 2 through 4, etc, until 2 through 16.
Once this list of timing patterns is saved, compare them against each other,
and find repetitions. If anything repeated itself exactly twice, it's a
questionable pattern, and if anything repeated at least 3 times it's a definite
pattern.
(as you're already guessing, this comparing is a N^2 loop on two lists, so
pressing "Save" while Editing a map would be time consuming... to avoid this,
simply have an option to "Save without MD calculation", which just saves the
map without calculating its difficulty. You'll only need to calculate a map's
MD once you finished mapping it anyway)
------------09------------
As for movement, the following factors affect patterns:
Type-1: movement speed - this pattern gives you a clue on where is the next
note going to appear, in a circle area at a specific radi from your position.
For every time the next note actually appears in that range, MD is reduced,
while for times it appears too close or too far, MD is increased, at that is
a pattern breaker.
Type-2: angle range between movement lines - this pattern requires long term
memory, you can place a limit of something like 15 on this too. Basically,
constantly remember the average, min, and max angle of difference between the
last 15 (~ or whatever limit) notes, and use this to predict the angle for the
next upcoming movement. When movement follow the recent consensus, MD is
lowered, while when movement suddenly behaves inconsistently, MD increase.
There is also the visual factor to take into account. When notes are stacked
on top of each other, patterns have bigger impact on your ability to either
300, or fail to 300, the stacked notes, especially when the circle approach
rate is below human reaction time.
NOTE THAT, the circle approach rate is never below human reaction time.
HOWEVER, it becomes that, once notes appear faster than human reaction time.
i.e. a stack of three notes with 1/8 timing difference appears in a 200+
BPM song. You're only going to be able to react to the approach circle of the
first circle, the remaining two you will time by pattern recognition, not by
individually reacting to them. At times when this pattern breaks, i.e.
you had several points with fast stacks and suddenly a slow stack appeared that
has the same shape - this kind of thing increases MD, as it's a pattern break.
This might seem trivial when the whole thing is above human reaction time,
but on very fast maps that have below human reaction speeds, patterns like this
are make-or-break and they test your reaction time to patterns.
------------10------------
Ok this is a big of a mess. Lets recap:
For osu to correctly calculate MD per map, it needs to do the following:
1. Rate the speed of the map in non-music terms based on non-program loops
between note hits.
To elaborate on this: you can't simply check the average from start to end.
You need to do a full collection of timing differences and keep them in an
array. i.e.
1/8s difference between two notes: 8 of those
1/4s: 215 of those
1/2s: 119 of those
1/1s: 23 of those
2 ticks: 1 of those
3 ticks: 7 of those
5 ticks: 1 of those
etc
And then take into account what was the most common timing difference, for
example 1/4s, and have the raw loop time of THIS speed requirement have the
biggest impact on the average calculation of the map's speed, while corner
cases with little appearances can be completely ignored as they will usually
be either breaks or a few slow sections in a map that don't truly indicate
the general speed of it.
2. Rate the speed of the movement the map requires. Since players can choose
whatever window size they want, the pixels-per-second doesn't really matter.
DPI is dynamic too. What does matter as far as distance go is movement
relative to circle size. i.e. if I need to move 20 pixels between two circles
with 5px radi in 1 second on one map, or 40 pixels between two circles with
10px radi in 1 second on another map, their movement speed is THE SAME.
3. Rate the level of pattern repeat and pattern break based on both timing
and movement patterns, by going over timing sections and comparing them, and
going over movement speed/direction and spotting inconsistencies.
------------11------------
Things that happen during one approach circles: this is the last difficulty
issue I'd like to talk about.
I hope I'm not the only one who thinks that the "Easy" mod actually makes maps
harder. This is for a good reason.
In the area of time between the appearance of one note and then another,
while you get full reaction time to the first approach circle, the second one
receives less reaction time. As long as you still didn't hit the first note,
you can keep building a queue of timing differences in your head based on
the showup of notes, but once you hit one note and have to start moving on to
the next one you enter a situation where you have to both empty a queue and
add items to a stack at the same time, which is problematic. Every pattern
inconsistency inside this realm has more impact than outside of it.
In other words, the way that MD addition from pattern breaks adds to the map's
MD will be affected by the amount of notes that appear during the timeframe of
the approach rate. Or in other words, sometimes approach rate will actually
make a map harder. If the approach rate is too slow for the map's timing speed,
then it has essentially the same effect as Hidden.
As long as approach rate is higher than borderline human reaction time -
which is 1/2 of a second - it doesn't make a map any easier, so it can only
potentially make it harder. If things inside approach rates happen faster than
human reaction time - which is 1/4 of a second - this adds difficulty too.
Again, this only refers to a case where enough things happen to have stuff
showing up after you already hit a first note of a queue of hits you had.
It's a common case but you need to address it correctly as far as finding each
time it starts and ends and a queue is restarted.
------------12------------
There's a few more things I wanted to talk about but I want to take a break
from writing this as it already got too long. I hope most of this made sense to
you so far.
To sum everything up:
1. A skill rating can exist. It will rate players every time they finish playing
a map. The factors it will use to rate them and either increase or decrease
their current SR would be:
1 - Their current SR.
2 - The map's MD.
3 - The accuracy the player had that run.
4 - Amount of times previously played on that map.
5 - Time of last play on that map versus the current time.
2. There has to be an SR decay system with fast decay, to keep SR tables up
to date with players' activity and to encourage players to keep playing.
3. To create a correct MD for maps that will be useful for SR calculation, the
MD has to be a large range variable, and it should be decided based on raw
speed/accuracy information, not based on musical terms. It should also take
into account patterns in the map, and increase difficulty for pattern breaks
while reducing or just not affecting difficulty for pattern maintaining.
------------13------------
Ok, one more thing I forgot to mention: apply a factor to SR change from map
completion. i.e. if the MD and accuracy of a run I did is supposed to give me
2500 SR, and I currently have 2000 SR, I wouldn't jump to 2500 instantly.
I would get maybe 10% from this run, so my +500 would only give me +50 and I'd
move to 2050. This is to avoid flukes or random mishaps from having drastic
effect on players' SR. Your SR will slowly crawl towards the number you truly
deserve as you play more, and if you have random good or bad runs along the
way they won't instantly break your SR. Pretty similar to ELO? Simpler tho.
------------14 (final)------------
I hope this was insightful for anybody who read this far.
It would be nice if osu had a true skill-based rating system, and I believe
this is the closest you can get. If anybody thinks you can get any closer than
this, please tell, because I'm curious.
It's not too hard to implement this, but there's a lot of corner cases to cover
and factor-effect testing to do to apply this, so it would take at least a few
months to create this.
Would you support a system like this? Do you like this idea?
Do you think this can rate player skill well?
Can you bring up any example where this would rate player skill incorrectly
and give one player a higher skill rating over time than another player?
Note how this system is barely affected by the amount you play, and just playing
a few hard maps will instantly shoot your SR higher than players who play a lot
of easy maps, but at the same time this system still encourages you to play a
lot to truly reach the edge of the SR you can get on your play level.
Good? Bad? Feedback please -> gogogo