forum

[Tool] OsuMania Score Viewer

posted
Total Posts
21
Topic Starter
coldloops
I always felt the in-game search was missing a way to filter by best score/acc/etc, so I made this program to display and filter local scores.
It reads the scores from the scores.db file in your osu directory, it also reads the osu!.db file to display beatmap information.

I made it specifically for mania, so I am posting this here, I hope someone else will find it useful too.

How to use:
  1. make sure you have java 7 or higher: https://java.com
  2. download scoreviewer.jar here
  3. open the program, click "open DB" and select your osu folder.
  4. click on the columns to sort
  5. type in filters on the textbox under each column
  6. the table updates automatically as you play (osu updates the files every 10 min or so, the program updates the table every time the file updates.)
Filters

There are 3 types of columns, for text you can just type what you are looking for, for numbers you can use operators (>, <, =), for example "> 4" to search all above 4.
Dates are similar to numbers, "<1/1/2017" searches for scores older than 2017.

Code

the code is open source, see here: https://github.com/coldloops/scoreviewer
Bobbias
Nice work, I've been bothered by osu's lack of tools for examining scores too. If I ever find the motivation I might be willing to try to add some extra features to this.

EDIT: After taking a quick look, I realize just how long it's been since I touched java, so if I do want to add stuff, it might be a while before I figure out what I'm doing. (I'm used to C# these days)
Topic Starter
coldloops

Bobbias wrote:

Nice work, I've been bothered by osu's lack of tools for examining scores too. If I ever find the motivation I might be willing to try to add some extra features to this.

EDIT: After taking a quick look, I realize just how long it's been since I touched java, so if I do want to add stuff, it might be a while before I figure out what I'm doing. (I'm used to C# these days)
thanks. yeah.. I plan to learn c# someday, but right now I feel more comfortable with java.

If you have any specific question about changing/adding stuff feel free to post here or on a github issue.
aitor98
Damn this is a cool tool indeed but I'm a little bit confused with the density column. What is it based on?
Vladimir Puchin

aitor98 wrote:

Damn this is a cool tool indeed but I'm a little bit confused with the density column. What is it based on?
Average notes/s or so it seems. I just tested with a map and it's total objects / length
edit: Yeah it is.
double den = ((double) total_obj) / time;
Topic Starter
coldloops

Vladimir Puchin wrote:

aitor98 wrote:

Damn this is a cool tool indeed but I'm a little bit confused with the density column. What is it based on?
Average notes/s or so it seems. I just tested with a map and it's total objects / length
edit: Yeah it is.
double den = ((double) total_obj) / time;
that is correct. its nothing fancy, you can interpret that as the average number of notes per second in the map.
just be wary of long notes, they are counted as 1 regardless of length so its not as intuitive as normal notes.
Androix777
I select the osu folder, but it does not load anything. The table remains empty. No errors appear.
Topic Starter
coldloops

Androix777 wrote:

I select the osu folder, but it does not load anything. The table remains empty. No errors appear.
hmm sorry, I haven't implemented a way to display errors yet, I will make an update later.
if you can, could you open it on a terminal to see if any messages appear ?

EDIT: I just released an update, if an exception occurs it should show up now.
https://github.com/coldloops/scoreviewe ... ses/latest
Androix777
Error
SPOILER
java.lang.NegativeArraySizeException
at coldloops.scoreviewer.ScoreDB.readBeatmapScores(ScoreDB.java:46)
at coldloops.scoreviewer.ScoreDB.readScoreDB(ScoreDB.java:17)
at coldloops.scoreviewer.ScoreTableModel.readScoreTable(ScoreTableModel.java:48)
at coldloops.scoreviewer.Interface.reloadData(Interface.java:69)
at coldloops.scoreviewer.Interface.access$400(Interface.java:18)
at coldloops.scoreviewer.Interface$1.actionPerformed(Interface.java:57)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Topic Starter
coldloops

Androix777 wrote:

Error
thats really weird, it says that you have a negative amount of scores on a beatmap.

would it be possible to send me your scores.db file ? I think I need to see the file to understand whats going on. send me a PM.

EDIT:
I got the file, after a few rounds of debugging, turns out scores with the target practice mod(std only) have some extra bits in the scores.db file, this was confusing the parser.
The new release fixes this issue, thanks Androix777 for the help.
ReTLoM
rally nice tool :O
can you add a FC column some how or cant you see max vs actual combo / misses inside the score DB
and multiple search parameters somthing like in length <5 & >3,5
Bobbias
Unless osu stores whether a score is an FC or not somewhere in the file, there's no easy way to get that information.

It's VERY hard to figure out max combo, because you can actually get a higher combo by holding an LN for too long. Osu doesn't store any information about the max combo. You would basically have to watch an autoplay play of something to get the "perfect max combo" but it's possible to get a combo above that by holding LNs too long, so that's not even the actual maximum. Combine that with breaking LNs not counting as a miss, and you can have 0 miss plays that don't have a FC.
ReTLoM
Just consider 50s as a miss for a "fc" clear 50s should brake combo anyways /run
Topic Starter
coldloops
can you add a FC column some how or cant you see max vs actual combo / misses inside the score DB
there is a flag on the score that indicates if the score was a "perfect", not sure if thats what you are looking for, otherwise yeah pretty much what Bobbias said.

and multiple search parameters somthing like in length <5 & >3,5
yes, I really want to implement something like this but didn't had the time to work on it yet, the search/filter system comes from this library but this isn't supported, I will have to extend it somehow.
Worms
woa cool stuff

adding a search function would be nice imo
Topic Starter
coldloops

Worms wrote:

adding a search function would be nice imo
sorry I'm not sure I understand what you are asking, you can already search each columm by typing words on the textbox under each column header.
Kamikaze
This tool is really nice, would it be possible though to load up collections (from the collections files) alongside so you can view only scores from that collection?
That would be really useful for example for training mappools or specific types of charts
Also the ratio column is pretty unclear, I think it would be better to just display max:300 ratio or just amount of maxes/amount of 300s
Oh and score v2 mod doesn't show up for some reason
Topic Starter
coldloops

-Kamikaze- wrote:

This tool is really nice, would it be possible though to load up collections (from the collections files) alongside so you can view only scores from that collection?
That would be really useful for example for training mappools or specific types of charts
Also the ratio column is pretty unclear, I think it would be better to just display max:300 ratio or just amount of maxes/amount of 300s
Oh and score v2 mod doesn't show up for some reason
I don't really use collections but it was easy enough to add this.

so in this new release I added a menu (right click column headers) to hide/show columns, this allows me to add extra columns but still let each person to choose which columns to see. There are 2 new columns in this release but they are hidden, right click the headers to show them.

I also added the scoreV2 mod that was missing and fixed the ratio column, I agree it should be a ratio of max/300.

https://github.com/coldloops/scoreviewe ... ses/latest
Full Tablet

coldloops wrote:

fixed the ratio column, I agree it should be a ratio of max/300.
max/total ratio is more important than max/300 ratio

max/300 ratio only matters if your accuracy was high to begin with (so max/300 is closely related to max/total), while if your accuracy was low (many 200s or worse judgments), then max/300 ratio is not closely related to how accurate the play was.

Showing the judgment spread gives even better info.
Topic Starter
coldloops

Full Tablet wrote:

coldloops wrote:

fixed the ratio column, I agree it should be a ratio of max/300.
max/total ratio is more important than max/300 ratio

max/300 ratio only matters if your accuracy was high to begin with (so max/300 is closely related to max/total), while if your accuracy was low (many 200s or worse judgments), then max/300 ratio is not closely related to how accurate the play was.
I agree that max/total gives more information than max/300, but I think that when people talk about "ratios" they are talking about max/300.
also, the issue of using the total is that the max is included in the total so it works better as a percentage, thats why I decided to change it to max/300.
but since I implemented the hidden columns thingy, I can just add an extra "max percentage" column instead of choosing one over the other.

Showing the judgment spread gives even better info.
I could add that in a column as well ( like max:300:200:100:miss), I just need to define a nice ordering for it, single numbers are simple because the ordering comes for free.
Topic Starter
coldloops
I just released a new version:

* added the max% column (which was the old "ratio" column)
* added the judgments column, it shows the numbers of each of the judgments
* "and" queries are now supported on number columns,

that means you can now filter by ranges, for example: ">4 & <5" for the stars column.
Please sign in to reply.

New reply