Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix results screen not handling F ranks properly #26733

Merged
merged 10 commits into from Feb 5, 2024
54 changes: 54 additions & 0 deletions osu.Game.Tests/Visual/Ranking/TestSceneResultsScreen.cs
Expand Up @@ -26,8 +26,10 @@
using osu.Game.Screens;
using osu.Game.Screens.Play;
using osu.Game.Screens.Ranking;
using osu.Game.Screens.Ranking.Expanded.Accuracy;
using osu.Game.Screens.Ranking.Expanded.Statistics;
using osu.Game.Screens.Ranking.Statistics;
using osu.Game.Skinning;
using osu.Game.Tests.Resources;
using osuTK;
using osuTK.Input;
Expand All @@ -44,6 +46,9 @@ public partial class TestSceneResultsScreen : OsuManualInputManagerTestScene
[Resolved]
private RealmAccess realm { get; set; }

[Resolved]
private SkinManager skins { get; set; }

protected override void LoadComplete()
{
base.LoadComplete();
Expand All @@ -57,8 +62,17 @@ protected override void LoadComplete()
if (beatmapInfo != null)
Beatmap.Value = beatmaps.GetWorkingBeatmap(beatmapInfo);
});

AddToggleStep("toggle legacy classic skin", v =>
{
if (skins != null)
skins.CurrentSkinInfo.Value = v ? skins.DefaultClassicSkin.SkinInfo : skins.CurrentSkinInfo.Default;
});
}

[SetUp]
public void SetUp() => Schedule(() => skins.CurrentSkinInfo.SetDefault());

[Test]
public void TestScaling()
{
Expand Down Expand Up @@ -132,6 +146,46 @@ public void TestResultsForUnranked()
AddAssert("retry overlay present", () => screen.RetryOverlay != null);
}

[Test]
public void TestResultsWithFailingRank()
{
TestResultsScreen screen = null;

loadResultsScreen(() =>
{
var score = TestResources.CreateTestScoreInfo();

score.OnlineID = onlineScoreID++;
score.HitEvents = TestSceneStatisticsPanel.CreatePositionDistributedHitEvents();
score.Rank = ScoreRank.F;
return screen = createResultsScreen(score);
});
AddUntilStep("wait for loaded", () => screen.IsLoaded);
AddAssert("retry overlay present", () => screen.RetryOverlay != null);
AddAssert("no badges displayed", () => this.ChildrenOfType<RankBadge>().All(b => !b.IsPresent));
}

[Test]
public void TestResultsWithFailingRankOnLegacySkin()
{
TestResultsScreen screen = null;

AddStep("set legacy skin", () => skins.CurrentSkinInfo.Value = skins.DefaultClassicSkin.SkinInfo);

loadResultsScreen(() =>
{
var score = TestResources.CreateTestScoreInfo();

score.OnlineID = onlineScoreID++;
score.HitEvents = TestSceneStatisticsPanel.CreatePositionDistributedHitEvents();
score.Rank = ScoreRank.F;
return screen = createResultsScreen(score);
});
AddUntilStep("wait for loaded", () => screen.IsLoaded);
AddAssert("retry overlay present", () => screen.RetryOverlay != null);
AddAssert("no badges displayed", () => this.ChildrenOfType<RankBadge>().All(b => !b.IsPresent));
}

[Test]
public void TestShowHideStatisticsViaOutsideClick()
{
Expand Down
36 changes: 23 additions & 13 deletions osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs
Expand Up @@ -4,6 +4,7 @@
#nullable disable

using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Audio;
Expand Down Expand Up @@ -259,10 +260,15 @@ private void load()
if (isFailedSDueToMisses)
AddInternal(failedSRankText = new RankText(ScoreRank.S));

var applauseSamples = new List<string> { applauseSampleName };
if (score.Rank >= ScoreRank.B)
// when rank is B or higher, play legacy applause sample on legacy skins.
applauseSamples.Insert(0, @"applause");

AddRangeInternal(new Drawable[]
{
rankImpactSound = new PoolableSkinnableSample(new SampleInfo(impactSampleName)),
rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(@"applause", applauseSampleName)),
rankApplauseSound = new PoolableSkinnableSample(new SampleInfo(applauseSamples.ToArray())),
scoreTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/score-tick")),
badgeTickSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink")),
badgeMaxSound = new PoolableSkinnableSample(new SampleInfo(@"Results/badge-dink-max")),
Expand Down Expand Up @@ -351,24 +357,28 @@ protected override void LoadComplete()

int badgeNum = 0;

foreach (var badge in badges)
if (score.Rank != ScoreRank.F)
{
if (badge.Accuracy > score.Accuracy)
continue;

using (BeginDelayedSequence(inverseEasing(ACCURACY_TRANSFORM_EASING, Math.Min(accuracyX - virtual_ss_percentage, badge.Accuracy) / targetAccuracy) * ACCURACY_TRANSFORM_DURATION))
foreach (var badge in badges)
{
badge.Appear();
if (badge.Accuracy > score.Accuracy)
continue;

if (withFlair)
using (BeginDelayedSequence(
inverseEasing(ACCURACY_TRANSFORM_EASING, Math.Min(accuracyX - virtual_ss_percentage, badge.Accuracy) / targetAccuracy) * ACCURACY_TRANSFORM_DURATION))
{
Schedule(() =>
badge.Appear();

if (withFlair)
{
var dink = badgeNum < badges.Count - 1 ? badgeTickSound : badgeMaxSound;
Schedule(() =>
{
var dink = badgeNum < badges.Count - 1 ? badgeTickSound : badgeMaxSound;

dink.FrequencyTo(1 + badgeNum++ * 0.05);
dink.Play();
});
dink.FrequencyTo(1 + badgeNum++ * 0.05);
dink.Play();
});
}
}
}
}
Expand Down