Enjoying osu! with others

published 27 Dec 2018

As 2018 draws to a close, I want to touch on something which I’ve felt strongly about for a while now. While I’ve described my thoughts and intentions in private to people I’ve met up with, this will be the first time discussing this publicly.

The reasoning behind not covering this topic until now is that I don’t like to dream about a future and all the cool things it could be, making big promises without being able to deliver soon enough for people in the present to enjoy.

osu! is a heavily community focused online game. Some players lean towards the competitive side while others play more casually, but I think everyone finds motivation from being around others striving hard to perform their best.

On any given day there are up to 800 concurrent multiplayer games, creating localised competition and enjoyment for their participants. Even so, I think we can all agree that the ecosystem created around Performance Points (or PP) and the global rankings are the focus for most.

Through all the complaints and criticisms of the system and its method of calculation, people of all skill levels are still striving for the highest pp they can achieve (quite often focusing on beatmaps which specifically reward more pp for less effort, known as “farm” maps).

This is one area which is quite unique in osu! – we don’t have the concept of seasons where leaderboards are reset. Scores remain for years and history is retained forever. It really lets users feel like they have achieved something solid, in my opinion – set a record and it’s there in stone (unless you beat it yourself!). But it also does lead to unavoidable stagnation.

I’m not about to go into the topic of PP calculation. The performance point (v2) system was made with the aim of objectively calculating difficulty and it did a pretty good job of that. Over the last month we have seen a huge increase in activity over at the dev discord aiming to improve the calculations while maintaining this overall goal. Things are in good hands and you will likely see changes applied over the next month.

The leaderboards and pp will always have their place in this community, but I don’t think it is healthy to focus exclusively on them. Let me introduce my plans for expanding osu! horizons via multiplayer.

From today, a new multiplayer system is live in lazer. I have been working on the logistics of this for several months on paper, and the team has spent the month of December focusing on this internally in relative secrecy.

As lazer is a very open development project, we don’t want to develop the whole system behind a curtain. Therefore we have developed a MVP (minimum viable product) that you can enjoy from today, but will continue to build on it more openly going forward. Huge props to smoogipoo, nanaya, notbakaneko, nekodex who all came together to make this happen in a relatively short period!


Introducing “timeshift” multiplayer

“timeshift” brings multiplayer rooms that can run over a longer period of time and involve large numbers of players. The room owner will be able to set the specifications for the room, along with a duration. During this specified time range, players will be able to join the room and compete in a localised leaderboard instance.

Think of it as asynchronous multiplayer.

Each room gains an overall leaderboard and a chat room which persist even after the room has expired. History of rooms will be kept indefinitely, and chat will be available for discussion after the results are finalised. I’m sure many of you are already imagining the possibilities of how this can be used. Let me touch on the concepts (and my personal goals) behind this system and how things will be developed going forward.

total attempts

Creating more ways for people to enjoy osu!

This will allow for leaderboards to be made by users. We plan on adding the tools to limit the scope of who can participate (private, friends only, limiting by rank, by country etc.)

Making tournaments easier to run

This should allow for a new generation of tournaments (well, competitions) which don’t need to be run in real-time. It can also provide a way for seeding players into groups before the main portion of a tournament starts, for instance. We will continue to flesh the system out with tournaments being one of the focuses, so if it’s missing features you may need, expect them to come in the future.

Giving players new areas to focus on competitively

As a player participates in multiplayer rooms, they will be visible in their “Participated” listing and (soon) show on their profile. It should hopefully add an extra dimension in where players place focus on when playing online.

room ranking

Increasing the creativity of gameplay

Rooms can be created with a variety of conditions. Currently quite limited, you can choose:

  • The beatmap to play
  • Which mods to play with
  • The duration the room is active for

Going forward, here are a few of the coming options (the system has been designed with these in mind from ground-up):

  • A playlist of beatmaps to play
  • A progression mode (marathon, or beatmap-by-beatmap)
  • A selection of required mods, plus a selection of allowed (options) mods. Like FreeMod but more choice. Mods apply per beatmap in the playlist.
  • A maximum number of attempts per player
  • A maximum number of players participating
  • A choice of leaderboard metric (currently locked to total score, but will include accuracy, pp and max combo)
  • A start time, for scheduled matches in the future.

Current room creation limitations:

  • 1 concurrent room for non-supporters, 5 rooms for supporters.
  • Duration is limited to 24 hours while we stabilise things. Eventually this will be allowed to be much longer.

We have more ideas, but these are the base ones we will be working on in the coming weeks and months. Also, important to note that lazer already has four or five unique mods not found in stable, and this number is only set to increase! User contributed mods are being openly accepted and each new mod increases the number of creative possibilities when it comes to designing a fun multiplayer room!

And that’s as far as I’m willing to go when it comes to explaining the progression of this system. From here on it will depend on how the community uses the new rooms and the feedback we get as to how we mould this into a permanent and (hopefully) well enjoyed aspect of the osu! ecosystem.

Blinds mod, a new lazer-only hardcore mod selection

Let me preempt some questions

When is it available?

Now. Go get lazer if you haven’t already and install it alongside your stable install! It’s more stable than you may think, and available for windows and macOS (linux too if you compile it yourself).

Global leaderboard submission is of course not in lazer yet, so enjoy a different and possibly more chill experience than you’re used to.

What about pp ranking in lazer?

For the time being this is not a focus. We have everything in place to make that eventually happen, but for now I want to make a new unique experience in lazer that differs from what one can play on stable.

So I guess that means I can’t join “timeshift” rooms from stable?

No, this is and will always be lazer exclusive.

What about real-time multiplayer? This feels like the wrong direction!

I can understand this concern, but I have already planned a logical progression from this system into a fully real-time system. All the features that will be made for timeshift will be 100% available in real-time rooms once we get to that point. Thing of this implementation as a prerequisite to adding real-time play modes in the extensible way we want to do it.

Of course, realtime/non-realtime will be a user choice when creating a room in the future!

What about coop play?

Once we flesh out the timeshift system and get to the point we can add cooperative modes, it will happen. Mark my words.

Can we view this from the web site / our profiles?

We are working on adding participation history and overall visibility on the web. This will come a bit later!

Will room history be maintained from the outset?

We’ll do our best to maintain all history, but as this is a new system do understand if we need to delete data for one reason or another. Possibly multiple times.

I don’t play multiplayer / I don’t like this concept.

That’s perfectly fine! In fact, if you enjoy solo play for leaderboards you may actually like this concept more than the multiplayer available on stable.

If you don’t, nothing is forcing you to play it. Global leaderboards are not going anywhere.

It’s buggy

We have plenty of work ahead of us. Go easy on it in the mean time.

This is our final surprise for 2018

I hope we can all agree it’s been an amazing year and we’ve ended it with some amazing notes!

Between Featured Artist releases, this announcement, completely operational iOS lazer builds (alongside windows/macOS/linux), web design renewals and some long-awaited features being added to stable, we’ve made some phenomenal progress.

A huge pat on the back to the whole osu! team (devs, community managers, BNs, QATs, moderators and anyone I missed).

I was planning on doing a blog catching up on Q4 2018, but due to time constraints it will likely happen sometime in January. Hopefully this makes up for it :).

Wishing you all a great new year period. Much of the team will be away on a well-deserved break for next week or so, but we’ll be in touch soon!


August 2018 Development Update

published 14 Aug 2018

Welcome to the August development update. A bit late but you are probably used to that by now. Been focused on keeping things running as usual.

July 2018 Review

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

July was a bit of a slow month, and we didn’t really cover the scope we planned on.

You can view a full digest of the changes from July using our new changelog system.

Basic structural implementation of osu!mania editor COMPLETE

Work on the basic structure for the osu!mania editor has been completed. It is now at a point in development roughly equal to the osu! mode editor. While it’s not yet in a usable state, the goal was to get a framework in place for structuring the different editor overlays for each ruleset, which was definitely achieved by this work.

I’m not sure if we’ll continue adding the editors for the remaining two rulesets or expand functionality for osu!/mania to begin with, but you can expect further improvements coming to the editor over the coming months.

Add automatic error reporting on hard crash PENDING REVIEW

Sentry support has been implemented, along with allowing singular errors to result in a non-crash result (similar to how osu-stable avoids many unnecessary crashes). Not yet merged, as we found quite a few cases where exceptions were not being handled correctly along the way.

Should be in soon!

Full-blown custom sample support COMPLETE

All hitsounds should now correctly be played back during gameplay. This includes per-object samples (commonly used in mania) as well as unlimited custom sample sets associated with timing sections.

Selectable full-screen resolutions PENDING REVIEW

While framework support has been added for this, the UI is not yet merged. Should happen this month.

More skinnable elements COMPLETE

Skin support was added for slider ticks, reverse arrows, follow circles, slider balls and follow points (in addition to existing support for hit circles, approach circles and judgements). If you already have a skin loaded, you should see the new elements displaying. If you haven’t yet imported a skin, it’s as simple as dragging an .osk file into the lazer window.

Gameplay visual fixes COMPLETE

Slider repeats were being shown too late, causing visual uneasiness when trying to read sliders with one of more repeat points. This has been resolved and should now match stable.

The slider follow circle was visually (and logically) far too large, making sliders much easier than they should be. This has now been resolved and should match stable.

Sliders which use a linear curve style felt a bit ugly when snaking in due to the reserve arrow changing its rotation in a single frame. Interpolation has been added to make these corners smoother.

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

Move both osu and osu-framework to target netcore2.1 COMPLETE

All framework and osu! deployments are now 100% netcore2.1! This is a huge step forward and allows us to focus on making the net core experience as good as possible. It also means that release builds are running on the same runtime as we are using to debug, which makes it easier to locate issues before they are deployed to a production environment.

To make this happen, I ended up forking and publishing out own squirrel.windows packages to keep automatic update support working on windows builds.

The performance issue I mentioned in the last blog post (macOS debugging) has not yet been resolved, but I have filed an issue to track this. Hopefully it will get some attention soon.

Fix remaining autosize / update order issues PENDING REVIEW

A pull request is open which fixes the majority of these issues. It still needs to be reviewed and tested for any performance regressions, but should be arriving soon.

Ongoing input subsystem improvements

Huge improvements have been made to the input handling. There is still some further changes we are looking to make which will likely be completely over the next month.

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

You can view a full digest of the changes from July using our new changelog system.

Almost half the milestone tasks were unachieved. Pretty slow progress. Not really much to say here…

Move osu-web score lookups to elasticsearch COMPLETE

This has now been deployed. You may notice that profile pages are now quite a lot faster to load (especially for players with a lot of scores). Eventually we will update other pieces of the infrastructure to benefit from this performance improvement, such as in-game song select lookups.

New private messaging system WIP

Work on this was slow this month, as attention was diverted to code review instead.

Add ability to report users from profile PENDING REVIEW

We’re finally on track for adding back one of the few missing features from the new profile pages. You will soon be able to report users again.

Test and deploy new registration process

Did not happen.

August 2018 Goals




Leaving our August goals blank for the time being. Already halfway through the month, we’re playing catch-up on missed goals and outstanding bug fixes. You can still click in to the headings above to see what is remaining to catch up on missed milestone tasks, though!

Thanks for following along.


July 2018 Development Update

published 03 Jul 2018

Hello everyone! Back again one month later with a review of how the last month went, along with a report on our direction for this coming month.

June 2018 Review

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

As you will see below, we failed a few of the milestone goals, but I think we can all agree that amazing progress was made. You can view full changelogs by checking out each build from the month of June (I hope we can present this on a single page next month!):

Changes for the month: 2018.629.0, 2018.628.0, 2018.627.0, 2018.626.0, 2018.622.0, 2018.621.0, 2018.618.0, 2018.616.0, 2018.614.0, 2018.612.0, 2018.611.0, 2018.608.0, 2018.607.0, 2018.606.0.

That’s a lot of builds!

Basic structural implementation of osu!mania editor WIP

Some structural changes were made to get things ready for implementation of the mania editor, but actual editor work was slower than expected. Further work on this will continue into July.

Add automatic error reporting on hard crash SKIPPED

This was not completed. That said, we were able to fix most of the startup crashes that were reported. I hope to complete this in July as it will help us act quickly on reports, with less back-and-forth to figure out what went wrong.

Begin work on multiplayer lobby system SKIPPED

Still don’t feel like we are in a state where I want to start adding multiplayer. I’ll know when it’s ready. There’s just too many other issues I want to fix first.

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

While we haven’t been adding much new functionality to the framework, bug-fixes are ongoing. We still have a lot of outstanding issues surrounding platform compatibility and single-frame drawable glitches due to incorrect invalidation scenarios.

Move both osu and osu-framework to target netcore2.1 WIP 80%

We were successful in migrating all the development configurations to be netcore2.1 only. This means that all development going forward will be done under the netcore runtime. Windows releases are still targeting net471 for the time being to ensure we don’t hastily break auto-updates. We also need to still ensure that all tests still perform correctly under netcore when run on our CI infrastructure. These remaining tasks should be completed over the month of July.

That said, we did run into a performance degradation during debug sessions on macOS that we are currently tracking in hope of a fix.

Add automatic nuget package builds of osu and osu-framework LIVE

We completely made the switch to nuget dependencies for the framework. This turned out to be a really positive move forward, further isolating development of the two projects and allowing for better testing at each end. We are now pushing out regular builds to nuget.org

For the time being, we’re holding off the osu-side nuget packages until there’s a demand for them. If you’re working on a custom ruleset and are interested in seeing this happen then please let us know and we’ll expedite it!

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

Changes for this month:

2018.702.0, 2018.701.0, 2018.629.0, 2018.628.0, 2018.627.0, 2018.626.0, 2018.625.0, 2018.622.0, 2018.621.0, 2018.620.0.

Complete the new changelog page LIVE

The new changelog page is now live! It has already been a great help in visualisation the status of our various projects. I hope you guys are enjoying viewing and commenting on individual releases as we are making the regular releases! Click any of the change links in this post to check it out for yourself, if you haven’t already.

Move osu-web score lookups to elasticsearch WIP 80%

The back-end component for this was written and is deployed. The front-end changes are also ready to be deployed; we’re just making a few final touches and quality checks before deploying this. It should be the start of a lot more flexibility in score lookups, though. Exiting stuff!

New private messaging system WIP ~50%

The new PM system is coming along nicely. Due to the fact this is part of an experimental push for changing the architecture of our more interactive web-based components, it will be taking a bit longer than a month to get in place. This was expected; hopefully we’ll see some results live this month, though!

July 2018 Goals


Check out the milestone for a full list of tasks. We’re keeping actual listed tasks below to a minimum to ensure we can hit goals this month. We also still have some lingering issues from June that need to be completed.

Full-blown custom sample support

While lazer has had the basic level of custom hitsounds for quite a while, it has not supported infinite custom banks or per-hitobject hitsounds (commonly used in mania). This will be added this month.

Selectable full-screen resolutions

All the building blocks for this are coming together, so this should be feasible to have implemented during this milestone.


Fix remaining autosize / update order issues

There are a lot of remaining cases where incorrect update orders between various low-level framework components means that layouts or styles are incorrect for single frames. Here’s a couple of examples (notice the single-frame flicker of an incorrect state):

This is turning up in many places and requires some dedicated attention to fix. Likely not going to be an easy task, but something that needs to be addressed sooner rather than later.

Ongoing input subsystem improvements

We have begun moving away from passing around full input states between input sources (handlers) and the drawable hierarchy, but there are some regressions and WIP elements which still require attention. The completed result should give us a much more stable and manageable input framework. Extensive unit tests are being added as we go to avoid regressing int he future.


Add ability to report users from profile

This has been missing for the longest time and remains one of the few features we need to truly turn off the old site.

Test and deploy new registration process

While the API already contains the logic to handle user registrations, they are still currently occurring through the old site. This is a really immersion-breaking experience which new users should not be exposed to.

I hope to move registration to inside the client (with an implementation in osu-stable) to address this.

Thanks for following along. Will report back in a month!


June 2018 Development Update

published 04 Jun 2018

Hello everyone!

We’ve been making steady progress in all areas over the last month. Yes, I guess these posts have become a monthly thing, but I am going to take this opportunity to embrace the monthly schedule and align it to development schedule.

Since earlier this year, we have been assigning tasks to a monthly “milestone” and then trying out best to complete them all by the time the month ends. After a bit of trial and error, we are gradually accustoming ourselves to this process and meeting higher rates of completion month on month.

We also have the new changelog system that is approaching completion, which will replace much of the content (ie. per-change explanations) I usually cover in my blog once complete, so I will be shifting my focus here to focusing on a more macro scale of “how we did last month” and “what we have planned for this month”.

I’d just like to mention that much of the process we’re following is heavily borrowing from the vscode project, so huge props to them for their amazing open development efforts and solid development process. They obviously have a much larger team and dedicated project management so we are taking some shortcuts, but I’m pushing for more process as it feels feasible and productive.

June 2018 Goals

In an interest of establishing a schedule we can adhere to, I’m going to keep the goals slim this month. Not mentioned in this list is the huge backlog of issues that require fixing, which can be found assigned to the respective monthly milestones.

Move both osu and osu-framework to target netcore2.1

I hope we can fix remaining netcore issues (mouse hiding and other native functionality) in order to make .NET core our primary target framework by the end of this month. The 2.1 release fixes the remaining issues we had with debugging the solution on macOS and brings performance on a level that surpasses both mono and .NET desktop (471).

Add automatic error reporting on hard crash

Many people are reporting hard crash issues on github without knowledge of how to report correctly or fix. I hope to make this reporting automated (via Sentry) and remove this manual overhead.

Add automatic nuget package builds of osu and osu-framework

As the number of projects dependent on these increases, referencing them via submodule is getting quite cumbersome. By deploying nuget packages we can more easily keep individual projects segregated and maintainable.

Begin work on multiplayer lobby system

With more of the UI designs nearing completion, it feels about time that we get the infrastructure in place for osu!lazer multiplayer. This is a stretch goal and will likely not reach the point of gameplay being possible, but the lobby and room system should at least have some client-server structure in place.

Basic structural implementation of osu!mania editor

As we move the editor forward, we want to allow for arbitrary rulesets to be easily added with first-class editing facilities. In order to make sure everything is structured correctly, we will be focusing on getting the osu!mania setup in a usable yet modular way.

Complete the new changelog page

As mentioned in my previous post, this will be the new hub for keeping track of the ongoing development efforts invested in osu!. Having the new design completely deployed will reduce the strain on me to manually produce changelogs in a blog format and hopefully make tracking development more accessible for the wider audience.

Move osu-web score lookups to elasticsearch

I have been performing ongoing migration of MySQL servers to new hardware and software (5.6/5.7 to 8.0). In order to complete the last stages, I would first like to reduce load (and reliance) on the servers. Moving score lookups to elasticsearch will do this, but also allow for arbitrary lookups which have not been possible until now due to lack of indices.

New private messaging system

We’ve been working on the framework required to get a private messaging system deployed to replace the ageing (and disconnected) forum-based system that is only accessible on the old site. While a bit of a stretch goal, we hope to have this deployed by the end of the month.

New Projects

As we push forward with open sourcing each component of the osu! ecosystem, a few new git repositories have popped up which you may wish to follow:


This will contain any command line tools (.NET core) which consume lazer. Currently you will find a difficulty calculator tool which will be the go-to method of testing new Star Rating changes.


This will contain server-side components that don’t fit in the current laravel system. This repository is still undergoing some structural consideration as we decide how many git repos we want, but for now will house the .NET core version of osu-performance (Performance Point calculations) and a new Elasticsearch score indexer – part of an ongoing effort to alleviate MySQL of the heavy load of score/leaderboard lookups.

May 2018 Review

Milestone completion




Pretty good progress and relatively high completion rates, no? Let’s delve into detail in each respective project. This might be the last time I do this if the new changelog page goes as planned (I won’t miss it!).

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

Fix catch sizing #2632 (peppy)

After many months of Yuzu being completely oversized (big-boned; not fat), osu!catch gameplay scale has been refactored to mostly match stable.

Fix beatmap importing entering a bad state #2665 (peppy)

  • Also: fix conflicting Hash and Online IDs on beatmap import #2673 (peppy)

A lot of users were reporting that beatmap imports were getting stuck. It turns out that a single failed import would hold up the import process indefinitely and cause all subsequent imports to fail. There were quite a few reasons for this happening, but most should now be resolved.

Do note that we are still tracking one remaining case where imports can fail.

Add hold-to-quit button for gameplay/replays #2430 (UselessToucan)

No-keyboard players rejoice! You can now pause or exit gameplay without a keyboard handy. This is a definite requirement for mobile support.

Implement joystick input #2346 (smoogipoo)

You can now bind joystick buttons, hats and axes to anything that was bindable in-game! This allows for a huge amount of new control customisation which was never before available - even on stable!

Multiplayer lounge #2603 (DrabWeb)

While not yet functional, the designs for multiplayer are now more complete than ever. Don’t you just want to see this list populated with real games?

All Changes

  • Change Room.Participants to an IEnumerable #2703 (DrabWeb)
  • Match beatmap overlay author styling with web #2700 (Joehuu)
  • Add storyboard icon and fix preview button overlap on direct panels #2695 (Joehuu)
  • Fix importing long filenames from stable #2678 (peppy)
  • Multiplayer shared logic encapsulation #2669 (DrabWeb)
  • Centralise beatmap set cover update logic #2667 (DrabWeb)
  • Fix logo animation discrepancies #2682 (peppy)
  • Offload database query to task #2680 (peppy)
  • Fix player life management #2679 (peppy)
  • Fix Debug mode instead of Release mode for mono debug target #2677 (Tom94)
  • Add Type property to MultiplayerScreen #2672 (DrabWeb)
  • Add build tasks for visual tests and fix broken launch tasks #2671 (Tom94)
  • Fix results screen parallax being cut off #2663 (smoogipoo)
  • Fix mania hold notes displaying judgements #2660 (smoogipoo)
  • Ensure autoplay tests actually increase score above zero #2644 (peppy)
  • Split score multiplier and unranked label colours #2314 (Joehuu)
  • Rename CursorOverrideContainer to MenuCursorContainer #2637 (HoutarouOreki)
  • Bring pp calculations more in-line with osu!stable #2636 (smoogipoo)
  • Fix quit button test occasionally failing #2633 (peppy)
  • Fix incorrect default values keeping overlays in wrong state #2624 (Aergwyn)
  • Fix selecting song in playlist not starting the audio #2622 (smoogipoo)
  • Fix possible MusicController nullref #2618 (smoogipoo)
  • Fix disclaimer allowing notifications #2613 (Aergwyn)
  • Add icon next to beatmap title/username to open in browser #2612 (jorolf)
  • Fixed banana generation on catch specific maps #2611 (frankhjwx)
  • Fix double-HR application in OsuDifficultyCalculator #2587 (smoogipoo)
  • Add input toggles to the PlayerLoader screen #2504 (UselessToucan)
  • Prevent user from scrolling outside the timeline in the editor #2499 (AlFasGD)
  • Fix overlays from not hiding when returning to initial main menu state #2601 (Aergwyn)
  • Fix escape not working to go backwards in menus before finally exiting the game #2600 (peppy)
  • Allow drag clicking footer and filter on song select #2594 (Joehuu)
  • RoomInspector improvements #2588 (DrabWeb)
  • Prevent overlays from showing in intro/outro sequences #2577 (Aergwyn)
  • Add global key bindings for changing current ruleset #2532 (ocboogie)
  • DrawableRoom improvements #2522 (DrabWeb)
  • Fix HR mod affecting original beatmap difficulty #2582 (smoogipoo)
  • Implement taiko performance calculation #2572 (smoogipoo)
  • Fix taiko slider multiplier being applied twice #2568 (smoogipoo)
  • Fix converted beatmap hitwindows not working correctly #2567 (smoogipoo)
  • Multiplayer base screen #2560 (DrabWeb)
  • Implement osu!mania performance calculator #2557 (smoogipoo)
  • Add ability to bind “back” action; add default mouse binding #2472 (UselessToucan)
  • Fix incorrect namespace of OsuPerformanceCalculator #2570 (smoogipoo)
  • Speed up beatmap parsing and conversion #2566 (smoogipoo)
  • Fix hold notes never expiring #2564 (smoogipoo)
  • Use a stable sort for hitobjects #2563 (smoogipoo)
  • Fix conversion tests for ruleset-specific beatmaps not working #2562 (smoogipoo)
  • Make OsuPerformanceCalculator use the new hitresult namings #2561 (smoogipoo)
  • Bring osu! difficulty calculation on par with osu!stable #2556 (smoogipoo)
  • Re-namespace performance/difficulty calculators #2555 (smoogipoo)
  • Port osu-performance HD AR fix #2552 (smoogipoo)
  • Allow subclasses of LegacyScoreParser to specify beatmap/ruleset retrieval #2551 (smoogipoo)
  • Fix deleted beatmaps still being accessible in MusicController #2543 (smoogipoo)
  • Re-enable slider curve lengthening #2540 (smoogipoo)
  • Fix drumroll completions always giving GREAT judgements #2539 (smoogipoo)
  • Use osu!stable hitwindows for converted hitobjects #2524 (smoogipoo)
  • Add breadcrumb control that follows focus in a screen stack #2521 (DrabWeb)
  • Add keybind to disable mouse buttons #2483 (smoogipoo)
  • Fix possibility of test rulesets being discovered from assemblies #2544 (smoogipoo)
  • Stop focused overlays from handling DragStart #2542 (peppy)
  • Reduce elements hidden by letterboxing break overlays #2541 (smoogipoo)
  • Fix performance calculation not considering time-adjustment mods #2538 (smoogipoo)
  • Fix nullref when changing ruleset at main menu #2533 (peppy)
  • Apply HD as speed adjustment #2531 (smoogipoo)
  • Fix crash on startup when adjusting volume before volume control loaded #2527 (peppy)
  • Fix song progress time counters wrapping after an hour #2526 (peppy)
  • Fix osu! difficulty/performance calculation failing or giving wrong values #2525 (smoogipoo)
  • Implement a hold-to-confirm screen when exiting game using escape key #2514 (peppy)
  • Change mapping delete key to shift+delete to allow binding delete key #2375 (aQaTL)
  • Update framework with upstream fixes #2530 (peppy)
  • Multiplayer folder restructure #2519 (DrabWeb)
  • BreadcrumbControl design adjustments #2518 (DrabWeb)
  • Update framework #2516 (peppy)
  • Remove explicit clock in TestCaseBreakOverlay #2501 (smoogipoo)
  • Update CodeFileSanity #2498 (peppy)
  • Fix beatmap/ruleset being changeable while in the editor #2495 (smoogipoo)
  • Add mode-specific beatmap statistics #2492 (smoogipoo)
  • Rework beatmap conversion process to use IBeatmap #2491 (smoogipoo)
  • Migrate the game to use an IBeatmap interface #2490 (smoogipoo)
  • Selecting a mod triggers on release #2485 (santerinogelainen)
  • Use bindable transforms #2482 (smoogipoo)
  • Add squirrel dependency on net471 #2479 (peppy)
  • Decouple FilterControl.Ruleset from the game-wide ruleset bindable #2471 (UselessToucan)
  • Revert breaking UserProfileOverlay change #2481 (smoogipoo)
  • Apply offset to end times on legacy converter #2473 (NeoAdonis)
  • Stop audio playing from UserProfileOverlay when hiding (REVERTED) #2470 (UselessToucan)
  • Use more inheritance for UserStatus #2458 (4ppleCracker)
  • Fix replays being played in the selected ruleset #2450 (tgi74)
  • Add toggles for beatmap skins and hitsounds #2432 (UselessToucan)

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

Fix broken TransformSequence.Loop #1580 (Tom94)

Loading spinners will finally spin again!

Fix mouse input state inconsistencies and add unit tests #1565 (peppy)

Heavy testing added for input states. We’re still not done refactoring the input framework, but this is a step in the right direction towards not regressing when we do so.

Implement joystick input #1494 (smoogipoo)

See above.

All Changes

  • Fix LastMousePosition not always being present when expected #1581 (peppy)
  • Fix wheel values not being aggregated in raw mouse handler #1579 (peppy)
  • Add support for long paths on windows #1574 (peppy)
  • Fix WindowsClipboard.SetText being broken #1573 (ekrctb)
  • Fix infinite queuing of expensive operations in GLWrapper #1570 (smoogipoo)
  • Always yield the new state when creating distinct states #1568 (peppy)
  • Improvement to project files using Directory.Build.props #1566 (huoyaoyuan)
  • Explicitly dispose previous TestCase when switching to a new one #1564 (smoogipoo)
  • Make IBindable and IBindable<T> share some common interfaces #1563 (smoogipoo)
  • Add a way to override the ScrollContainer’s scroll bar #1561 (smoogipoo)
  • Add ability to ButtonDown and ButtonUp in ManualInputManager #1560 (peppy)
  • Added padding to the checkbox for running all steps. #1558 (DudeMartin)
  • Update OpenTK version #1557 (peppy)
  • Expose scroll wheel and key methods from ManualInputManager #1556 (smoogipoo)
  • Move custom AppearDelay into its own interface #1555 (peppy)
  • Fix autosize invalidations occurring with BypassAutoSizeAxes #1554 (smoogipoo)
  • Allow custom AppearDelay per tooltip #1553 (default0)
  • Fix textbox not always blocking all handled key presses #1550 (peppy)
  • Clear all trace listeners to avoid MessageBox popups on windows #1551 (peppy)
  • Fix wrong signature on FillTo #1549 (smoogipoo)
  • Fix SpriteText size not being computer when set to empty #1548 (smoogipoo)
  • Commit missed change from #1545 #1547 (peppy)
  • Clean up BufferedContainer and fix alignment issues #1546 (smoogipoo)
  • Change order of lines to properly raise events #1545 (AlFasGD)
  • Throw an (unhandled) exception on assert failure #1544 (peppy)
  • Make children life update in BDL-load #1542 (smoogipoo)
  • Update CodeFileSanity #1541 (peppy)
  • Add a way to transform bindables #1539 (smoogipoo)
  • Add CircularProgress.FillTo method #1538 (UselessToucan)
  • Add an option to exact-match keybindings #1493 (smoogipoo)
  • Use pattern matching #1537 (UselessToucan)
  • Replace PrimitiveType.Quads with PrimitiveType.TriangleStrip in CircularProgressDrawNode #1532 (jorolf)

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

Add webhook for GitHub pull request merges #3286 (nanaya)

Spinner updates #3264 (nanaya)

One of my pet peeves, finally fixed. Loading spinners are now perfectly centred.

Add social buttons menu bar #3235 (nanaya)

Welcome back twitter, facebook. Follow us if you care.

Add loved beatmaps to user profile #3226 (notbakaneko)

Self explanatory. Not sure how they got missed until now!

Add toggle to block private messages from non-friends #3225 (nekodex)

Added as a prerequisite for the upcoming private messaging system. Change the setting from your settings page.

Show past tournaments on the tournament listing #3209 (nekodex)

You can now view all previous official tournaments from the tournaments page. Easy way to get information about tournaments even after they have ended!

Delete scores on qualification #3207 (nanaya)

This was missing since implementation of the modding discussion system. While not a breaking issue, it was indeed a bit weird seeing scores remain on the leaderboards until the point of ranking.

New Crowdin translations #3192 (peppy)

We have moved our translations to the hosted Crowdin service, making it a lot easier for the community to jump in and localise the site (and everntually the game, too) to their local tongue. Go check it out and chuck in some help if you can, but either reviewing and voting for existing translations or filling in the gaps!

All Changes

Holy crap, did you actually make it this far? Thanks for reading. A lot of effort goes into these posts so I hope it was of some use.


dev changelog 20180426

published 02 May 2018

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.

Update to .NET 4.7.1 #2426 (peppy)

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

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.

Update beatmapset ranking queue system #3053 (nanaya)

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!

Updated design for displaying previous usernames #3007 (nanaya)

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