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.