diff --git a/osu.Android.props b/osu.Android.props
index 66a1523843..942970c890 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
index c1bd73ef05..c6095ae404 100644
--- a/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
+++ b/osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
@@ -417,7 +417,7 @@ namespace osu.Game.Tests.Beatmaps.IO
[Test]
public async Task TestImportWithDuplicateHashes()
{
- using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestImportNestedStructure)))
+ using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestImportWithDuplicateHashes)))
{
try
{
diff --git a/osu.Game.Tests/Visual/Ranking/TestSceneStarRatingDisplay.cs b/osu.Game.Tests/Visual/Ranking/TestSceneStarRatingDisplay.cs
new file mode 100644
index 0000000000..d12f32e470
--- /dev/null
+++ b/osu.Game.Tests/Visual/Ranking/TestSceneStarRatingDisplay.cs
@@ -0,0 +1,32 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Beatmaps;
+using osu.Game.Screens.Ranking.Expanded;
+
+namespace osu.Game.Tests.Visual.Ranking
+{
+ public class TestSceneStarRatingDisplay : OsuTestScene
+ {
+ public TestSceneStarRatingDisplay()
+ {
+ Child = new FillFlowContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Children = new Drawable[]
+ {
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 1.23 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 2.34 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 3.45 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 4.56 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 5.67 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 6.78 }),
+ new StarRatingDisplay(new BeatmapInfo { StarDifficulty = 10.11 }),
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament.Tests/Components/TestSceneRoundDisplay.cs b/osu.Game.Tournament.Tests/Components/TestSceneRoundDisplay.cs
new file mode 100644
index 0000000000..6f71627ce4
--- /dev/null
+++ b/osu.Game.Tournament.Tests/Components/TestSceneRoundDisplay.cs
@@ -0,0 +1,40 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Collections.Generic;
+using osu.Framework.Graphics;
+using osu.Game.Tournament.Components;
+using osu.Game.Tournament.Models;
+
+namespace osu.Game.Tournament.Tests.Components
+{
+ public class TestSceneRoundDisplay : TournamentTestScene
+ {
+ public override IReadOnlyList RequiredTypes => new[]
+ {
+ typeof(DrawableTournamentHeaderText),
+ typeof(DrawableTournamentHeaderLogo),
+ };
+
+ public TestSceneRoundDisplay()
+ {
+ Children = new Drawable[]
+ {
+ new RoundDisplay(new TournamentMatch
+ {
+ Round =
+ {
+ Value = new TournamentRound
+ {
+ Name = { Value = "Test Round" }
+ }
+ }
+ })
+ {
+ Margin = new MarginPadding(20)
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game.Tournament/Components/DrawableTournamentHeaderText.cs b/osu.Game.Tournament/Components/DrawableTournamentHeaderText.cs
index bda696ba00..99d914fed4 100644
--- a/osu.Game.Tournament/Components/DrawableTournamentHeaderText.cs
+++ b/osu.Game.Tournament/Components/DrawableTournamentHeaderText.cs
@@ -11,9 +11,13 @@ namespace osu.Game.Tournament.Components
{
public class DrawableTournamentHeaderText : CompositeDrawable
{
- public DrawableTournamentHeaderText()
+ public DrawableTournamentHeaderText(bool center = true)
{
- InternalChild = new TextSprite();
+ InternalChild = new TextSprite
+ {
+ Anchor = center ? Anchor.Centre : Anchor.TopLeft,
+ Origin = center ? Anchor.Centre : Anchor.TopLeft,
+ };
Height = 22;
RelativeSizeAxes = Axes.X;
@@ -27,9 +31,6 @@ namespace osu.Game.Tournament.Components
RelativeSizeAxes = Axes.Both;
FillMode = FillMode.Fit;
- Anchor = Anchor.Centre;
- Origin = Anchor.Centre;
-
Texture = textures.Get("header-text");
}
}
diff --git a/osu.Game.Tournament/Components/RoundDisplay.cs b/osu.Game.Tournament/Components/RoundDisplay.cs
index bebede6782..c0002e6804 100644
--- a/osu.Game.Tournament/Components/RoundDisplay.cs
+++ b/osu.Game.Tournament/Components/RoundDisplay.cs
@@ -12,19 +12,27 @@ namespace osu.Game.Tournament.Components
{
public RoundDisplay(TournamentMatch match)
{
- AutoSizeAxes = Axes.Both;
+ AutoSizeAxes = Axes.Y;
+ RelativeSizeAxes = Axes.X;
InternalChildren = new Drawable[]
{
new FillFlowContainer
{
- AutoSizeAxes = Axes.Both,
+ AutoSizeAxes = Axes.Y,
+ RelativeSizeAxes = Axes.X,
Direction = FillDirection.Vertical,
Children = new Drawable[]
{
- new DrawableTournamentHeaderText(),
+ new DrawableTournamentHeaderText(false)
+ {
+ Anchor = Anchor.TopLeft,
+ Origin = Anchor.TopLeft,
+ },
new TournamentSpriteText
{
+ Anchor = Anchor.TopLeft,
+ Origin = Anchor.TopLeft,
Text = match.Round.Value?.Name.Value ?? "Unknown Round",
Font = OsuFont.Torus.With(size: 26, weight: FontWeight.SemiBold)
},
diff --git a/osu.Game.Tournament/Screens/Gameplay/Components/TeamScoreDisplay.cs b/osu.Game.Tournament/Screens/Gameplay/Components/TeamScoreDisplay.cs
index 462015f004..3e60a03f92 100644
--- a/osu.Game.Tournament/Screens/Gameplay/Components/TeamScoreDisplay.cs
+++ b/osu.Game.Tournament/Screens/Gameplay/Components/TeamScoreDisplay.cs
@@ -35,7 +35,9 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
private void load(LadderInfo ladder)
{
currentMatch.BindTo(ladder.CurrentMatch);
- currentMatch.BindValueChanged(matchChanged, true);
+ currentMatch.BindValueChanged(matchChanged);
+
+ updateMatch();
}
private void matchChanged(ValueChangedEvent match)
@@ -43,10 +45,19 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
currentTeamScore.UnbindBindings();
currentTeam.UnbindBindings();
- if (match.NewValue != null)
+ Scheduler.AddOnce(updateMatch);
+ }
+
+ private void updateMatch()
+ {
+ var match = currentMatch.Value;
+
+ if (match != null)
{
- currentTeamScore.BindTo(teamColour == TeamColour.Red ? match.NewValue.Team1Score : match.NewValue.Team2Score);
- currentTeam.BindTo(teamColour == TeamColour.Red ? match.NewValue.Team1 : match.NewValue.Team2);
+ match.StartMatch();
+
+ currentTeamScore.BindTo(teamColour == TeamColour.Red ? match.Team1Score : match.Team2Score);
+ currentTeam.BindTo(teamColour == TeamColour.Red ? match.Team1 : match.Team2);
}
// team may change to same team, which means score is not in a good state.
diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs
index 873c20cc2b..4b6f777283 100644
--- a/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs
+++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/AccuracyCircle.cs
@@ -222,7 +222,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
if (badge.Accuracy > score.Accuracy)
continue;
- using (BeginDelayedSequence(inverseEasing(ACCURACY_TRANSFORM_EASING, badge.Accuracy / targetAccuracy) * ACCURACY_TRANSFORM_DURATION, true))
+ using (BeginDelayedSequence(inverseEasing(ACCURACY_TRANSFORM_EASING, Math.Min(1 - virtual_ss_percentage, badge.Accuracy) / targetAccuracy) * ACCURACY_TRANSFORM_DURATION, true))
badge.Appear();
}
diff --git a/osu.Game/Screens/Ranking/Expanded/Accuracy/RankText.cs b/osu.Game/Screens/Ranking/Expanded/Accuracy/RankText.cs
index b803fe6022..8343716e7e 100644
--- a/osu.Game/Screens/Ranking/Expanded/Accuracy/RankText.cs
+++ b/osu.Game/Screens/Ranking/Expanded/Accuracy/RankText.cs
@@ -4,11 +4,13 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
+using osu.Framework.Graphics.Shapes;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Online.Leaderboards;
using osu.Game.Scoring;
using osuTK;
+using osuTK.Graphics;
namespace osu.Game.Screens.Ranking.Expanded.Accuracy
{
@@ -19,7 +21,9 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
{
private readonly ScoreRank rank;
- private Drawable flash;
+ private BufferedContainer flash;
+ private BufferedContainer superFlash;
+ private GlowingSpriteText rankText;
public RankText(ScoreRank rank)
{
@@ -35,17 +39,38 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
[BackgroundDependencyLoader]
private void load()
{
- InternalChildren = new[]
+ InternalChildren = new Drawable[]
{
- new GlowingSpriteText
+ rankText = new GlowingSpriteText
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
+ GlowColour = OsuColour.ForRank(rank),
Spacing = new Vector2(-15, 0),
Text = DrawableRank.GetRankName(rank),
Font = OsuFont.Numeric.With(size: 76),
UseFullGlyphHeight = false
},
+ superFlash = new BufferedContainer
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ BlurSigma = new Vector2(85),
+ Size = new Vector2(600),
+ CacheDrawnFrameBuffer = true,
+ Blending = BlendingParameters.Additive,
+ Alpha = 0,
+ Children = new[]
+ {
+ new Box
+ {
+ Colour = Color4.White,
+ Size = new Vector2(150),
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ },
+ },
+ },
flash = new BufferedContainer
{
Anchor = Anchor.Centre,
@@ -53,8 +78,10 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
BlurSigma = new Vector2(35),
BypassAutoSizeAxes = Axes.Both,
RelativeSizeAxes = Axes.Both,
+ CacheDrawnFrameBuffer = true,
Blending = BlendingParameters.Additive,
- Size = new Vector2(2f),
+ Alpha = 0,
+ Size = new Vector2(2f), // increase buffer size to allow for scale
Scale = new Vector2(1.8f),
Children = new[]
{
@@ -75,9 +102,36 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
public void Appear()
{
- this.FadeIn(0, Easing.In);
+ this.FadeIn();
- flash.FadeIn(0, Easing.In).Then().FadeOut(800, Easing.OutQuint);
+ if (rank < ScoreRank.A)
+ {
+ this
+ .MoveToOffset(new Vector2(0, -20))
+ .MoveToOffset(new Vector2(0, 20), 200, Easing.OutBounce);
+
+ if (rank <= ScoreRank.D)
+ {
+ this.Delay(700)
+ .RotateTo(5, 150, Easing.In)
+ .MoveToOffset(new Vector2(0, 3), 150, Easing.In);
+ }
+
+ this.FadeInFromZero(200, Easing.OutQuint);
+ return;
+ }
+
+ flash.Colour = OsuColour.ForRank(rank);
+ flash.FadeIn().Then().FadeOut(1200, Easing.OutQuint);
+
+ if (rank >= ScoreRank.S)
+ rankText.ScaleTo(1.05f).ScaleTo(1, 3000, Easing.OutQuint);
+
+ if (rank >= ScoreRank.X)
+ {
+ flash.FadeIn().Then().FadeOut(3000);
+ superFlash.FadeIn().Then().FadeOut(800, Easing.OutQuint);
+ }
}
}
}
diff --git a/osu.Game/Screens/Ranking/Expanded/StarRatingDisplay.cs b/osu.Game/Screens/Ranking/Expanded/StarRatingDisplay.cs
index 74b58b9f8c..4b38b298f1 100644
--- a/osu.Game/Screens/Ranking/Expanded/StarRatingDisplay.cs
+++ b/osu.Game/Screens/Ranking/Expanded/StarRatingDisplay.cs
@@ -3,7 +3,9 @@
using System.Globalization;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
+using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
@@ -40,6 +42,10 @@ namespace osu.Game.Screens.Ranking.Expanded
string fractionPart = starRatingParts[1];
string separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
+ ColourInfo backgroundColour = beatmap.DifficultyRating == DifficultyRating.ExpertPlus
+ ? ColourInfo.GradientVertical(Color4Extensions.FromHex("#C1C1C1"), Color4Extensions.FromHex("#595959"))
+ : (ColourInfo)colours.ForDifficultyRating(beatmap.DifficultyRating);
+
InternalChildren = new Drawable[]
{
new CircularContainer
@@ -51,7 +57,7 @@ namespace osu.Game.Screens.Ranking.Expanded
new Box
{
RelativeSizeAxes = Axes.Both,
- Colour = colours.ForDifficultyRating(beatmap.DifficultyRating)
+ Colour = backgroundColour
},
}
},
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 647f05b428..54f1ad2845 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -23,7 +23,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 0e5c64cf0f..816a430b52 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -71,7 +71,7 @@
-
+
@@ -79,7 +79,7 @@
-
+