From e36f9b2dcfb47615e38ccd6d0f5ca05ff18dff07 Mon Sep 17 00:00:00 2001 From: Jamie Taylor Date: Sun, 12 Apr 2026 01:43:36 +0900 Subject: [PATCH] Add more ranked play SFX (#37258) - Stage changes (with ducking): https://github.com/user-attachments/assets/1ed1cf5a-759b-487a-9028-314accc15a6a - Messages (with debouncing): https://github.com/user-attachments/assets/c8c38d18-4fcc-4654-887b-be3de3e84949 Message sample might be a bit too clicky, but consider this a first pass. --- - [x] depends on ppy/osu-resources#417 --------- Co-authored-by: Dean Herbert --- .../Components/RankedPlayChatDisplay.cs | 22 +++++++++++++++++++ .../RankedPlay/RankedPlayStageOverlay.cs | 20 ++++++++++++++++- osu.Game/osu.Game.csproj | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Components/RankedPlayChatDisplay.cs b/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Components/RankedPlayChatDisplay.cs index d4693e57c0..19f0219051 100644 --- a/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Components/RankedPlayChatDisplay.cs +++ b/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/Components/RankedPlayChatDisplay.cs @@ -5,6 +5,8 @@ using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -221,6 +223,9 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Components private bool expanded; + private Sample messageReceivedSample = null!; + private double? lastSamplePlayback; + public BubbleChatHistory() { AutoSizeAxes = Axes.Y; @@ -232,6 +237,12 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Components }; } + [BackgroundDependencyLoader] + private void load(AudioManager audio) + { + messageReceivedSample = audio.Samples.Get(@"Multiplayer/Matchmaking/Ranked/message"); + } + /// /// Collapses the display such that only new messages are temporarily shown. /// @@ -301,6 +312,8 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Components newMessage.Show(); + playSample(); + // If not in the expanded state, hide the new message after a short while. if (!expanded) { @@ -309,6 +322,15 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Components } } + private void playSample() + { + if (lastSamplePlayback != null && Time.Current - lastSamplePlayback < 100) + return; + + messageReceivedSample.Play(); + lastSamplePlayback = Time.Current; + } + private partial class MessageBubble : CompositeDrawable { private readonly APIUser user; diff --git a/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayStageOverlay.cs b/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayStageOverlay.cs index a6a07ccf84..5e99a15770 100644 --- a/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayStageOverlay.cs +++ b/osu.Game/Screens/OnlinePlay/Matchmaking/RankedPlay/RankedPlayStageOverlay.cs @@ -2,6 +2,8 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Audio.Sample; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -10,6 +12,7 @@ using osu.Framework.Localisation; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Online.API.Requests.Responses; +using osu.Game.Overlays; using osu.Game.Users.Drawables; using osuTK; @@ -27,6 +30,11 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay private FillFlowContainer detailsContainer = null!; private CircularContainer avatarContainer = null!; + private Sample stageChangeSample = null!; + + [Resolved] + private MusicController musicController { get; set; } = null!; + public RankedPlayStageOverlay(LocalisableString stageName, RankedPlayColourScheme colourScheme) { this.stageName = stageName; @@ -34,7 +42,7 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay } [BackgroundDependencyLoader] - private void load() + private void load(AudioManager audio) { RelativeSizeAxes = Axes.Both; @@ -153,6 +161,8 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay Text = $"{Multiplier:N0}x damage", }); } + + stageChangeSample = audio.Samples.Get(@"Multiplayer/Matchmaking/Ranked/stage-change"); } protected override void LoadComplete() @@ -173,6 +183,14 @@ namespace osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay .ScaleTo(0.9f) .ScaleTo(1f, duration, easing); + musicController.DuckMomentarily(time_visible, new DuckParameters + { + DuckDuration = 0, + DuckVolumeTo = 0.5, + DuckCutoffTo = 600, + }); + stageChangeSample.Play(); + using (BeginDelayedSequence(time_visible)) { this.FadeOut(duration, easing) diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 4c680a5d4a..0fbcfbcb32 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -40,7 +40,7 @@ - +