Here comes another big one. We’ve been busy across the board and are making phenomenal progress, especially with the new web site (which is now enjoying being the primary experience that most users will see going forward). We’ve been closely monitoring your feedback and making changes where necessary to ensure it’s as comfortable as possible.

It’s looking more likely that these posts will be monthly going forward, in line with our monthly project milestone goals. We’re also improving the changelog display on the web so it can include lazer and new web changelog entries in a more visual way, bridging the gap with these posts (and possibly making them redundant?).

Here’s a preview of the direction we’re going:

We’ve also been making some headway over at osu-performance, modernising the code base ready for further contributions (thanks heavily to Tom94!).

We have also begun releasing production data which can be used in conjunction with this project to perform local statistical analysis and testing. We hope to continue pushing development on analytic tools to make it easier for the community to jump in and test algorithm changes for star difficulty and performance points.

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

Add toggles for beatmap skins and hitsounds #2432 (UselessToucan)

You can now choose whether you want to see and hear beatmap-specific skins/hitsounds or not. Currently this is a global setting, but based on feedback we will likely re-implement it to be saved on a per-beatmap basis.

In order to user some new APIs (and benefit from GC improvements) we have been keeping up with new .NET releases. Unfortunately in this upgrade to 4.7.1 we seem to have broken compatibility for some users – we may have pulled the trigger too early. This is something we are currently working on fixing. If you’re no longer able to run lazer, please reinstall using the latest release from the releases page.

Add beatmap ID lookup to BeatmapSetOverlay #2350 (naoey)

With this change, links in chat which point directly to beatmap difficulties (as opposed to beatmap sets) are now clicking, bringing you to the in-game beatmap display rather than loading the website.

Add automated appveyor deployment #2421 (peppy)

This makes it easier to deploy updates to github, reducing a manual step of running the deploy app on my own PC. Reduces overhead and also increases security. Should mean you see a lot more frequent updates pushed out over the coming months!

Add badges to ProfileHeader #2407 (jorolf)

To match the new web implementation, profile badges are now displayed on the in-game profile overlay as well.

Add support for replay mods #2400 (tgi74)

Until now, we didn’t have a way to convert “legacy” mods (as found in replay headers) to the per-ruleset lazer implementation. This adds the ability to do so, exposing a method for legacy rulesets to implement and support replay mod conversion. As a reminder, you can watch replays in lazer by drag-and-dropping .osr files into the window.

Add right click absolute scrolling in song select #2398 (tgi74)

While personally I don’t think this is a great thing to have as it goes against tried UX for scroll views, it has been in osu! since forever. Disabled by default, you can now choose to let right mouse drags scroll at song select as they do on osu-stable.

Fix OAuth token not saving often enough #2387 (smoogipoo)

There was an issue where oauth tokens would be lost at random, causing unexpected logging out from lazer. This should now be resolved, meaning you can keep your session for longer without issue!

Implement Judgement Colours #2336 (Frontear)

I’m not sure how these got merged before I could object, but they are in for now. The colours are not final and it is very obvious that this needs further iteration, as they blend in with almost all beatmap backgrounds making it even more impossible to see judgements.

Add setting to toggle performance logging #2298 (peppy)

Touched on in the last changelog, this adds the ability to turn on performance profiling, now being disabled by default to reduce the performance overhead it incurs.

Other Changes

Fix some occasionally failing tests #2446 (peppy)

Disable tab switching for add channel button #2405 (swoolcock)

Fix new detections in rider 2018.1 #2444 (peppy)

Fix intro setting beatmap in background thread causing race conditions #2438 (peppy)

Add error handling on a per-line level in LegacyDecoder #2429 (peppy)

Fix BadgeContainer being unable to handle null badges #2427 (peppy)

Deploy improvements #2431 (peppy)

Update profile header to match osu-web changes #2422 (tgi74)

Make BeatmapSetOverlay accept nulls everywhere #2416 (peppy)

Fix hitobject lengths not being calculated for overlapping speed changes #2409 (smoogipoo)

Remove now unnecessary approachcircle proxy disables #2374 (smoogipoo)

Make screens always load async (fixes stutter when entering editor) #2334 (peppy)

Update OsuTestCase with framework testing changes #2415 (smoogipoo)

Fix various leaderboard data races #2408 (smoogipoo)

Make buttons only accept input when expanded #2402 (FreezyLemon)

Add back app.manifest #2381 (peppy)

Fix qualified category on rank status #2377 (Joehuu)

Add HardRock position mangling for CatchTheBeat #2366 (tgi74)

Update NUnit to version 3.10.1 #2399 (FreezyLemon)

Hide menu cursor when taking screenshots by default #2397 (smoogipoo)

Remove composer from player loader #2396 (Joehuu)

Fix incorrect ordering of difficulties retrieved from API #2394 (UselessToucan)

Lowercase back button #2390 (Joehuu)

Fix new input handlers not being enabled by default #2389 (UselessToucan)

Wave container #2383 (DrabWeb)

Fix regression causing hard crash #2379 (peppy)

Normalize line endings to LF #2378 (peppy)

Add xmldoc to some high-level classes to explain their separation #2376 (peppy)

Fix all possible cases of crossthread import data races #2373 (smoogipoo)

Remove TestCaseGamefield #2372 (smoogipoo)

Handle multiple song previews playing in different beatmap categories… #2360 (UselessToucan)

Move seeking logic into a custom editor clock #2356 (smoogipoo)

Create ManualInputManagerTestCase #2354 (peppy)

Make beatmap carousel select a random beatmap when there was no previous selection #2332 (LittleEndu)

Update AssemblyInfo in line with framework changes #2353 (peppy)

Remove TestTestCase #2352 (peppy)

Don’t display judgements in OsuEditPlayfield #2349 (smoogipoo)

Fix osu!catch autoplay missing starts/ends of JuiceStreams #2348 (smoogipoo)

Handle possible FormatException when parsing timing points #2342 (smoogipoo)

Use Linq.Append and Prepend. #2340 (huoyaoyuan)

Fix ScalableContainer irrepairably altering content size #2339 (smoogipoo)

Fix skin path being ignored in extension agnostic lookups #2335 (peppy)

Revert changes on hard rock mod #2333 (Joehuu)

Tab strip #2331 (DrabWeb)

Rewrite editor selections to better handle selection and movement logic #2329 (smoogipoo)

Add rider run/debug configurations #2326 (peppy)

Fix mania playing the wrong/duplicated sounds on playfield keypress #2325 (smoogipoo)

Make VisualTests/nUnit work again #2321 (peppy)

Add ranked status and video marker to beatmap overlay and panels #2320 (DrabWeb)

Set Correct values for addDelayedMovements() function #2308 (johnneijzen)

Switch to .NET Standard 2.0 #2305 (smoogipoo)

Fix @1x skin elements not being used #2304 (peppy)

Increase deploy delta keep #2301 (peppy)

Fix Player trying to load DummyWorkingBeatmap and failing #2288 (FreezyLemon)

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

Switch to .NET Standard 2.0 #1483 (smoogipoo)

Paving the way forward for even better cross-platform support, we have finally made the jump to .NET standard 2.0. This means we can now fully support .NET core in addition to .NET Framework / Mono. It also makes deploying to iOS/android a much more pain-free progress. This chewed up a considerable amount of development time this month, but it had to happen sooner or later. Feels really good to get this completed!

We will begin to look at switching to .NET core for our deployment builds over the coming months, removing all .NET framework dependencies and providing native macOS and linux builds in our pre-compiled releases.

Fix runaway threads when running tests #1533 (peppy)

We have been running into issues with our automated testing process randomly and inexplicably failing, adding a huge amount of frustration to the development process. Enough was enough, so I set aside a couple of days to go through every possible failure path (and I ended up finding more than one!)

Needless to say, testing and deployment should be 100% smoother now.

Make Screen.Push asynchronous when necessary #1490 (peppy)

Until now, screen switches could potentially cause a blocking load operation if their parent wasn’t asynchronously loading the next screen. This change resolves that by adding async load logic at a Screen level. Now screens are always loaded asynchronously regardless of how they are pushed.

Significantly reduce number of IsMaskedAway calculations #1504 (smoogipoo)

A decent performance improvement in certain display scenarios by reducing redundant uncached calculations.

Other Changes

Update to .NET 4.7.1 #1529 (peppy)

Replace PrimitiveType.Quads with PrimitiveType.TriangleStrip in CircularProgressDrawNode #1532 (jorolf)

Add the ability to switch between tabs using keyboard controls #1363 (swoolcock)

Fix new detections in rider 2018.1 #1536 (peppy)

Fix dynamic compilation not working for some users #1535 (peppy)

Ensure host is in a running state before running tests further #1534 (peppy)

Fix test steps being added in LoadComplete never running in nUnit #1530 (peppy)

Log exceptions when asset loading fails #1526 (smoogipoo)

Fix ProxyDrawables not respecting whether the originals would be drawn #1507 (smoogipoo)

Fix testcase SetUp methods not being properly run #1525 (smoogipoo)

Make sure each TestCase runs all tests under one GameHost #1524 (peppy)

Fix potential nullref if GlyphStore is used too quickly #1522 (peppy)

Simplify SetProportional in BindableNumber #1458 (jorolf)

Consume all pending text from input in OnKeyUp #1519 (FreezyLemon)

Fix regression in input handler configuration #1518 (peppy)

Implement IBindable interfaces for get-only support #1517 (smoogipoo)

Update NUnit to version 3.10.1 #1516 (FreezyLemon)

Fix new input handlers not being enabled by default #1513 (UselessToucan)

Normalize line endings to LF #1509 (peppy)

Fix regression in dynamic compilation #1506 (peppy)

Fix test StepContainer light colours not always applying correctly #1502 (peppy)

Fix dynamic compilation namespace suffix being appended multiple times #1501 (peppy)

Make FrameworkTestCase abstract #1500 (peppy)

Explicitly define the dynamic compilation namespace to avoid crosstalk #1499 (peppy)

Delete unnecessary libraries #1496 (FreezyLemon)

Remove TestTestCase #1498 (peppy)

Fix some file paths causing framework to crash on startup #1495 (peppy)

Use Linq.Append and Prepend. #1492 (huoyaoyuan)

Add rider run/debug configurations #1489 (peppy)

Fix dynamic compilation not detecting changes on .NET Core #1488 (smoogipoo)

Remove assembly loading code from TestBrowser #1487 (peppy)

Fix dynamic compilation #1486 (nbvdkamp)

Fix framework tests not building against netcore2.0 #1484 (peppy)

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

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

Add button on user profile linking to change username store page #3082 (nekodex)

Has been moved from the profile to the settings page, which feels more out-of-the-way but still easy to discover for users looking to change their username.

Based on feedback from BN/QAT members and mappers, it was decided that the penalty when a map is disqualified can sometimes be a bit too much, especially when only a small change was made to the map. To mitigate this, we’ve allowed maps to re-queue at roughly the position they were at when disqualified.

As an example, if you had a beatmap which was qualified for two days before being disqualified, and then requalified 5 days later, you would still only need to wait around 5 days for ranking (7 days queue length - 2 days previously qualified). Note that this caps out at a minimum of 24 hours, to make sure beatmaps aren’t instantly ranked before others can jump in and give their opinion on a re-qualification.

Add played filter to beatmap listing #3051 (notbakaneko)

As a support, you can now (once again) filter the beatmap listing by played/unplayed maps.

Add Discord field to user profiles #3033 (nekodex)

Skype is out of fashion, so we welcome a discord field on profiles. Due to limitations, this can’t be linked to open discord for the moment, but will instead copy a user’s discord handle to your clipboard for pasting in discord.

Show total first place rank count on profile; display pp instead of score #3022 (nanaya)

It was pretty weird that we were displaying scores on profiles in some cases instead of pp. Scores on their own basically carry no meaning, so this change made a lot of sense.

Also you can now see how many first place scores a user has at a glimpse!

For the first time, you can see all previous usernames a user has had. Now displayed with a smooth animation to boot.

Virtualize beatmap listing #3001 (notbakaneko)

This optimisation allows for infinite scrolling at the beatmap listing to automatically unload off-screen tiles, improving performance by insane amounts.

Send order confirmation mail after store payment received #2956 (notbakaneko)

For some reason, we didn’t have an email confirmation being sent out after an order for a physical product is placed until actual shipment occurred. As we sometimes have delays of up to 5 days before we ship goods, this should very much help ease anxiety during this period and stop the number of support enquiries we get asking whether we actually received an order.

Post to disqualify #2954 (nanaya)

In an effort to further simplify the disqualification process further, there is no longer a dedicated disqualify button. Instead, it is already triggered when an issue is pointed out (problem level only) by a QAT member.

Touch device mod display #2911 (nanaya)

Exclusively on the new site design, you can now see plays marked with the TD mod. Note that this mod is only applied to plays where a touch device is deemed to have helped the player reach jumps, and as such won’t be automatically applied to all touch plays.

Implement the new header design #2906 (nanaya)

This is a kind of in-between step briding us to the ongoing design overhaul of the new site (as in an even newer new design!). It improves usability of the top menu by reducing motion and exposing the top-level links at all times, rather than having them hidden until hover.

Add fancy hover effect on logo #2912 (nanaya)

Also the osu! logo animates on hover!

Add supporter status to the supporter page #2896 (nekodex)

Now with even more detail than before, you can examine the status of your supporter tag and also view historical stats on how much you’ve contributed to the game. Love ‘ya all.

Search implementation overhaul #2857 (notbakaneko)

Mostly an under-the-hood change, the search infrastructure is now a lot more extensible, allowing for adding more complexities and details to the search system going forward.

User badges #2826 (nanaya)

User badges finally make a return on the new site, with a fresh carousel display, rotating through all the badges a user has achieved. Hover to view all badges at once.

Other Changes