This Week in osu!

published 15 Feb 2013

Yet another busy week (and a bit) still catching up on support queries, combatting increasing amounts of cheating and putting some extra time into osu!stream. Making good forward progress, though!

  • The in-game chat FAQ system has now been moved to the more manageable google docs format. This means that anyone can contribute both FAQ entries and localisations to other languages. Currently you can query specific languages by adding the language code before your !faq command.

    !faq ask will return the first language found (defaulting to english)

    !faq it:ask will return the same faq entry in italian, but fall-back to english if not found.

    You can find more details about contributing and localising in the osu! localisation project thread.

  • BanchoBot now has a profile! Keep a watch as we build this up into something which will hopefully help people harness his power.

I thought I had more to say, but it seems these are the only recent changes that have been made which are of a nature I can make public. I can say that I am now up-to-date to the point I can hopefully clear out the open bug tickets and push some new features I’ve been working on out into the public :). Stay tuned.


This Week in osu!

published 03 Feb 2013

I’ll make no excuses for my lack of updates. Let’s move straight on to what has changed over the last couple of weeks!

  • The osu! website now makes use of SSL for all communications after logging in. This happens on the next login attempt, so if you are using a stored cookie, you may need to re-login once to get switched over.

    I am providing ssl support via a cloudflare issued certificate on a trial basis. My reasoning for doing this is that they (via globalsign) host the fastest SSL resolution available, beating the competition by ~50-80% depending on location, and allowing for almost no overhead in SSL negotiation time.

    As a result, the whole site is also being served via cloudflare’s piping service. Looking at analytics since enabling this, there has been negligible measurable change to performance (client-side load time), so it looks to be a keeper. It also allows me to throw up a custom error page should there be connectivity issues with data-centres or servers, which came in quite handy with recent data-centre troubles.

  • Speaking of data-centre troubles, I am currently monitoring the situation after the downtime experienced over the last month. The issue was quite a serious one, and while I don’t believe Softlayer’s resolution was completely correct, they were trying hard to get things back online.

    The one area I am not happy with is the delay in communication from their end, and the lack of public acknowledgement (all ticket details are available only to clients via private support tickets). I will be considering my options, but likely won’t move from Softlayer this time around. They have a very stable network usually, and this may likely be the first major disaster at their end, so I am willing to give them a second chance.

  • woc2006 has been working hard on a new version of the osu!mania editor (let’s pretend the last one didn’t exist). It has a proper osu!mania layout and controls which allow for both real-time and manual mapping. Currently available on the test build for those who wish to check it out!

    osu!mania editor

  • I pushed fixes to taiko backgrounds, by giving taiko mode a “metadata” bar below the playfield. This displays common information like the song artist/title, and replaces custom-baked backgrounds which were becoming quite prominent in taiko maps.

    taiko metadata bar

    In order to make this work correctly, I shifted all taiko backgrounds based on the standard “taiko map template”, which not only provides a better default alignment, but makes sure the metadata in the background is not visible. The taiko playfield is no longer transparent, so any custom skins should be updated to take this into account and avoid artifacting.

    The font used on the “metadata” bar defaults to a system font, but can be overridden on a per-skin basis by adding a taiko.ttf file to your skin. The taiko skin has been updated to reflect this (and should be automatically downloaded by the updater if you previous grabbed it via this method).

    Oh, and the taiko playfield bar now fades in and out of kiai time :).

  • The osu! wiki has now been integrated with the main site design, and the old FAQ decommissioned as a result. The transition isn’t complete yet, with some styling looking a bit off and some basic javascript not working, but it is much better than what we had before. I hope this will

    osu! wiki integration

Stay with me here. I’m trying my best given circumstances.


This Week in osu!

published 20 Jan 2013

The observant will notice that I have been a bit less active over the last couple of weeks. This is partly due to the fact that I have been moving/settling in to a new living and office environment, and catching up with a lot of people I haven’t seen in a while. Things are getting back on track though, and I have been busy not only working on my own new features/fixes, but also merging the contributions from Ephemeral and woc2006.

  • Added the ability to reset key bindings to defaults. This is one of those feature requests I see and instantly wonder why it isn’t already implemented. I then proceed to drop everything and implement it immediately.

  • Fixed remaining issues with “Loading…” players in multiplayer games. This was being caused due to a constant not being the same on server and client, meaning if a certain number of presence requests were made at once, they would be silently ignored by bancho (causing those players to remain in a loading state forever).

  • Widescreen support in Match Setup thanks to Ephemeral. This means that as far as I can tell, every game mode/screen in osu! is now widescreen compatible. Quite a good achievement!

  • A few futher tweaks were required to hyperdash after getting feedback from pro players. This was an interesting one to follow up on, because while a lot of players voiced how much they disliked the new changes, they could not say why. Luckily I did find someone who could pinpoint the issue at hand – specifically the behaviour of the “dash” button during hyperdash – and it will be pushed out as a fix in the next release.

  • I did a lot of internal clean-up on error handling scenarios, to make processing error reports a lot less painful. Also fixed a few scenarios where osu! wouldn’t automatically restart after it says it will.

  • “Finally” updated the main menu copyright graphic, which is no longer really that. I removed the (in my opinion) unnecessary copyright text and made it more friendly and compact.

  • I did also start work on a “Free Mod” mode for multiplayer, allowing each player to choose their own mods. There’s still quite a bit of implementation and testing to get this working perfectly, but expect it to hit the test build in the next couple of days!

Touching back on the start of this post, I am now in Japan for the near future. Give me a yell if you are in Japan (or planning to be over the next few months) and we may be able to catch up for a coffee, or game of jubeat ;).

As a side note, I was able to write this entry completely on my iPhone using the newly released Textastic code editor. Pretty awesome stuff.


Just A Quick Note That I Will Be Skipping This

published 15 Jan 2013

Just a quick note that i will be skipping this week’s “week in osu!” due to being busy in real life and working mostly on the CtB hyperdash fixes with the time I had. Hopefully the post I made on hyperdash will make up for it :).


Getting Hyperdash Right

published 07 Jan 2013

Over the last week, I have been working on fixing long-standing issues with the “Hyperdash” algorithm in Catch the Beat mode. Hyperdash is a gameplay tweak that was added to CtB in order to ensure that all patterns are catchable – no matter how far apart they are. It does this by makring certain fruit (objects) which would previously be impossible to catch as “Hyper” fruit. On catching these fruit, your catcher speeds up to the precise speed required to reach the next fruit in time.


This has always worked in roughly 99% of cases. Today I will detail the two main issues which caused the flaws in the remaining cases. For brevity, I have left out some other more obvious cases which were fixed earlier on last month.

Same Direction Chain

The catcher needs to catch three (or more) fruit in a line, where all but the last are hyperfruit. In the initial algorithm, the current X position of the catcher was always considered to be centered on the destination fruit by the time required, but because hyperdash would disengage earlier than this, catching all fruit were not possible.

same direction 1

The first fruit is caught as expected.

same direction 2

The second fruit is caught, but the catcher is dashing in overtime to get there. The green silhouette is where the algorithm expected the catcher to be.

same direction 3

Because the algorithm expected the catcher to be further than it actually was, the third fruit is not catchable. Hyperdash was required earlier on in this pattern.

Fixing this issues involves keeping track of:

  • The current direction of the catcher
  • The excess time after reaching the destination.

If the catcher has been moving in the same direction over more than two fruit, the excess required movement (if any) is added to the required distance, allowing hyperfruit spawning where required.

Hyperdash disengage times were also made more precise to ensure reaching the perfect position to catch the fruit.

Sub-frame Movement

The most edge case meant that some fruit may be possible or impossible to catch only by luck and frame limiter settings. Internal calculations where done on a sub-frame level, meaning:

possible_movement_distance = (object2.startTime - object1.endTime) * velocity;
require_movement_distance = abs(object2.x - object1.x);

if (possible_movement_distance < required_movement_distance)

The problem here is that the possible_movement_distance was calculated based on the number of milliseconds separating the two objects. As osu! internally runs at 60fps in the worst-case scenario, possible_movement_distance may have been less or more than the actually available movement, due to where calculation frames end up falling (which is completely uncontrollable and random).

Correcting this is a matter of rounding available time downwards to the nearest frame + 0.5, which ensures that in worse-case scenario the time calculation will be 0.5 frames more lenient than required (ie. the objects will still be catchable):

frame_time = 1000/60; //60fps (16.66667ms)
actual_frames_available = floor((object2.startTime - object1.endTime) / frame_time) + 0.5;
possible_movement_distance =  actual_frames_avilable * frame_time * velocity;

sub-frame 1

When the game’s frame limiter was set to 60fps, frames were guaranteed to be a full 16.6ms, rounding calculations upwards and allowing slightly more movement. They would therefore match the old algorithm and be catchable without hyperdash.

sub-frame 2

When the game’s frame limiter was set to 120fps or unlimited, frames could be any length, causing higher precision in calculations, and introducing the possibility of sub-frame errors as seen above. While the fruit should technically still be catchable, rounding errors meant that they were not catchable around 50% of the time.