Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 99 additions & 1 deletion osu.Game.Tests/Visual/Ranking/TestSceneStatisticsPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
using osu.Game.Tests.Resources;
using osu.Game.Users;
using osuTK;
using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Rulesets.Catch.Mods;

namespace osu.Game.Tests.Visual.Ranking
{
Expand Down Expand Up @@ -304,6 +306,29 @@ public void TestTaggingConvert()
});
}

[Test]
public void TestTaggingConversionMods()
{
var score = TestResources.CreateTestScoreInfo();
score.Mods = [new OsuModRandom()];

setUpTaggingRequests(() => score.BeatmapInfo);
AddStep("load panel", () =>
{
Child = new PopoverContainer
{
RelativeSizeAxes = Axes.Both,
Child = new StatisticsPanel
{
RelativeSizeAxes = Axes.Both,
State = { Value = Visibility.Visible },
Score = { Value = score },
AchievedScore = score,
}
};
});
}

[Test]
public void TestTaggingInteractionWithLocalScores()
{
Expand All @@ -321,6 +346,7 @@ public void TestTaggingInteractionWithLocalScores()
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Ruleset = beatmapInfo.Ruleset;
score.TotalScore = 999999;
score.Rank = ScoreRank.D;
score.User = API.LocalUser.Value;
scoreManager.Import(score);
Expand All @@ -332,7 +358,7 @@ public void TestTaggingInteractionWithLocalScores()
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Ruleset = beatmapInfo.Ruleset;
score.Rank = ScoreRank.D;
score.Rank = ScoreRank.S;
score.User = new APIUser { Username = "notme", Id = 5678 };
scoreManager.Import(score);
});
Expand All @@ -342,17 +368,89 @@ public void TestTaggingInteractionWithLocalScores()
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Rank = ScoreRank.A;
score.Ruleset = new OsuRuleset().RulesetInfo;
score.User = API.LocalUser.Value;
scoreManager.Import(score);
});

AddStep("import incompatible mod score", () =>
{
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Rank = ScoreRank.B;
score.Ruleset = beatmapInfo.Ruleset;
score.Mods = [new CatchModMirror()];
score.User = API.LocalUser.Value;
scoreManager.Import(score);
});

AddStep("import correct score", () =>
{
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.TotalScore = 1;
score.Rank = ScoreRank.C;
score.Ruleset = beatmapInfo.Ruleset;
score.User = API.LocalUser.Value;
scoreManager.Import(score);
});

setUpTaggingRequests(() => beatmapInfo);
AddStep("load panel", () =>
{
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;

Child = new PopoverContainer
{
RelativeSizeAxes = Axes.Both,
Child = new StatisticsPanel
{
RelativeSizeAxes = Axes.Both,
State = { Value = Visibility.Visible },
Score = { Value = score },
}
};
});
}

[Test]
public void TestTaggingScoreWithClassicMod()
{
BeatmapInfo beatmapInfo = null!;

AddStep(@"Import beatmap", () =>
{
beatmapManager.Import(TestResources.GetQuickTestBeatmapForImport()).WaitSafely();
beatmapInfo = beatmapManager.GetAllUsableBeatmapSets().First().Beatmaps.First();
beatmapInfo.Ruleset = new OsuRuleset().RulesetInfo;
});

AddStep("import incompatible score", () =>
{
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Ruleset = beatmapInfo.Ruleset;
score.TotalScore = 1000000;
score.Rank = ScoreRank.S;
score.Mods = [new OsuModRandom()];
score.User = API.LocalUser.Value;
scoreManager.Import(score);
});

AddStep("import correct score", () =>
{
var score = TestResources.CreateTestScoreInfo();
score.BeatmapInfo = beatmapInfo;
score.BeatmapHash = beatmapInfo.Hash;
score.Ruleset = beatmapInfo.Ruleset;
score.TotalScore = 999999;
score.Rank = ScoreRank.C;
score.Mods = [new OsuModClassic()];
score.User = API.LocalUser.Value;
scoreManager.Import(score);
});
Expand Down
34 changes: 22 additions & 12 deletions osu.Game/Screens/Ranking/Statistics/StatisticsPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -243,24 +243,34 @@ protected virtual IEnumerable<StatisticItem> CreateStatisticItems(ScoreInfo newS
{
string? preventTaggingReason = null;

// We may want to iterate on the following conditions further in the future

var localUserScore = AchievedScore ?? realm.Run(r =>
var localUserScores = realm.Run(r =>
r.GetAllLocalScoresForUser(api.LocalUser.Value.Id)
.Filter($@"{nameof(ScoreInfo.BeatmapInfo)}.{nameof(BeatmapInfo.ID)} == $0", newScore.BeatmapInfo.ID)
.AsEnumerable()
.OrderByDescending(score => score.Ruleset.MatchesOnlineID(newScore.BeatmapInfo.Ruleset))
.ThenByDescending(score => score.Rank)
.FirstOrDefault());
.ThenBy(score => score.Rank)
.ToArray());

if (localUserScore == null)
if (localUserScores.Length == 0)
preventTaggingReason = "Play the beatmap to contribute to beatmap tags!";
else if (localUserScore.Ruleset.OnlineID != newScore.BeatmapInfo!.Ruleset.OnlineID)
preventTaggingReason = "Play the beatmap in its original ruleset to contribute to beatmap tags!";
else if (localUserScore.Rank < ScoreRank.C)
preventTaggingReason = "Set a better score to contribute to beatmap tags!";
else if (localUserScore.Mods.Any(m => (m.Type == ModType.Conversion) && !(m is ModClassic)))
preventTaggingReason = "Play this beatmap without conversion mods to contribute to beatmap tags!";
else
{
foreach (ScoreInfo score in localUserScores)
{
// We may want to iterate on the following conditions further in the future
if (score.Ruleset.OnlineID != newScore.BeatmapInfo.Ruleset.OnlineID)
preventTaggingReason = "Play the beatmap in its original ruleset to contribute to beatmap tags!";
else if (score.Rank < ScoreRank.C)
preventTaggingReason = "Set a better score to contribute to beatmap tags!";
else if (score.Mods.Any(m => (m.Type == ModType.Conversion) && !(m is ModClassic)))
preventTaggingReason = "Play this beatmap without conversion mods to contribute to beatmap tags!";
else
{
preventTaggingReason = null;
break;
}
}
}

if (preventTaggingReason == null)
{
Expand Down
Loading