dev changelog 20180324

published 26 Mar 2018

Back again, sorry it took so long! This post’s a long one (aka we’ve been busy!). I hope these posts are worth it, because the amount of time it takes to keep this up is pretty insane!

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

Add the ability to skin the gameplay cursor #2257 (peppy)

While custom trails are not supported, the basic pieces of the cursor are now free to be customised. This was one of the highest priority skinning requests.

Add the ability to take in-game screenshots #2199 (UselessToucan)

With a quick press of F12 you can permanently save your memories to disk.

As with stable, you can also choose the format if you prefer lossless output.

Restore old auto-popout notification overlay behaviour #2280 (peppy)

In recent builds, notifications don’t automatically pop-out. While this was less annoying, it also meant that notifications were basically invisible to the user (even when they were important).

For now we’ve restored the behaviour of having the notification overlay pop out every time. You can dismiss it by clicking anywhere on the screen now, so it’s not near as annoying. Eventually we will have toast notifications which will appear without the need for the full notification overlay, so consider this a stop-gap solution.

Make Beatmaps decodable as Skins #2253 (peppy)

Beatmaps with custom skinned components will now get similar treatment to user skins. Going forward they will benefit from improvements to legacy skin support. I’d love to make a video showing this off but.. it happened to regress in the latest release, so that will have to wait ^^;.

Note that for the time being, there is no toggle to disable this, so they will have priority over user skins. A toggle will be added soon.

Implement the editor’s beat snap divisor #2247 (smoogipoo)

One component at a time, the editor is approaching a state where it could be considered usable.

Implement an interface for moving hitobjects in the editor #2195 (smoogipoo)

In theory, this would mean that hitobjects are now draggable in the editor. In practice, this regressed and isn’t working in the latest release, so let’s jsut pretend that it works for the time being.

Add skin support for hit judgements #2181 (peppy)

While the animation is still missing, you can now customise your judgement explosions visually.

Implement mania star difficulty calculation #2124 (Poyo-SSB)

We now have accurate star difficulty calculations for three of four default game modes! All that remains is osu!catch (please someone help make it happen).

Match HP drain harshness closer to stable #2183 (peppy)

After many of you reached out about the HP drain being insanely high, we’ve decided to reduce its effect to 50% until we decide on a final algorithm.

Implement updated volume control overlay design #2165 (jorolf)

Mmm, glowy! Still plenty of usability tweaks that need to be applied to the volume overlay, but at least it matches the surroundings now.

Add recent section to user profile #2120 (naoey)

Gradually the user profile section is getting more complete. This time we add the “Recent Activity” display.

Allow previewing background adjustments at player loading screen #2045 (UselessToucan)

As you are already accustomed to, changes made on the visual settings panel are now conveyed in real-time.

Other Changes

  • Increase deploy delta keep #2301 (peppy)
  • Move binding to LoadComplete #2300 (peppy)
  • Fix beatmap background fade not being updated on retry #2296 (smoogipoo)
  • Fix volume glow being cut off #2294 (smoogipoo)
  • Fix API never stopping its thread #2293 (peppy)
  • Fix player not getting disposed in some scenarios #2292 (peppy)
  • Add perfect mod icon #2290 (Joehuu)
  • Fix BeatmapCarousel’s flush not correctly applying selection changes #2289 (peppy)
  • Fix mod button sounds playing when mod overlay is not visible #2255 (peppy)
  • Only allow settings or notifications to be visible at once #2279 (peppy)
  • Fix FocusedTextBox in line with framework changes #2278 (peppy)
  • Use cached VertexBuffer add delegate #2277 (smoogipoo)
  • Don’t hard-crash when an unknown section is encountered in a legacy file #2276 (peppy)
  • Fix osu! logo making hover beat sounds when not visible #2272 (peppy)
  • Fix retry not allowing continuing beyond PlayerLoader #2270 (peppy)
  • Fix DummyRuleset getting selected after non-matching filter #2262 (peppy)
  • Update nuspec to include humanizer localisations #2258 (peppy)
  • Add scale adjusts to bring legacy skins in-line with lazer sizing #2256 (peppy)
  • Add skin/beatmap lookup hierarchy #2254 (peppy)
  • Remove ComboColour from HitObjects #2252 (peppy)
  • Hard bail on attempting to import an invalid archive format #2246 (peppy)
  • Make import notifications fail when any imports fail #2245 (peppy)
  • Add skin.ini parsing #2244 (peppy)
  • Fix crash when attempting to select objects that don’t have masks #2243 (smoogipoo)
  • Fix juice stream droplets spawning in incorrect locations #2231 (peppy)
  • Rewrite the way clocks are handled in the Editor #2226 (smoogipoo)
  • Implement mousewheel time scrolling in the editor #2225 (smoogipoo)
  • Make DrawableHitObject a CompositeDrawable #2223 (peppy)
  • Improve mods description and adjust multipliers to match stable #2219 (Joehuu)
  • Consolidate API into its own component #2218 (peppy)
  • Fix beatmap combo colours not being applied #2215 (peppy)
  • Fixed exit from game saves username instead of email #2214 (VPeruS)
  • Update framework #2209 (peppy)
  • Fix autoplay button wrongly being active after a Ctrl-Enter play #2207 (FreezyLemon)
  • Create a base TestCaseEditor for rulesets to derive #2206 (smoogipoo)
  • Move test beatmap from TestCasePlayer into an instantiable class #2205 (smoogipoo)
  • Fix slider circle overlays moving with the endpoints #2204 (smoogipoo)
  • Fix check against LegacyID for non-default rulesets #2200 (HoLLy-HaCKeR)
  • Fix login failure for users with no country rank #2198 (peppy)
  • Update ISSUE_TEMPLATE #2197 (peppy)
  • Split out the slider head into a separate drawable hitobject #2194 (smoogipoo)
  • Fix major regression (framework revert) #2193 (peppy)
  • Rework decoders to be more flexible #2191 (peppy)
  • Update framework #2190 (peppy)
  • Interpolate ParallaxContainer’s scale #2189 (peppy)
  • Add Mirror Mod for Mania #2188 (tgi74)
  • Add drawable to display (and update) relative dates #2185 (peppy)
  • Remove judgements when deciding a new judgement for a HitObject #2182 (peppy)
  • Make gameplay cursor vs skip button feel nice again #2170 (peppy)
  • Make osu!mania conversions more in-line with osu!stable #2169 (smoogipoo)
  • Rewrite BreakOverlay to work with rewinding #2160 (peppy)
  • Make song select ensure current beatmap is always playable in the active ruleset #2159 (naoey)
  • Improve mouse-based load inhibition at player loading screen #2078 (UselessToucan)
  • Fix difficulty calculator regression when applying mods #2186 (peppy)
  • Removing “mouse wheel disabled” checkbox from visual settings in gameplay #2184 (pdrapoport)
  • SliderTick transform improvements #2178 (peppy)
  • Fix arbitrary API request errors getting identified as timeouts #2177 (peppy)
  • Make LegacyID nullable #2176 (peppy)
  • Update framework with FlowContainer changes #2175 (smoogipoo)
  • Fix left and right arrows keys in chat overlay not working #2174 (peppy)
  • Fix taiko drumrolls potentially getting incorrect judgements #2171 (smoogipoo)
  • Fix incorrect slider-to-drumroll conversions in taiko #2167 (smoogipoo)

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Expose the ability to disable background performance profiling #1482 (peppy)

We have automatic logging of stutter frames to log files for further analysis. Unfortunately, the overhead from this being done on four threads can result in more stutters in a cascading effect. For now, this performance analysis is disabled by default and can be optionally enabled by the user when required.

For what it’s worth, this same behaviour exists but only in CuttingEdge builds, to reduce the latency overhead for normal users.

Overhaul transform logic to fix many failing rewind/seek cases #1437 (peppy)

I undertook this complex task of ensuring frame-accurate rewind logic as the bugs surrounding transform rewindability were piling up. Things are in a very good state now, with the only remaining known issue being mostly unrelated to transforms themselves (approach circles get stuck on screen due to proxy drawables).

Refactor GameWindow to not extend OpenTK.GameWindow #1420 (swoolcock)

This is a step towards getting the iOS build projects into the main development stream. Allows for more abstract window types to be the backing for game display.

Fix memory leaks post game exit #1472 (peppy)

We’re still tackling a scenario where our unit tests get stuck in an endless loop state. This was another attempt to fix that. In the process, we managed to find a few memory leaks, although none of these will affect the end-user in any meaningful way as they only occur if you run multiple Game/GameHosts in a single execution.

Add method to retrieve a Bitmap of the current GL screen state #1454 (UselessToucan)

This is the framework prerequisite to get screenshot capture working at osu!’s end.

Other Changes

  • Add check for IsCancellationRequested in TcpIpcProvider #1480 (peppy)
  • Add a cached delegate for VertexBatch.Add() #1477 (smoogipoo)
  • Fix Incorrect Behaviour of ContainerExtensions.Wrap in Certain Cases #1476 (Tom94)
  • Fix performance of TakeScrenshotAsync #1475 (peppy)
  • TextBox should only handle keyboard input when focused #1471 (peppy)
  • Add wrap method to remove duplicate code in effects #1470 (default0)
  • Fix macOS platform modifiers not being properly loaded #1468 (smoogipoo)
  • Fix seekOffset being considered when seeking #1466 (smoogipoo)
  • Fix being able to seek TrackVirtual to negative time values #1464 (smoogipoo)
  • Avoid background saves after actual saves occur #1462 (peppy)
  • Add a base component class #1461 (peppy)
  • Make ChildID internal #1460 (peppy)
  • Fix TextSize changes not being correctly applied to unchanged characters #1459 (peppy)
  • Rename frameBufferX -> drawNodeX #1457 (smoogipoo)
  • Add logging of failed response processing to network log #1453 (peppy)
  • Reintroduce & fix gamewindow refactor #1452 (FreezyLemon)
  • Revert GameWindow changes #1451 (peppy)
  • Add method to add arbitrary drawables to TextFlowContainers #1450 (peppy)
  • Remove highly unnecessary log output #1449 (peppy)
  • Make TabControl’s tab flow overridable #1447 (smoogipoo)
  • Remove depth comparisons from FlowContainer ordering #1446 (smoogipoo)
  • Allow SampleManagers to cache failed lookups #1440 (peppy)
  • Recreate changes for explicit flow order from #1261 #1304 (default0)
  • Update licence year #1445 (jacksonisiah)
  • Move CursorContainer’s Add to BDL #1442 (peppy)

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

Add site switcher orb to aid in navigation between old and new site. #2778 (nekodex)

As we move closer to deprecating the old site, I wanted to make it easier for users to get a taste of the new site (but also get back to the old site if they find any lingering issues).


As of today, the site will also remember your preference and ensure you remain on that version wherever possible.

Update ranking eta calculation to match new per-ruleset queues #2746 (nanaya)

To allow for fairer qualification queues, we now allow up to 8 beatmaps to enter ranked from qualified each day per game-mode rather than being in a single global queue. Estimates shown on the new modding system have been updated respectively.

Add link to to user post history #2711 (notbakaneko)

Due to popular demand, we prioritised getting post counts and user-specific post listings implemented sooner rather than later.

Mail notification toggle for forum topics #2693 (nanaya)

You can now choose whether you want to receive email notifications for your forum subscriptions.

You can change this setting from a forum thread as you’re viewing it, too. Check the button on the bottom-left toolbar.

Add beatmap status to beatmap panels and beatmap page #2688 (nekodex)

The ranking status of beatmaps are now displayed everywhere their panels are visible. Really neat UX improvement, in my opinion.

Include poster in forum search results #2656 (notbakaneko)

Previously it was not easy to know who was responsible for a post in the forum search results. Now a ba

Account standing section #2573 (LiquidPL)

You can now once again see what you did wrong if you’ve been a bad little Jimmy.

A final note

We are listening to your concerns on decreased usability in certain areas of the new design (regularly people saying stuff is “too big” or “too spaced out”). You’re welcome to continue to voice your concerns, but just know that we do have some huge design changes in the pipeline which dial things back and make the whole site a lot more usable.

Except to see these changes hit before the old site is completely removed from existence.

And don’t worry, we haven’t forgotten about profile badges (for tournament winners), the PM button or anything else that might feel missing at the moment. Bear with us for just a bit longer!

Here’s a preview of the direction we’re going. I’m going to get in trouble for sharing this. Sorry flyte!

Other Changes


dev changelog 20180306

published 07 Mar 2018

Hi guys. Back at you with updates since the last post, split into respective projects:

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

A whole lot of work has been done, focusing on beatmap conversion, compatibility, performance and bug fixes. A lot more maps should now play correctly and performance should be 2-10x higher than what it was. Also, basic skin support is in!

Rewrite replay frame construction/handling and accommodate for conversion #2137 (smoogipoo)

Until now, we were relying on a global replay frame across all rulesets, to allow for importing replays from existing .osr files. While this had its place, we definitely want a more generic replay frame structure going forward. This change separated out the legacy frames from a newer frame format which can be designated by the ruleset itself.

Implement hitobject selection overlays in the editor #2095 (smoogipoo)

You can now see outlines surrounding the selected objects. Another step forward for the editor!

Reduce parallax effect during gameplay #2134 (peppy)

We heard your feedback and have reduced the parallax effect on gameplay screens. This should mean you can still enjoy distraction-free gameplay without completely disabling parallax.

Implement skin support for (most) hitsounds and (osu!) hitcircles #2105 (peppy)

After getting a lot of framework in place, we can finally import skins! Drag-and-drop an .osk into the window and you should now see your skin under the new dropdown. Note that this is not the final method of selecting skins.

For now only a few skinned elements are implemented as a trial of the implementation. Going forward we will gradually be adding further elements. Parsing of skin.ini is the next priority.

Other Changes

  • Fix taiko drumrolls potentially getting incorrect judgements #2171 (smoogipoo)
  • Add legacy timing offsets #2166 (peppy)
  • Fix skin file path lookup performance #2164 (peppy)
  • Fix hard crash due to spinner spin requirement being zero #2163 (peppy)
  • Add rewind support for storyboards #2162 (peppy)
  • Fix parallax container during rewinds #2161 (peppy)
  • Fix linear perfect curves not using the linear curve approximator #2155 (smoogipoo)
  • Only use osu.Desktop to determine test assemblies #2154 (smoogipoo)
  • Implement an interface for beatmap conversion tests #2153 (smoogipoo)
  • Fix HR not properly applying to sliders #2146 (smoogipoo)
  • Fix FastRandom using uint instead of int for NextDouble() #2144 (smoogipoo)
  • Don’t use BufferedContainer for OsuLogo #2143 (peppy)
  • Fix legacy catch replay input not being scaled to the playfield’s width #2142 (smoogipoo)
  • Fix importing some (broken) beatmaps looping infinitely #2136 (peppy)
  • Improve clock handling logic for gameplay #2126 (peppy)
  • Fix slider heads fading out too late #2138 (peppy)
  • Fix depth of already-visible panels not being updated after a sorting change #2135 (peppy)
  • Ensure selection is finalised before exiting song select #2132 (peppy)
  • Fix incorrect exit block conditional #2131 (peppy)
  • Fix bindings not being unbound on ModSelect #2129 (peppy)
  • Fix song select iteration when all panels are filtered #2127 (peppy)
  • Improve vector conditional #2123 (peppy)
  • Remove null channels from SkinnableSound playable channels #2118 (peppy)
  • Rely less on every-frame transform helpers #2117 (peppy)
  • Fix sliders never getting a correct lifetime set #2116 (peppy)
  • Give DrawableSlider an accurate position and size #2107 (smoogipoo)
  • Reset mouse confine mode on input setting reset hotkey #2099 (peppy)
  • Fix legacy Taiko replays having reversed inputs #2098 (tgi74)
  • Use Multicore JIT #1966 (UselessToucan)
  • Fix migration file case #2112 (VPeruS)
  • Implement skin import, database and storage #2103 (peppy)
  • Update framework #2101 (peppy)

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Set display colour depth to correct value when switching to fullscreen #1428 (LastExceed)

Quite a few users were reporting full screen mode switching their display colours to 256 colour (definitely less than how many we need!). Should now be resolved.

Improve performance of SetGlobalProperty #1414 (peppy)

Tackling performance at the lowest level, I made some changes to the way shader properties were assigned to reduce overhead. 5-10% improvement in the best cases.

Fix transforms on RemoveCompletedTransforms drawables applying forever #1413 (peppy)

There was a regression when rewind support was added causing old (already-completed) transforms to continue updating indefinitely. This saw performance degrade over the length of a beatmap. Now resolved.

Avoid updates / generating draw nodes for valid BufferedContainers #1416 (peppy)

Buffered containers are our method of drawing to textures. We use them regularly to cache complex drawable structures and reduce overhead. Until this change, the caching was only improving performance in very minimal ways (mostly fill rate). Now, the cached state stops all child updates and expensive draw thread updates.

Other Changes

  • Move CursorContainer’s Add to BDL #1442 (peppy)
  • Load log entries asynchoronously #1436 (peppy)
  • Allow graceful failure when dynamic compile fails in TestCase constructor #1435 (peppy)
  • Avoid including directories with many files in dynamic compile watch list #1434 (peppy)
  • Fix null ref regression #1430 (peppy)
  • Inline out variables #1425 (UselessToucan)
  • Cleanups to clock handling #1423 (peppy)
  • Fix transforms of same type/time not being removed correctly #1427 (peppy)
  • Don’t unnecessarily update depth if depth is already set correctly #1426 (peppy)
  • Ensure bindings unbind in both directions when explicit UnbindBindings is called #1424 (peppy)
  • Catch exceptions thrown during dynamic compilation runtime #1422 (peppy)
  • Use same argument order in all transformable conditionals #1421 (peppy)
  • Add logging when threads fail to join in time #1419 (peppy)
  • Fix VisualTests crashing on first startup due to incorrect configuration #1415 (peppy)
  • Don’t track all used objects #1412 (peppy)
  • Reduce dependence on zero-duration transforms #1411 (peppy)
  • Always confine cursor when left mouse button is pressed #1408 (UselessToucan)
  • Add a LoadAsyncComplete method #1410 (peppy)
  • Allow resource managers to accept and return null #1405 (peppy)

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

User monthly plays and replays watched charts #2608 (nanaya)

Adding back missing profile pieces. Graph design is going to be updated to feel a bit better, consider this temporary!

Add dedicated search box for mobile layout #2597 (nekodex)

It was noted that finding the search option on small screens was near impossible. We’ve adding an always-visible search box to solve this one.

Show post count on user profile page #2578 (notbakaneko)

Improved page title #2531 (nanaya)

Page content-related descriptive text is now prioritised at the start of page titles, so you can more easily find tabs.

Threaded forum search #2332 (notbakaneko)

Forum search have received some upgrades. Go test it out here.

Other Changes


dev changelog 20180222

published 23 Feb 2018

Having reached out on twitter for feedback and getting a huge response, a large focus was placed on fixing lingering issues in osu-web this week. Make sure to read to the end, as osu-web definitely MVP this week.

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

Surprisingly few things to comment on this week. I’ve been focused on the infrastructure required for skinning, which has involved cleaning up and preparing many other subsystems. smoogipoo has been working on the underlying pieces to bring the editor’s hitobject selection and mutation up to speed.

We’ve also been working on some lingering threading issues causing CI to occasionally fail. Solid under-the-hood progress.

Fix replay import #2087 (peppy)

While lazer did support drag-drop replay import, it was unknowingly broken for a good period of time. Now works, again.

Abstract away model-filemodel and add mutable stores #2070 (peppy)

This is the second of the large infrastructure changes required for skin imports (first was touched on last week). A simple way to explain this would be that we can now add new archive storage types to the game (like Beatmap or Skin) and have them use the central File store. This allows for de-duping and databasing at a global level. If a skin and beatmap were to reference the same file, it will only be stored on disk once, saving space.

Other Changes

  • Update framework #2101 (peppy)
  • Reword instances of “login” to “sign in” #2100 (Joehuu)
  • Fix stacking not working with sliders #2097 (smoogipoo)
  • Fix some common CI unit test failure causes #2096 (peppy)
  • Expose SliderBody’s snaking and border colour #2094 (smoogipoo)
  • Combine border radiuses of selection and capture boxes #2092 (smoogipoo)
  • Remove osu! playfield scale from the editor #2091 (smoogipoo)
  • Fix editor layers not respecting playfield aspect ratios + scales #2090 (smoogipoo)
  • Move manual OsuPlayfield aspect adjustment into the RulesetContainer method #2088 (smoogipoo)
  • Improve testability of API #2075 (peppy)
  • Collapse visual settings by default in player #2074 (peppy)
  • Give storyboards a BeatmapInfo to reduce weird method calls #2073 (peppy)
  • Update framework (and fix left/right arrow control of textboxes) #2071 (peppy)
  • Update framework with GameThread fixes #2066 (smoogipoo)
  • Fix drag handling in line with framework changes #2064 (peppy)
  • Rewrite editor hitobject selections #2058 (smoogipoo)
  • Restore nunit ruleset + waveform test cases #2034 (smoogipoo)

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Focus was on fixing some CI issues, such as web requests timing out at the remote end in web tests. Nothing really extraordinary here.

Other Changes

  • Fix Bindable’s GetBoundCopy using MemberwiseClone #1407 (peppy)
  • Remove WebRequest workaround for mono bug which has since been resolved #1406 (peppy)
  • Allow resource managers to accept and return null #1405 (peppy)
  • Revert retry test case changes #1404 (peppy)
  • Avoid test cases failing on directory cleanup exception #1403 (peppy)
  • Add a timeout for thread exiting #1402 (peppy)
  • Allow web request tests to re-run on failure #1401 (peppy)
  • Fix dynamically compiled test cases disappearing from old assembly #1400 (FreezyLemon)
  • Fix elements being out of order in PropertyDisplay #1398 (smoogipoo)
  • Fix backspace not working in some textboxes #1396 (peppy)
  • Fix PropertyDisplay ignoring protected and internal properties #1395 (smoogipoo)
  • Various improvements to textbox input #1394 (smoogipoo)
  • Fix thread race in path segment construction #1392 (smoogipoo)
  • Fix GameThread exits not running on the encapsulated thread #1391 (smoogipoo)
  • Fix regression in frame statistics display thread names #1390 (peppy)
  • Make Path receive input only on the path bounds #1383 (smoogipoo)

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

You may have noticed that we have begun pushing people to try out the new site more recently. There’s now a new prominent banner on every page on the old site which has a newer counterpart, offering you quick access to switch across.

I also upgraded the server running the new site to a more production-ready server. There were previously some slowdowns during peak usage. This should no longer be the case!

Show genre and language and fix styles #2386 (nanaya)

Bigger stat icon and fixed spacings #2381 (nanaya)

These icons are now large enough to actually be recognisable and useful.

Add ‘show more’ for recent activity on user profiles #2379 (nekodex)

Not sure why this wasn’t a thing from the start, but you can now see more than the last six things a user did (up to a month, like the old site).

Less whitespace #2375 (nanaya)

We’ve listened to your feedback and adjusted paddings in multiple areas:

Best performance is more compressed

Beatmap panels on the listing are less tall than before (they will eventually get even shorter, but that’s in a future design iteration)

Don’t include results that didn’t match the username matchers #2373 (notbakaneko)

Searching for users no longer returns results that make you “wtf”. Although… brownpeppy? really?

Increase per-page topics listing #2362 (nanaya)

Forum now shows 30 topics per page, up from 15.

Scoreboard friend/self highlighting #2345 (nekodex)

Discussion navigation history #2270 (nanaya)

Finally you can link people to the exact view you are looking at in beatmap discussions. This includes the filters you have applied, such as difficulty, game mode and resolved status.

Different icon for unread topic #2449 (nanaya)

We added back icons to better differentiate read status of forum topics. The colours we were using were not so colour-blind friendly, it would seem!

Allow setting default playmode in profile page #2448 (nanaya)

You can now see which game mode a user has set as their default, denoted by a star next to it.

You can also change your own default. On the old site, this used to be an implicit action whenever you switched tabs while looking at your own profile, which was confusing to some. Now, you must click the new button to change your own default. Hopefully this should make a bit more sense and avoid confusion.

Recommended difficulty is back, with some huge performance improvements this time around. Converted toggle also available. Woo!

Country flags site-wide now link to country rankings. Eventually we hope to improve the country landing page with more than just rankings, but this’ll do for now.

Profile tooltips #2422 (nekodex)

Explaining what user details actually are.

Add a supporter promo to changelogs #2412 (LiquidPL)

We don’t really advertise supporter in many places, but I like to have a message on the changelogs when users update their osu! builds. If they like something that has been added, they may feel the urge to throw us some bucks.

This was already present on the old site.

Add experience bar to user profiles #2409 (LiquidPL)

Hover the level badge to see your experience bar!

Other Changes


dev changelog 20180213

published 15 Feb 2018

Hello and happy chocolate day. Back at you with updates since the last post, albeit two days delayed from changelog generation. Hopefully my brief commentary is worth the wait!

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

Improvements to EF context handling and BeatmapManager #2054 (peppy)

This was a big refactor of how the beatmap import and databasing process was structured. It was one of the largest thorns in lazer’s otherwise pristine code base, and I finally took the initiative to fix it up before moving on to skin import support.

While there’s nothing to show from this, it fixed a lot of scenarios where imports could result in lost files or incorrect state of beatmaps, while also improving readability of database usage game-wide. It resolved all the problems mentioned in this issue, which has been around since October 2017. Phew.

Fix ApproachRate not inheriting OverallDifficulty when it is undefined #2049 (sunghwan2789)

It turns out that very old beatmaps (before we separated out AR as a difficulty setting) would fallback to their OD setting. This wasn’t correctly being respected, resulting in older maps behaving weirdly. All fixed!

Unify hit windows between all rulesets #2035 (smoogipoo)

Until now, each ruleset had its own definition of hitwindows (which in some cases was completely broken!). We now use a unified implementation, which gives much more predictable results. They are currently based on mania windows, which makes things every so slightly more lenient than on stable. We’ll tweak this as necessary.

Improve the visual appearance of repeat points #1960 (ColdVolcano)

They are now arrows (and snake a lot better). Goodbye eercast logo, you served us well. Note that this is not the final design.

Other Changes

  • Fix drag handling in line with framework changes #2064 (peppy)
  • Add confirmation dialog to Delete in beatmap context menu #2060 (swoolcock)
  • Fade slider ticks with hidden mod #2057 (Aergwyn)
  • Fix pressing escape quickly unexpectedly exiting gameplay #2044 (UselessToucan)
  • Fix a few code styling issues #2042 (smoogipoo)
  • Update user object to match new standardised api #2039 (peppy)
  • Fix non-visual tests not cleaning up previous executions #2038 (peppy)
  • Fix visual settings checkboxes playing sounds in bindable binding #2037 (peppy)
  • Make slider tails not play hitsounds #2036 (smoogipoo)
  • Always put attributes on a separate line to their target #2031 (peppy)
  • Make sure the import tests exit their hosts #2030 (smoogipoo)
  • Use bindable precision for OsuSliderBar’s tooltip value #2029 (smoogipoo)
  • Add support for country rank #2027 (tgi74)
  • Fix revert-to-default hiding visual settings at beatmap load #2026 (swoolcock)
  • Fix skip button not receiving screen-wide input #2023 (peppy)
  • Make NUnit tests run locally again #2021 (smoogipoo)
  • Raw input improvements #2020 (peppy)
  • Stopping non-url text from being hyperlinks #2017 (Imnooby)
  • Update in-line with framework changes #2012 (smoogipoo)

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Combine drag and click lenience into a single variable #1389 (peppy)

Until now, it was possible to trigger a drag and a click event in the same mouse down/up combination. Now, the leniences for dragging and clicking are combined. This also resolves slider bars being hard to drag in settings (where you’d accidentally trigger a vertical scroll instead).

Debounce config saves #1388 (peppy)

We pushed out a build that completely destroyed performance when dragging slider bars in settings. This fixed it.

Raw input improvements #1371 (peppy)

Tablet support is here! It mostly behaves as it did on stable for the moment, but I do have big plans on improving the way tablets can be configured to make the experience much less painful (and make the wacom control panel area settings obsolete).

Other Changes

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

As I mentioned on twitter, we’re approaching the point where we are going to push the new web live. We’ve received some great feedback since then and are working to apply all the changes necessary to make this as painless of an experience as possible! More updates to follow on that.

Better spoiler arrows #2340 (nanaya)

Spoiler boxes on the forums weirdly pointed up and down.

They now point right then down, as expected.

Add support for wiki page tags #2331 (nanaya)

Wiki articles can now have tags added, which can be used to search for articles by words not necessarily contained by the article (like OWC2017 for “osu! world cup 2017” etc.)

Improve display of time fields in modding discussions #2307 (nanaya)

All time fields on the modding system are now using proper time classes, so you will see them in your local timezone.

Other Changes


dev changelog 20180206

published 06 Feb 2018

Trying to keep these coming once a week is pretty tough, but here we are (only a couple of days late!). Huge appreciation as always to those who contributed this time around.

As a side note: full tablet support is only days away from being deployed live to lazer, so for those of you that have been holding off due to not being able to play with your tablet, make sure to check back soon!

osu The osu!lazer project. The future of the osu! client. Download preview releases from here and follow along!

Implement Catmull-Rom curve approximator #2003 (smoogipoo)

Everyone’s (least) favourite slider curve type is now supported by lazer. Play through more of the old classic beatmaps that you love so much, without the sliders taking on smooth curved shapes.

Update design of “revert to default” button #2011 (peppy)



Store and show SSPlus and SPlus statistics on user page #2004 (tgi74)

Just like the new site, you can now see hidden/flashlight SS/S counts separate from normal ones

Fix osu!catch never reaching the result screen #1999 (peppy)

You can now complete catch beatmaps. Oops.

Add the ability to duck volume when the game is inactive #1997 (peppy)

While the transitions are not yet as smooth as you’d expect, you now have complete control over how much sound osu! is going to generate when it’s not the active window.

Update taiko hitsounds (courtesey of cYsmix) #1994 (peppy)

cYsmix has done it again, providing a new default sound set that does wonders to give osu!taiko a fresh feel.

Ability to mute the game using F4 (or button on volume control) #1921 (aQaTL)

Simple yet effective. Design is obviously not final (get a preview of that here).

Add URL handling to chat #1667 (FreezyLemon)

This has been in and out of the release builds as I had it manually cherry-picked for releases (felt it was pretty important), but is now here to stay! You can now freely open up web links in chat. In the cases there’s an in-game view for what you are looking at, it’ll prefer that over opening the site. The number of in-game overlays will expand as time goes by.

Implement a gameplay visual settings overlay #1879 (UselessToucan)

You can now adjust settings before entering gameplay (at the “loading” screen). For now a preview is not available, but this will be added in the future.

Other Changes

  • Fix PlayerSettingsOverlay not able to reappear after being hidden #2005 (tgi74)
  • Fix osu!catch autoplay missing bananas when running above 1x playback speed #2001 (peppy)
  • Fix clock not incrementing beyond last frame of replay #2000 (peppy)
  • Fix IsMaskedAway not being up-to-date when fastfowarding replays #1998 (smoogipoo)
  • Make slider tails count towards the slider’s judgement #1993 (smoogipoo)
  • Rename “InputManager” to “Container” where keybindings are involved #1992 (smoogipoo)
  • Update framework #1991 (peppy)
  • Fix incorrect case on migration file #1986 (peppy)
  • Add JetBrains.Annotations NuGet package #1984 (FreezyLemon)
  • Remember mod selection when re-entering song select #1983 (peppy)
  • Fix osu star rating calculation #1981 (thomastanck)
  • Fix taiko and mania missing when fast-forwarding replays #1980 (smoogipoo)
  • Fix slider ticks appearing too late #1977 (Aergwyn)
  • Fixed holding retry hotkey at end of map causing hard crash #1944 (ThePyrotechnic)

osu-framework The game framework behind osu!lazer. Written from scratch with osu! in mind, but very extensible.

Code quality, performance and bug fixes. Nothing exceptional to see here!

  • Fix up recent IsMaskedAway regressions #1364 (smoogipoo)
  • Use a concurrent dictionary for custom transforms to avoid incorrect thread access #1361 (peppy)
  • Fix FrameworkActionContainer input ordering #1360 (smoogipoo)
  • Use AlmostEquals for CircularContainer test cases #1358 (peppy)
  • Make better use of generics in DependencyContainer #1356 (jorolf)
  • Add a fill property to CircularProgress #1355 (jorolf)
  • Add JetBrains.Annotations NuGet package #1354 (FreezyLemon)
  • Make sure that IsMaskedAway is always up-to-date #1353 (smoogipoo)
  • Stop ConfigManager from setting a default when calling GetOriginalBindable #1352 (peppy)
  • Make AutoSize transform non-rewindable #1345 (smoogipoo)
  • Store only drawables up to the one that handled mouse down in mouseDownInputQueue #1337 (UselessToucan)

osu-web The new web front-end. Already live but hasn’t yet replaced the old site, pending feature parity.

Elasticsearch 6 support #2262 (notbakaneko)

With some backend redesign, we were finally able to migrate off an ancient Elasticsearch 1.x instance to the latest version. We still have some improvements to make to the way we are interacting with elasticsearch, but the old site needs to die before this can happen. Needless to say, this is a step in the right direction for improving search quality game-wide.

Add playtime to user profiles #2290 (LiquidPL)

Due to popular request, play time is back on profiles. This time precise to the second!

Beatmap scoreboard revamp #2292 (nekodex)

After reading through all the feedback you guys threw at us regarding leaderboard design, flyte got to work trying to make sure he could please everyone. The design is now implemented and live at the new site and has so far received some very positive feedback. Glad you guys like it!

Other Changes