- Simplifies track handling by not attaching to the global beatmap, not
looping, and moving into `GameplayWarmupScreen` where the beatmap is
set.
- The main idea here is that the transition period until gameplay is so
short (~10 seconds) that we don't need to account for the track ever
looping in the first place.
- Fixes the track not playing from its preview point (feedback item
mentioned in some meeting a while back).
This is definitely going to conflict with @nekodex 's work, sorry about
that. It's a bit of a much-of-a-muchness change (imo) if the conclusion
is to wait for ongoing work first.
Updates can fail on macOS when osu! is run outside /Applications or
~/Applications, but users currently get no actionable guidance.
Add a startup notification that warns when the install location is
outside those directories, and skip this check for package-managed
installs where in-app updates are not used.
Resolves#36662.
---------
Co-authored-by: Dean Herbert <pe@ppy.sh>
Addresses https://github.com/ppy/osu/discussions/37090.
Filename and format almost match stable with the exception of:
- adding `chat-` prefix to export filename to distinguish from
everything else in the `exports` folder
- adding date to message timestamps as stable writes time only
Specifically the one used on the daily challenge screen. Was bugging me
that playlists/multi have that old yellow header design used, so I've
changed it. Will probably come in handy once the footer/leaderboard
changes are in.
Also localized the headers while at it.
Multiplayer:

Playlists:

The only thing I'm wondering about is whether the detail thing
(participant count/playlist length) should be using the highlight colour
here. The old design had them be yellow, but I feel like the pink on
this one stands out too much.
---------
Co-authored-by: Dean Herbert <pe@ppy.sh>
## Changes
- Extract / Move l10n initialisation methods
- Add analyser support for tournament project
For the tournament client, it's a bit different around l10n
initialisation compared with the main client. `TournamentGame` needs to
show warning boxes for bracket errors and window size warnings, and we
may make l10n support ready in advance.
---------
Co-authored-by: Dean Herbert <pe@ppy.sh>
Closes https://github.com/ppy/osu/issues/37006 visually.
Note that this adds a brief fade in on entering `PlayerLoader` from
`OnlinePlayScreen`s due to actually loading the background at this
point. I think this is fine.
TL;DR the clock was being set too late, causing more transforms to be
created than necessary.
This solves the issue by way of a refactor (sorry). Overall this should
simplify handling of things as more of the logic is shared with the
known good-state `BeatmapBackgroundWithStoryboard`.
I did try without a refactor (just delaying the creation until the clock
arrives) but this version made more sense because background generally
expect to do their main load in BDL to aid in smooth transitions. And we
can't get the clock by there. (although arguably we could just use a
similar method to `BeatmapBackgroundWithStoryboard` and forego using the
editor clock).
Of note, I removed the black background overdraw hack. There are edge
cases where it will lead to weird transitions, but these are far and few
between. Basically you need a storyboard which sets the flag to hide the
beatmap background and has transparency in it. This is no longer as
flagrantly bad as things used to be (which led to the inline fix) as far
as I can tell, but feel free to prove me wrong. If this is a blocker
I'll probably just add a permanent black box (which does fix this).
Closes#36875.
The compatibility export was creating .osu files with CRLF line endings
on Windows and LF line endings on Linux/macOS, because StreamWriter
defaults to Environment.NewLine.
This caused the server to detect spurious file changes when a mapper
alternated between platforms, leading to unnecessary wipes of local
scores and noise in the beatmap update history.
Fix by explicitly setting NewLine = "\r\n" on the StreamWriter, ensuring
CRLF is always used regardless of platform.
Closes#36846
---------
Co-authored-by: Dean Herbert <pe@ppy.sh>
Fixes https://github.com/ppy/osu/issues/29223
This fixes several issues around hold note dimming.
Notice in the following video:
- The tail piece of the first note not getting dimmed.
- The body of the second note not responding to dimming at all.
https://github.com/user-attachments/assets/8e51053d-8d88-4e48-909b-79218d65917b
Then, notice in the following video:
- The body piece of the second note is dimmed from the very beginning.
https://github.com/user-attachments/assets/a514c630-5c72-4ba5-96d5-472bae1058b3
This requires a specific setup whereby the hold note and its components
must be reused from the pool. In particular:
1. The hold note must be long. So long that by the time the tail becomes
on screen, the body will already have dimmed.
2. The hold note must be re-used from the pool. We can induce this by
setting the pool sizes to 1 in
[`Column.cs`](https://github.com/ppy/osu/blob/780ce2666099c22d1e0673cafab544418b5d14b0/osu.Game.Rulesets.Mania/UI/Column.cs#L121-L123).
3. The second hold note should be placed far enough in the timeline that
the first hold note dies by the time it becomes visible.
4. Scroll speed should be adjusted to fit the above constraints.
I haven't done a full deep dive into exactly _why_ this is happening, so
the fix here is hand-wavy. That said, just by looking at the old code in
`LegacyBodyPiece` you'll get a feeling that something's bound to go
wrong;
- It never resets the `missingFadeTime` state.
- It never resets the colours back to `Color4.White`.
- It applies transforms onto external components.
- It jumps through hoops to figure out how to set `missingFadeTime`.
My hope is that these changes first bring some sanity in the process,
and if it breaks again I'll consider doing a more proper root cause
(I've had this issue in the back of my mind for about 1 year).
With this PR, they now behave as expected:
https://github.com/user-attachments/assets/140b37c5-cf84-44ba-b797-86ac6d8130c8https://github.com/user-attachments/assets/6f2342a4-6a9a-4941-a55a-24a357f27c25
Fixes#36645
The IsolatedPhrase match mode in FilterCriteria used \s (whitespace) as
word boundaries, meaning a search term had to be surrounded by spaces
(or start/end of string) to match.
This caused songs with titles like
'Music Theme "Some Artist"' to not appear when searching for "Some
Artist", since the phrase was bounded by quote characters rather than
spaces.
This change extends the boundary pattern to also accept Unicode
punctuation (\p{P}) alongside whitespace, so terms surrounded by quotes,
commas are correctly matched as isolated phrases.
Tests have been added to cover searching for terms adjacent to
punctuation boundaries
(TestCriteriaMatchingTermsAdjacentToPunctuation).
Tests cover the example mentioned above.
Code inspector with no errors and tests passing.
Initially reported on
[discord](https://discord.com/channels/188630481301012481/1097318920991559880/1481649645167054878).
`return` instead of `continue` led to the loop exiting too early if
there was an `EffectControlPoint` in the list before a
`TimingControlPoint`.
Behaviour can be reproduced with topdiff on this
[mapset](https://osu.ppy.sh/beatmapsets/1884175#osu/4027941). When
opened, all timing points on kiai start don't show up in the timeline.
If you disable/enable the effects section on one of those timing points
the order changes and it becomes visible again.
Right click is a very obfuscated UX which most users won't find. This
makes more sense to the average user (probably).
Caveat: clicking away actually sends clicks to underlying UI. This is
not the case in macOS or windows (locally, same app; globally it still
sends clicks to other windows).
Coming from https://github.com/ppy/osu/discussions/36926.
---------
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
1% is not precise enough to push accuracy to high enough levels.
Increasing the precision of the mod will make it more useful for a
larger amount of players who want to push their accuracy to their
absolute limits. This does come with the caveat that it's impossible to
achieve over 99.9% accuracy on many short maps, but I don't think it
really matters if high enough settings act like the Perfect mod on short
enough maps.
Co-authored-by: evill <jlkdsf;ajfklsjd@123.n>
https://github.com/user-attachments/assets/042311f1-b8c3-479b-a173-13b93fe2c5cc
- `/roll` command is now supported in multiplayer chat for all players
(don't need to be a referee).
- Referees are shown in the room with a special status.
- Tournament mode rooms can be locked, which prevents users from
changing team (and slot, whenever those get brought back). When the room
is locked, the user team indicator shows a padlock icon on top to
indicate the lock state.
---
- Related: https://github.com/ppy/osu-server-spectator/issues/406
Grab-bag because I really don't think splitting this into 3 PRs is very
helpful.
I was going to add an animation for rolling but I had a go on Friday and
my attempt got more or less the same reception as a wet fart so I'm not
trying again. Someone else can if so inclined. I have completely lost
trust in my design senses.
Contrary to stable the roll results are completely ephemeral and go away
when the room is re-entered. This could be both considered good and bad.
Not for me to say.
I noticed that going into the dashboard overlay currently requests
global user presence, which is not required for the friends display.
This could create additional load (client and server) where unnecessary.
Based on feedback I've heard more than once ([most
recently](https://github.com/ppy/osu/discussions/36933)), there's too
much overlap compared to stable. And it can sound a bit "jumbled" as a
result, especially when transitioning between two songs with loud and
"complex" audio.
This also fixes noticeable audio glitching that some users may have been
experiencing when switching tracks.
---
Unless there's any very loud objections, I'd ask that review is on the
code not the audible change. This is the kind of change that I tweak to
my personal spec and then push out to hear the general reaction.
### b8d0dfe2ed Better default preview time
based on global fade
This is an oversight. The preview point wasn't being offset to account
for the fade in. This is something we do when generating web-side
previews, which allows for the actual preview point to be audible,
rather than mid-fade.
### 8de323b68c Adjust fade in and fade out
during track transitions to reduce overlap
Yes, I'm aware that the delay is not accounted for in the constant. This
is intentional because it sounds better. I want this to be an internal
adjustment which is not to be considered by any external usages of those
constants. Just sounds better.
### aab01b0fe5 Remove weird/dated schedule
usage
This causes audible artifacts in playback. The track is not set to zero
volume early enough. Original change was made in [this ancient
PR](https://github.com/ppy/osu/pull/9792) (see
[commit](https://github.com/ppy/osu/commit/688e4479506645bdacee7cdc7ae9ee9deaa5f1b4)).
The original failure does not occur. Tests still pass. I'd argue that if
we encounter this again, it's an issue at the call site, not this code.
This is a drive-by fix, as I noticed this glitching while working on the
main issue here. Arguably should be it's own PR 🤷 .
Arguably we should just nuke the now playing overlay playlist window
completely as the functionality was gimped when search was removed. Now
it doesn't seek to the currently playing track, nor play sequentially,
nor do anything useful.
---------
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
Suffixed tags are build releases, which are triggered manually for now
(via private project).
Tags without suffix are the ones that we want to build the nuget
packages and such.
Alternative to / closes https://github.com/smoogipoo/osu/pull/189
See also https://github.com/ppy/osu-server-spectator/pull/439
- Automatic beatmap download and notification of beatmap availability
moved to `RankedPlayBeatmapAvailabilityTracker` - now a self-contained
object to handle this miscellaneous logic.
- Beatmap set now happens when the `GameplayWarmup` screen is entered.
It's been a while.
Notes:
- `SharpCompress` usages changed a bit. Manually adjusted these, mostly
just renames or adjusted parameters.
- nUnit 3 -> 4 migrated using
https://gist.github.com/peppy/07994386d793a117350cb5f24b156585. there's
a mode in this script to update to the newer `Assert.That` syntax but it
requires fixes and couldn't really be bothered.
- DeepEqual nuked as the only usage was on a disabled test. The reason
it's disabled has been merged upstream, but it's failing for other
(realm) reasons which I don't think is worthwhile to investigate for
now.
- This bumps Moq. I think the author is back in a sensible headspace and
the new version has the stupid shit removed, so probably okay? Nice to
be on a level playing field with packages for once in a long time.
- Automapper is silly, but we've discussed this elsewhere.
- `TestRealmKeyBindingStore` failures are a wildcard, but fixed by using
a more standardised testing method. Dunno why, don't care.
---------
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
Continuation of https://github.com/ppy/osu-server-spectator/issues/406
Operations in question being:
- (un)locking rooms / `!mp (un)lock` (prevents players from changing
team, will also include slots when slots are implemented)
- rolling / `!roll` (frequently used in coin toss type situations, will
receive nice animation to go with it)
As [per
comment](https://github.com/ppy/osu/pull/36943#issuecomment-4045361755).
Unfortunately I'm not able to reproduce such a big impact of triangles
using linked pr (or at all really). In my case usage was low in the
first place and went from 0.9% to 0.6% with this pr, so outside
benchmarking would be great
Improvement list:
* No more sorted list. Basic list is being used which is sorted once
after all the triangles added.
* Out-of-bounds triangles are reused rather than removed and re-added.
* On `Reset` if `AimCount` stays the same, all triangles are reused
instead of being cleared and re-added.
- closes https://github.com/ppy/osu/issues/36942
- fixes https://osu.ppy.sh/community/forums/topics/2187041?n=1
## [Ensure Simplified Rhythm mod does not produce beatmaps with objects
out of
order](https://github.com/ppy/osu/commit/f4807b3a42dbf46ea0e669b0ba658feaef9baca5)
This is a last ditch safety.
This mod has more apparent issues (see below) but this is a first step
of restoring sanity.
Aside than the other fix described below I have not attempted to figure
out further why this is happening because the conversion logic is in
over my head. I just want hard breakage to not be possible. Why this
extra sort is necessary can be investigated by @Hiviexd if he's so
inclined.
## [Fix `GetClosestBeatDivisor()` not working correctly with negative
time
instants](https://github.com/ppy/osu/commit/88dc0d8a73c712a040635af262d7519fe6d772a0)
This was causing the 1/3 -> 1/2 conversion in Simplified Rhythm to
engage on some maps that weren't even mapped in waltz time. Those maps
had the common trait of having a timing point with a negative start
time.
Notably this could feasibly affect other places as well, like mania beat
snap colouring, or the Synesthesia osu! mod.
<details>
<summary>testing</summary>
Tested with Simplified Rhythm engaged, with 1/6 -> 1/4 and 1/3 -> 1/2
conversion enabled
[BULANOVA - NE PLACH'
[oni]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3664995) (1/8 snap):
- No mods: 5.18*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 3.48*
- Simplified Rhythm @ 933de7ab: 5.18*
[BULANOVA - NE PLACH' [inner
oni]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3648625) (1/8 snap):
- No mods: 5.84*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 4.13*
- Simplified Rhythm @ 933de7ab: 5.84*
[BULANOVA - NE PLACH' [don't
cry]](https://osu.ppy.sh/beatmapsets/1740291#taiko/3557681) (1/8 snap):
- No mods: 6.91*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 4.84*
- Simplified Rhythm @ 933de7ab: 6.91*
[Mili - Peach Pit and Cyanide [nik's
Normal]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405909) (1/6 snap):
- No mods: 1.63*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.10*
- Simplified Rhythm @ 933de7ab: 1.10*
[Mili - Peach Pit and Cyanide [Ix's
Hard]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405906) (1/3 snap):
- No mods: 2.50*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.71*
- Simplified Rhythm @ 933de7ab: 1.71*
[Mili - Peach Pit and Cyanide [nomi's Hidden
Insane]](https://osu.ppy.sh/beatmapsets/2468654#osu/5405910) (1/3 snap):
- No mods: 3.93*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 2.59*
- Simplified Rhythm @ 933de7ab: 2.59*
[Within Temptation - The Unforgiving [Stairway To The
Skies]](https://osu.ppy.sh/beatmapsets/29157#osu/172617) (1/3 snap in
editor):
- No mods: 1.53*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.48*
- Simplified Rhythm @ 933de7ab: 1.48*
[Within Temptation - The Unforgiving
[Iron]](https://osu.ppy.sh/beatmapsets/29157#osu/172612) (1/6 snap in
editor):
- No mods: 2.76*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 1.75*
- Simplified Rhythm @ 933de7ab: 1.75*
[Within Temptation - The Unforgiving
[Marathon]](https://osu.ppy.sh/beatmapsets/29157#osu/156352) (1/4 snap
in editor, but has 1/3 / 1/6 sections for sure):
- No mods: 2.96*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 2.75*
- Simplified Rhythm @ 933de7ab: 2.75*
[Halozy - Genryuu Kaiko [Higan
Torrent]](https://osu.ppy.sh/beatmapsets/180138#osu/433005) (1/4 snap):
- No mods: 5.37*
- Simplified Rhythm @ master: 0.00*
- Simplified Rhythm @ f4807b3a: 3.95*
- Simplified Rhythm @ 933de7ab: 5.37*
</details>
As mentioned in https://github.com/ppy/osu/discussions/36883.
This has caught me off-guard a few times.
Was a quick one to make this work like it does on stable. It doesn't fit
as well as stable because we have a lot of elements at the top of the
screen, but I think it's better than nothing, as it lets you know you're
in a replay quick obviously.
I don't think we can easily localise strings with formatting in them
yet. Maybe using a `MarkdownContainer` or something?
There's been [some
feedback](https://discord.com/channels/90072389919997952/1476979671886205060/1477868178775216148)
that there's no timer during some screens. Personally I feel like some
screens shouldn't require it, but I get it.
The results screen is going to be the most controversial one, where I've
decided to shift the content down a bit - it would otherwise overlap
with the progress bar. Another option is to make the progress bar
shorter, but I feel like that makes things inconsistent.
<img width="1922" height="1035" alt="image"
src="https://github.com/user-attachments/assets/ec4ba01e-bb13-45ff-8a1b-b39d7765c1f4"
/>
Regarding implementation, I'm not entirely sure on it being added to
every subscreen via `RankedPlaySubScreen` instead of just a single
component at a top level. I did it this way because the colour scheme
seems annoying to change without recreating the entire component (or
otherwise all of its children) anyway.