GithubHelp home page GithubHelp logo

abraker95 / ultimate_osu_analyzer Goto Github PK

View Code? Open in Web Editor NEW
28.0 4.0 1.0 9.46 MB

Python rewrite of my old osu analyzer that aims to be a lot more useful

License: MIT License

Python 100.00%
osu osugame osumania osu-api osu-mania

ultimate_osu_analyzer's People

Contributors

abraker95 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

teamxeno-rl

ultimate_osu_analyzer's Issues

Add standard key press visualization

Make it three different replay layers. The layers will show actions (hit, hold, release) up to a certain time back (user adjustable, but 1 second by default).

  • Hit layer: Point where the player presses key
  • Release layer: Point where the player releases key.
  • Hold layer: Path where the player holds the key.

Colors for the visualization of each layer should be chosen so that they won't be confusing when displayed together.

Replay Manager

Replay manager is located in the replay tab and contains a list of loaded replays for the currently displayed map. The replays should be able to be sorted by either:

  • Player name
  • Score
  • Mods
  • Accuracy
  • Hits/Misses

Items in the list are displayed via replay title and have the following functionalities:

  • allow to toggle replay layer visibility
  • can be removed, which removes all layers and unloads replay from memory
  • can be searched for, which is needed for situations a lot of replays are loaded

Additionally right clicking on items allows the following options:

  • make only this replay visible
  • Add offset graph
  • open replay folder
  • add/remove replay layers
  • copy replay code to clipboard (this is basically the code allowing to access the selected replay in the embedded console. Something like get_replay_manager().get_replay(343))

Objects in 2B maps still not showing up in some conditions

The get_hitobjects_visible_at_time function in beatmap_utility.py isn't perfect. There are certain cases where 2B still causes object to wrongfully disappear.

Breaks on the following condition, where t is any time value:

hitobject_timings = [ (t , 5t), (2t, 3t), (3t, 4t) ]
Condition: t < time < 2t
Returns: [ ]
Expected: [ 0 ]

Publish to PyPi

Hi, I'd like to be able to use code from this repository in another project. For now, using a git submodule suits my needs, but it would be nice if I could just pip install it (or ideally, parts of it). I'm not quite familiar enough with Python or with your codebase to do it myself.

The IPython console is blocking

Which makes any loop freeze the gui. It is possible to make kernel run in another process and connect to it (see this). However, I don't know how to go about pushing variables from the gui into the kernel via that way.

Add a scoring metric to standard and mania

Takes in hitobject and replay data to give a data on whether the player hit an aimpoint within the hitwindow or missed it. The hitwindow is made up of 3 parts: Hit, Miss, Nothing which determines the effect of a key press or release.

  • Hit: Player hit the note/aimpoint. Processing determines how accurately and precisely the player hit the note/aimpoint. The iterator goes to the next note.
  • Miss: The player misses the note/aimpoint. Indicates whether it is an early miss or late miss. The iterator goes to the next note.
  • Nothing: The note is not processed. Range beyond the miss window.

The following parameters modify the range of the hitwindow sections:

  • pos_hit_range: the ms range of the late hit window
  • neg_hit_range: the ms range of the early hit window
  • pos_miss_range: the ms range of the late miss window
  • neg_miss_range: the ms range of the early miss window

The following flags modify the behavior of the hitwindow sections:

  • notelock: Disables hitting next note too early. If False, the neg_miss_range of the current note is overridden to extend to the previous note's pos_hit_range boundary.
  • dynamic_window: Overrides the miss and hit windows to correspond to spacing between notes. If True then all the ranges are are overridden to be split up in 1/4th sections relative to the distance between current and next notes like so.
  • blank_miss: Enables missing in blank space. If True, the Nothing window behaves like the miss window, but the iterator does not go to the next note.
  • no_miss: Disables missing. If True, the miss windows are overridden to have 0ms range
  • lazy_sliders: If True, remove miss window for sliders. This allows to hit sliders and release them whenever
  • overlap_miss_handling: There are cases for which parts of the hitwindow of multiple notes may overlap. If True, all overlapped miss parts are processed for one key event. If False, each overlapped miss part is processed for each individual key event.
  • overlap_hit_handling: There are cases for which parts of the hitwindow of multiple notes may overlap. If True, all overlapped hit parts are processed for one key event. If False, each overlapped hit part is processed for each individual key event.

Weird and interesting effects can be produced via combining various flags. For example, setting the the blank_miss and no_miss flags to True results in being able to press anywhere to hit the next note.

Layer groups

Allow grouping of layers like folders. For example, all layers related to replays can be under one group, all layers relayed to map can be in another, and so on.

requirements.txt file contains outdated dependencies, causing incompatibility issues

The current requirements.txt file in the project contains some outdated dependencies, which result in compatibility issues when using the latest version of pip to install them.

I tried to change some of them to older version and the test still failed

numpy==1.18.0
pandas==0.25.3
scipy==1.5.0
matplotlib==3.1.3
pyqtgraph==0.11.0rc0
osrparse==3.0.0
pyqt5==5.14.1
qtconsole==4.7.0
requests==2.23.0
sphinx==2.3.1
sphinx-rtd-theme==0.4.3
notebook==6.0.1
jupyter-client==5.3.1
watchdog==0.10.2
beautifulsoup4

Additional Information
Operating System: Windows11
Python Version: 3.8.10
pip Version: 24.1.2

Cannot load replay

When trying to load any replay included in 'unit tests' folder, I get this stack trace

Traceback (most recent call last):
  File "run.py", line 472, in dropEvent
    if file_type == 'osr': self.open_replay(path)
  File "run.py", line 295, in open_replay
    replay = ReplayIO.open_replay(replay_filepath)
  File "C:\Users\sunny\Programs\ultimate_osu_analyzer-master\osu\local\replay\replayIO.py", line 17, in open_replay
    replay = Replay(replay_data.read())
  File "C:\Users\sunny\Programs\ultimate_osu_analyzer-master\osu\local\replay\replay.py", line 19, in __init__
    osrparse.replay.Replay.__init__(self, replay_data)
TypeError: __init__() missing 2 required positional arguments: 'pure_lzma' and 'decompressed_lzma'

Any hints?
I'll give a try looking into it myself when I have time.

requirements.txt has invalid expression at line 6

I'm not friendly with github, so I upload the error on the issue page.

In requirements.txt, line 6 is written as osrparse=3.0.0, which must be osrparse==3.0.0.

Please send pull request for this issue.

Ability to change layer/display settings

  • Mania display settings: viewable_time_interval, note_width, note_height, note_seperation
  • Mania replay settings: opacity
  • Standard replay settings: viewable_time_interval, cursor_size, cursor_color

Timeline Widget

  • TimeLine widget:
    Set time range
    Dragging, zooming
    Jump to time
    Time labels
  • Current time marker:
    Bound within range
    Dragging
    Emit time change signal

No Graph

Sorry if this is a stupid question but,
Screenshot (704)
Screenshot (705)
I can't make graphs.

Add support for modded replays

Figure out how to display replays when mods differ in loaded replays (DT cannot be displayed with HT or nomod, for example)

Black hole - Pluto crash

Crashes when dragging timeline cursor at around 80000 ms

Traceback (most recent call last):
  File "C:\Users\abrak\Documents\dev\repos\osu-replay-analyzer-v2\gui\objects\layer\layers\std\aimpoint_vector_layer.py", line 54, in paint
    painter.drawLine(pos_x*self.ratio_x, pos_y*self.ratio_y, (pos_x + vec_x)*self.ratio_x, (pos_y + vec_y)*self.ratio_y)
OverflowError: argument 4 overflowed: value must be in the range -2147483648 to 2147483647

Add Maps tab and move to map manager to there

A change in how maps will be handled.

It's a pain to keep more than 3 tabs open due to long tab names, and if they are shortened, it's hard to know which tab is which map. So like the Replays tab, the Maps tab will have a list of loaded maps for which the player use to toggle the display of. Adding map to display adds a tab, Removing map from display removes the tab.

Consider having two views: Flat view which lists all maps, and Grouped view which shows and allows grouping maps like layers.

Search functionality might be needed

This is also a prerequisite for allowing mass map analysis

Question regarding your implementation

I've been playing around with parsing .osr files recently (of osumania, if that's relevant), and they seem to match up reasonably well with the hitpoints from the relevant .osu files from looking at a couple random samples. There's way too many of them (by a couple thousand, usually) though, and drawing them in a manner similar to how you do it (visually, not sure how you actually do it) yields little to no consistent overlap.

Testing the same replay and beatmap with your tool worked just fine though. I've never written Python code before and while some parts of its syntax are conveniently intuitive, others decidedly aren't -- I haven't been able to grasp the full "lifecycle" of the replay stream in your application.

Thus my question(s): Do you filter actions at all, and how do you determine which column they belong in? (I do some dirty bitwise manipulation on the x field currently, not sure if that is the standard way.) I'd be perfectly happy with you just pointing out the relevant source files, I'll take it from there.

Thanks in advance, and sorry if this isn't the place for questions like these!

Hit window visualization

This comes with two different methods of visualization: In display and as its own thing

Visualizing hit window would help with knowing how various hit window settings affect the hit window. The visualization consists of a horizantal bar with color indicated hit (blue) and miss (red) windows, and a scale in ms below the bar.

In display hit window visualization can be done with Taiko and Mania (where position as a function of time is available). The bar is applied to every displayed note, so it is possible to see how player key events affect scoring. The bar is aligned horizontally for Taiko and vertically for mania.

Crash on opening FAIRY FORE - Vivid (Hitoshirenu Shourai)

I only got osu original tutorial working

C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master>py "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\run.py"
get_time_range
Traceback (most recent call last):
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\run.py", line 232, in request_open_beatmap
    self.open_beatmap(beatmap_filepath)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\run.py", line 237, in open_beatmap
    self.apply_beatmap(beatmap)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\run.py", line 248, in apply_beatmap
    self.map_manager.add_map(beatmap, beatmap.metadata.name)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\gui\widgets\map_manager.py", line 46, in add_map
    if self.currentIndex() == idx: self.map_changed_event(idx)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\misc\callback.py", line 13, in Func
    return func(*args, **kwargs)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\gui\widgets\map_manager.py", line 85, in map_changed_event
    self.map_changed_event.emit(self.tabData(idx))
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\misc\callback.py", line 42, in exec_callbacks
    Func.returns[callback] = callback(*args, **kwargs)
  File "C:\Users\oSumAtrIX\Desktop\ultimate_osu_analyzer-master\run.py", line 356, in change_map
    min_time, max_time = beatmap.get_time_range()
TypeError: cannot unpack non-iterable NoneType object

Adding replay causes crash after closing prev map tab

Replication steps:

  1. Open a map. There should be a tab
  2. Open that map again. There should be two tabs now.
  3. Close out the prev tab (the first tab opened). There should be one open tab now
  4. Open a replay for the map

Add mania replay visualization

Make it three different replay layers.

Hit layer: Horizontal lines where the player presses key
Release layer: Horizontal lines where the player releases key.
Hold layer: Filled area where the player holds the key.

Colors for the visualization of each layer should be chosen so that they won't be confusing when displayed together.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.