diff --git a/osu.Android.props b/osu.Android.props
index 99cda7693d..80b1c5b52f 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
index 1c3d270c95..6e22c35ab3 100644
--- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/SliderBodyPiece.cs
@@ -26,6 +26,10 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
{
AccentColour = Color4.Transparent
};
+
+ // SliderSelectionBlueprint relies on calling ReceivePositionalInputAt on this drawable to determine whether selection should occur.
+ // Without AlwaysPresent, a movement in a parent container (ie. the editor composer area resizing) could cause incorrect input handling.
+ AlwaysPresent = true;
}
[BackgroundDependencyLoader]
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneComboCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneComboCounter.cs
index d0c2fb5064..b0a0b5189f 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneComboCounter.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneComboCounter.cs
@@ -4,9 +4,11 @@
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
+using osu.Framework.Allocation;
using osu.Framework.Testing;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Play.HUD;
namespace osu.Game.Tests.Visual.Gameplay
@@ -17,31 +19,21 @@ namespace osu.Game.Tests.Visual.Gameplay
protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset();
+ [Cached]
+ private ScoreProcessor scoreProcessor = new ScoreProcessor();
+
[SetUpSteps]
public void SetUpSteps()
{
- AddStep("Create combo counters", () => SetContents(() =>
- {
- var comboCounter = new SkinnableComboCounter();
- comboCounter.Current.Value = 1;
- return comboCounter;
- }));
+ AddStep("Create combo counters", () => SetContents(() => new SkinnableComboCounter()));
}
[Test]
public void TestComboCounterIncrementing()
{
- AddRepeatStep("increase combo", () =>
- {
- foreach (var counter in comboCounters)
- counter.Current.Value++;
- }, 10);
+ AddRepeatStep("increase combo", () => scoreProcessor.Combo.Value++, 10);
- AddStep("reset combo", () =>
- {
- foreach (var counter in comboCounters)
- counter.Current.Value = 0;
- });
+ AddStep("reset combo", () => scoreProcessor.Combo.Value = 0);
}
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
index 3cefb8623f..55c681b605 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneHUDOverlay.cs
@@ -10,6 +10,7 @@ using osu.Framework.Graphics.Containers;
using osu.Framework.Testing;
using osu.Game.Configuration;
using osu.Game.Rulesets.Mods;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Play;
using osuTK.Input;
@@ -19,6 +20,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
private HUDOverlay hudOverlay;
+ [Cached]
+ private ScoreProcessor scoreProcessor = new ScoreProcessor();
+
// best way to check without exposing.
private Drawable hideTarget => hudOverlay.KeyCounter;
private FillFlowContainer keyCounterFlow => hudOverlay.KeyCounter.ChildrenOfType>().First();
@@ -31,9 +35,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
createNew();
- AddRepeatStep("increase combo", () => { hudOverlay.ComboCounter.Current.Value++; }, 10);
+ AddRepeatStep("increase combo", () => { scoreProcessor.Combo.Value++; }, 10);
- AddStep("reset combo", () => { hudOverlay.ComboCounter.Current.Value = 0; });
+ AddStep("reset combo", () => { scoreProcessor.Combo.Value = 0; });
}
[Test]
@@ -139,12 +143,12 @@ namespace osu.Game.Tests.Visual.Gameplay
{
AddStep("create overlay", () =>
{
- hudOverlay = new HUDOverlay(null, null, null, Array.Empty());
+ hudOverlay = new HUDOverlay(scoreProcessor, null, null, Array.Empty());
// Add any key just to display the key counter visually.
hudOverlay.KeyCounter.Add(new KeyCounterKeyboard(Key.Space));
- hudOverlay.ComboCounter.Current.Value = 1;
+ scoreProcessor.Combo.Value = 1;
action?.Invoke(hudOverlay);
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditorMultipleSkins.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditorMultipleSkins.cs
index 086bcb19c3..2424d24bc6 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditorMultipleSkins.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditorMultipleSkins.cs
@@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Testing;
@@ -17,6 +18,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
public class TestSceneSkinEditorMultipleSkins : SkinnableTestScene
{
+ [Cached]
+ private readonly ScoreProcessor scoreProcessor = new ScoreProcessor();
+
[SetUpSteps]
public void SetUpSteps()
{
@@ -28,8 +32,6 @@ namespace osu.Game.Tests.Visual.Gameplay
var working = CreateWorkingBeatmap(ruleset.RulesetInfo);
var beatmap = working.GetPlayableBeatmap(ruleset.RulesetInfo);
- ScoreProcessor scoreProcessor = new ScoreProcessor();
-
var drawableRuleset = ruleset.CreateDrawableRulesetWith(beatmap);
var hudOverlay = new HUDOverlay(scoreProcessor, null, drawableRuleset, Array.Empty())
@@ -40,7 +42,7 @@ namespace osu.Game.Tests.Visual.Gameplay
// Add any key just to display the key counter visually.
hudOverlay.KeyCounter.Add(new KeyCounterKeyboard(Key.Space));
- hudOverlay.ComboCounter.Current.Value = 1;
+ scoreProcessor.Combo.Value = 1;
return new Container
{
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableAccuracyCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableAccuracyCounter.cs
index 709929dcb0..6a8a2187f9 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableAccuracyCounter.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableAccuracyCounter.cs
@@ -1,49 +1,36 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using System.Collections.Generic;
-using System.Linq;
using NUnit.Framework;
+using osu.Framework.Allocation;
using osu.Framework.Testing;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Play.HUD;
namespace osu.Game.Tests.Visual.Gameplay
{
public class TestSceneSkinnableAccuracyCounter : SkinnableTestScene
{
- private IEnumerable accuracyCounters => CreatedDrawables.OfType();
-
protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset();
+ [Cached]
+ private ScoreProcessor scoreProcessor = new ScoreProcessor();
+
[SetUpSteps]
public void SetUpSteps()
{
- AddStep("Create combo counters", () => SetContents(() =>
- {
- var accuracyCounter = new SkinnableAccuracyCounter();
-
- accuracyCounter.Current.Value = 1;
-
- return accuracyCounter;
- }));
+ AddStep("Set initial accuracy", () => scoreProcessor.Accuracy.Value = 1);
+ AddStep("Create accuracy counters", () => SetContents(() => new SkinnableAccuracyCounter()));
}
[Test]
public void TestChangingAccuracy()
{
- AddStep(@"Reset all", delegate
- {
- foreach (var s in accuracyCounters)
- s.Current.Value = 1;
- });
+ AddStep(@"Reset all", () => scoreProcessor.Accuracy.Value = 1);
- AddStep(@"Hit! :D", delegate
- {
- foreach (var s in accuracyCounters)
- s.Current.Value -= 0.023f;
- });
+ AddStep(@"Miss :(", () => scoreProcessor.Accuracy.Value -= 0.023);
}
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableHUDOverlay.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableHUDOverlay.cs
index fec1610160..8131c77b4b 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableHUDOverlay.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableHUDOverlay.cs
@@ -14,6 +14,7 @@ using osu.Game.Configuration;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Play;
using osuTK.Input;
@@ -23,6 +24,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
private HUDOverlay hudOverlay;
+ [Cached]
+ private ScoreProcessor scoreProcessor = new ScoreProcessor();
+
private IEnumerable hudOverlays => CreatedDrawables.OfType();
// best way to check without exposing.
@@ -37,17 +41,9 @@ namespace osu.Game.Tests.Visual.Gameplay
{
createNew();
- AddRepeatStep("increase combo", () =>
- {
- foreach (var hud in hudOverlays)
- hud.ComboCounter.Current.Value++;
- }, 10);
+ AddRepeatStep("increase combo", () => scoreProcessor.Combo.Value++, 10);
- AddStep("reset combo", () =>
- {
- foreach (var hud in hudOverlays)
- hud.ComboCounter.Current.Value = 0;
- });
+ AddStep("reset combo", () => scoreProcessor.Combo.Value = 0);
}
[Test]
@@ -80,13 +76,11 @@ namespace osu.Game.Tests.Visual.Gameplay
{
SetContents(() =>
{
- hudOverlay = new HUDOverlay(null, null, null, Array.Empty());
+ hudOverlay = new HUDOverlay(scoreProcessor, null, null, Array.Empty());
// Add any key just to display the key counter visually.
hudOverlay.KeyCounter.Add(new KeyCounterKeyboard(Key.Space));
- hudOverlay.ComboCounter.Current.Value = 1;
-
action?.Invoke(hudOverlay);
return hudOverlay;
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableScoreCounter.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableScoreCounter.cs
index e212ceeba7..4f2183711e 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableScoreCounter.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinnableScoreCounter.cs
@@ -4,10 +4,12 @@
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
+using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Testing;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Screens.Play.HUD;
namespace osu.Game.Tests.Visual.Gameplay
@@ -18,37 +20,27 @@ namespace osu.Game.Tests.Visual.Gameplay
protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset();
+ [Cached]
+ private ScoreProcessor scoreProcessor = new ScoreProcessor();
+
[SetUpSteps]
public void SetUpSteps()
{
- AddStep("Create combo counters", () => SetContents(() =>
- {
- var comboCounter = new SkinnableScoreCounter();
- comboCounter.Current.Value = 1;
- return comboCounter;
- }));
+ AddStep("Create score counters", () => SetContents(() => new SkinnableScoreCounter()));
}
[Test]
public void TestScoreCounterIncrementing()
{
- AddStep(@"Reset all", delegate
- {
- foreach (var s in scoreCounters)
- s.Current.Value = 0;
- });
+ AddStep(@"Reset all", () => scoreProcessor.TotalScore.Value = 0);
- AddStep(@"Hit! :D", delegate
- {
- foreach (var s in scoreCounters)
- s.Current.Value += 300;
- });
+ AddStep(@"Hit! :D", () => scoreProcessor.TotalScore.Value += 300);
}
[Test]
public void TestVeryLargeScore()
{
- AddStep("set large score", () => scoreCounters.ForEach(counter => counter.Current.Value = 1_000_000_000));
+ AddStep("set large score", () => scoreCounters.ForEach(counter => scoreProcessor.TotalScore.Value = 1_000_000_000));
}
}
}
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs
index 4138a81ebd..0ac8e01482 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneStoryboardWithOutro.cs
@@ -133,6 +133,16 @@ namespace osu.Game.Tests.Visual.Gameplay
AddUntilStep("storyboard ends", () => Player.GameplayClockContainer.GameplayClock.CurrentTime >= currentStoryboardDuration);
}
+ [Test]
+ public void TestPerformExitNoOutro()
+ {
+ CreateTest(null);
+ AddStep("disable storyboard", () => LocalConfig.SetValue(OsuSetting.ShowStoryboard, false));
+ AddUntilStep("completion set by processor", () => Player.ScoreProcessor.HasCompleted.Value);
+ AddStep("exit via pause", () => Player.ExitViaPause());
+ AddAssert("player exited", () => Stack.CurrentScreen == null);
+ }
+
protected override bool AllowFail => true;
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
diff --git a/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
index 6ebe8fcc07..93a5b6fc59 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneNewsOverlay.cs
@@ -2,7 +2,10 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using System.Linq;
using NUnit.Framework;
+using osu.Framework.Testing;
+using osu.Game.Graphics.UserInterface;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
using osu.Game.Online.API.Requests.Responses;
@@ -14,21 +17,34 @@ namespace osu.Game.Tests.Visual.Online
{
private DummyAPIAccess dummyAPI => (DummyAPIAccess)API;
- private NewsOverlay news;
+ private NewsOverlay overlay;
[SetUp]
- public void SetUp() => Schedule(() => Child = news = new NewsOverlay());
+ public void SetUp() => Schedule(() => Child = overlay = new NewsOverlay());
[Test]
public void TestRequest()
{
setUpNewsResponse(responseExample);
- AddStep("Show", () => news.Show());
- AddStep("Show article", () => news.ShowArticle("article"));
+ AddStep("Show", () => overlay.Show());
+ AddStep("Show article", () => overlay.ShowArticle("article"));
}
- private void setUpNewsResponse(GetNewsResponse r)
- => AddStep("set up response", () =>
+ [Test]
+ public void TestCursorRequest()
+ {
+ setUpNewsResponse(responseWithCursor, "Set up cursor response");
+ AddStep("Show", () => overlay.Show());
+ AddUntilStep("Show More button is visible", () => showMoreButton?.Alpha == 1);
+ setUpNewsResponse(responseWithNoCursor, "Set up no cursor response");
+ AddStep("Click Show More", () => showMoreButton?.Click());
+ AddUntilStep("Show More button is hidden", () => showMoreButton?.Alpha == 0);
+ }
+
+ private ShowMoreButton showMoreButton => overlay.ChildrenOfType().FirstOrDefault();
+
+ private void setUpNewsResponse(GetNewsResponse r, string testName = "Set up response")
+ => AddStep(testName, () =>
{
dummyAPI.HandleRequest = request =>
{
@@ -40,7 +56,7 @@ namespace osu.Game.Tests.Visual.Online
};
});
- private GetNewsResponse responseExample => new GetNewsResponse
+ private static GetNewsResponse responseExample => new GetNewsResponse
{
NewsPosts = new[]
{
@@ -62,5 +78,37 @@ namespace osu.Game.Tests.Visual.Online
}
}
};
+
+ private static GetNewsResponse responseWithCursor => new GetNewsResponse
+ {
+ NewsPosts = new[]
+ {
+ new APINewsPost
+ {
+ Title = "This post has an image which starts with \"/\" and has many authors!",
+ Preview = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ Author = "someone, someone1, someone2, someone3, someone4",
+ FirstImage = "/help/wiki/shared/news/banners/monthly-beatmapping-contest.png",
+ PublishedAt = DateTimeOffset.Now
+ }
+ },
+ Cursor = new Cursor()
+ };
+
+ private static GetNewsResponse responseWithNoCursor => new GetNewsResponse
+ {
+ NewsPosts = new[]
+ {
+ new APINewsPost
+ {
+ Title = "This post has a full-url image! (HTML entity: &)",
+ Preview = "boom (HTML entity: &)",
+ Author = "user (HTML entity: &)",
+ FirstImage = "https://assets.ppy.sh/artists/88/header.jpg",
+ PublishedAt = DateTimeOffset.Now
+ }
+ },
+ Cursor = null
+ };
}
}
diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
index 67c85a1120..a416fd4daf 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapInfoWedge.cs
@@ -108,7 +108,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("check version", () => infoWedge.Info.VersionLabel.Current.Value == $"{ruleset.ShortName}Version");
AddAssert("check title", () => infoWedge.Info.TitleLabel.Current.Value == $"{ruleset.ShortName}Source — {ruleset.ShortName}Title");
AddAssert("check artist", () => infoWedge.Info.ArtistLabel.Current.Value == $"{ruleset.ShortName}Artist");
- AddAssert("check author", () => infoWedge.Info.MapperContainer.Children.OfType().Any(s => s.Current.Value == $"{ruleset.ShortName}Author"));
+ AddAssert("check author", () => infoWedge.Info.MapperContainer.ChildrenOfType().Any(s => s.Current.Value == $"{ruleset.ShortName}Author"));
}
private void testInfoLabels(int expectedCount)
@@ -124,7 +124,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("check empty version", () => string.IsNullOrEmpty(infoWedge.Info.VersionLabel.Current.Value));
AddAssert("check default title", () => infoWedge.Info.TitleLabel.Current.Value == Beatmap.Default.BeatmapInfo.Metadata.Title);
AddAssert("check default artist", () => infoWedge.Info.ArtistLabel.Current.Value == Beatmap.Default.BeatmapInfo.Metadata.Artist);
- AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.Children.Any());
+ AddAssert("check empty author", () => !infoWedge.Info.MapperContainer.ChildrenOfType().Any());
AddAssert("check no info labels", () => !infoWedge.Info.ChildrenOfType().Any());
}
diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
index 5731b1ac2c..643f4131dc 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
@@ -304,6 +304,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddStep(@"Sort by BPM", () => config.SetValue(OsuSetting.SongSelectSortingMode, SortMode.BPM));
AddStep(@"Sort by Length", () => config.SetValue(OsuSetting.SongSelectSortingMode, SortMode.Length));
AddStep(@"Sort by Difficulty", () => config.SetValue(OsuSetting.SongSelectSortingMode, SortMode.Difficulty));
+ AddStep(@"Sort by Source", () => config.SetValue(OsuSetting.SongSelectSortingMode, SortMode.Source));
}
[Test]
diff --git a/osu.Game/Graphics/UserInterface/ScoreCounter.cs b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
index d75e49a4ce..5747c846eb 100644
--- a/osu.Game/Graphics/UserInterface/ScoreCounter.cs
+++ b/osu.Game/Graphics/UserInterface/ScoreCounter.cs
@@ -4,11 +4,10 @@
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Game.Graphics.Sprites;
-using osu.Game.Screens.Play.HUD;
namespace osu.Game.Graphics.UserInterface
{
- public abstract class ScoreCounter : RollingCounter, IScoreCounter
+ public abstract class ScoreCounter : RollingCounter
{
protected override double RollingDuration => 1000;
protected override Easing RollingEasing => Easing.Out;
diff --git a/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs b/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
index e8871bef05..2898955de7 100644
--- a/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
+++ b/osu.Game/Online/API/Requests/DownloadBeatmapSetRequest.cs
@@ -23,6 +23,8 @@ namespace osu.Game.Online.API.Requests
return req;
}
+ protected override string FileExtension => ".osz";
+
protected override string Target => $@"beatmapsets/{Model.OnlineBeatmapSetID}/download{(noVideo ? "?noVideo=1" : "")}";
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
index 31c1439c8f..1ffcf9722a 100644
--- a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
+++ b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs
@@ -13,6 +13,8 @@ using osuTK.Graphics;
using osu.Framework.Graphics.Effects;
using osu.Framework.Graphics.Sprites;
using osu.Game.Graphics;
+using osu.Game.Users;
+using osu.Game.Graphics.Containers;
namespace osu.Game.Overlays.BeatmapSet
{
@@ -50,7 +52,7 @@ namespace osu.Game.Overlays.BeatmapSet
fields.Children = new Drawable[]
{
- new Field("mapped by", BeatmapSet.Metadata.Author.Username, OsuFont.GetFont(weight: FontWeight.Regular, italics: true)),
+ new Field("mapped by", BeatmapSet.Metadata.Author, OsuFont.GetFont(weight: FontWeight.Regular, italics: true)),
new Field("submitted", online.Submitted, OsuFont.GetFont(weight: FontWeight.Bold))
{
Margin = new MarginPadding { Top = 5 },
@@ -146,6 +148,25 @@ namespace osu.Game.Overlays.BeatmapSet
}
};
}
+
+ public Field(string first, User second, FontUsage secondFont)
+ {
+ AutoSizeAxes = Axes.Both;
+ Direction = FillDirection.Horizontal;
+
+ Children = new[]
+ {
+ new LinkFlowContainer(s =>
+ {
+ s.Font = OsuFont.GetFont(size: 11);
+ }).With(d =>
+ {
+ d.AutoSizeAxes = Axes.Both;
+ d.AddText($"{first} ");
+ d.AddUserLink(second, s => s.Font = secondFont.With(size: 11));
+ }),
+ };
+ }
}
}
}
diff --git a/osu.Game/Overlays/News/Displays/FrontPageDisplay.cs b/osu.Game/Overlays/News/Displays/FrontPageDisplay.cs
index 0f177f151a..a1bc6c650b 100644
--- a/osu.Game/Overlays/News/Displays/FrontPageDisplay.cs
+++ b/osu.Game/Overlays/News/Displays/FrontPageDisplay.cs
@@ -100,7 +100,7 @@ namespace osu.Game.Overlays.News.Displays
{
content.Add(loaded);
showMore.IsLoading = false;
- showMore.Show();
+ showMore.Alpha = lastCursor == null ? 0 : 1;
}, (cancellationToken = new CancellationTokenSource()).Token);
}
diff --git a/osu.Game/Overlays/Volume/VolumeMeter.cs b/osu.Game/Overlays/Volume/VolumeMeter.cs
index f1f21bec49..a15076581e 100644
--- a/osu.Game/Overlays/Volume/VolumeMeter.cs
+++ b/osu.Game/Overlays/Volume/VolumeMeter.cs
@@ -204,7 +204,7 @@ namespace osu.Game.Overlays.Volume
{
displayVolume = value;
- if (displayVolume > 0.99f)
+ if (displayVolume >= 0.995f)
{
text.Text = "MAX";
maxGlow.EffectColour = meterColour.Opacity(2f);
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index da0e9ebbaf..434683a016 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -17,7 +17,6 @@ using osu.Framework.Input.Bindings;
using osu.Framework.Input.Events;
using osu.Framework.Logging;
using osu.Framework.Screens;
-using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Graphics;
@@ -144,8 +143,7 @@ namespace osu.Game.Screens.Edit
// Todo: should probably be done at a DrawableRuleset level to share logic with Player.
clock = new EditorClock(playableBeatmap, beatDivisor) { IsCoupled = false };
-
- UpdateClockSource();
+ clock.ChangeSource(loadableBeatmap.Track);
dependencies.CacheAs(clock);
AddInternal(clock);
@@ -308,11 +306,7 @@ namespace osu.Game.Screens.Edit
///
/// If the beatmap's track has changed, this method must be called to keep the editor in a valid state.
///
- public void UpdateClockSource()
- {
- var sourceClock = (IAdjustableClock)Beatmap.Value.Track ?? new StopwatchClock();
- clock.ChangeSource(sourceClock);
- }
+ public void UpdateClockSource() => clock.ChangeSource(Beatmap.Value.Track);
protected void Save()
{
@@ -583,7 +577,7 @@ namespace osu.Game.Screens.Edit
private void resetTrack(bool seekToStart = false)
{
- Beatmap.Value.Track?.Stop();
+ Beatmap.Value.Track.Stop();
if (seekToStart)
{
diff --git a/osu.Game/Screens/Play/HUD/DefaultAccuracyCounter.cs b/osu.Game/Screens/Play/HUD/DefaultAccuracyCounter.cs
index b8a43708b4..e41acae9e8 100644
--- a/osu.Game/Screens/Play/HUD/DefaultAccuracyCounter.cs
+++ b/osu.Game/Screens/Play/HUD/DefaultAccuracyCounter.cs
@@ -4,12 +4,11 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Graphics;
-using osu.Game.Graphics.UserInterface;
using osuTK;
namespace osu.Game.Screens.Play.HUD
{
- public class DefaultAccuracyCounter : PercentageCounter, IAccuracyCounter, ISkinnableComponent
+ public class DefaultAccuracyCounter : GameplayAccuracyCounter, ISkinnableComponent
{
private readonly Vector2 offset = new Vector2(-20, 5);
diff --git a/osu.Game/Screens/Play/HUD/DefaultComboCounter.cs b/osu.Game/Screens/Play/HUD/DefaultComboCounter.cs
index 959766ecd1..64226bbb34 100644
--- a/osu.Game/Screens/Play/HUD/DefaultComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/DefaultComboCounter.cs
@@ -7,11 +7,12 @@ using osu.Framework.Graphics;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
+using osu.Game.Rulesets.Scoring;
using osuTK;
namespace osu.Game.Screens.Play.HUD
{
- public class DefaultComboCounter : RollingCounter, IComboCounter, ISkinnableComponent
+ public class DefaultComboCounter : RollingCounter, ISkinnableComponent
{
private readonly Vector2 offset = new Vector2(20, 5);
@@ -24,7 +25,11 @@ namespace osu.Game.Screens.Play.HUD
}
[BackgroundDependencyLoader]
- private void load(OsuColour colours) => Colour = colours.BlueLighter;
+ private void load(OsuColour colours, ScoreProcessor scoreProcessor)
+ {
+ Colour = colours.BlueLighter;
+ Current.BindTo(scoreProcessor.Combo);
+ }
protected override void Update()
{
diff --git a/osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs b/osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs
index dde5c18b38..37b14df536 100644
--- a/osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs
+++ b/osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs
@@ -4,11 +4,10 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Graphics;
-using osu.Game.Graphics.UserInterface;
namespace osu.Game.Screens.Play.HUD
{
- public class DefaultScoreCounter : ScoreCounter, ISkinnableComponent
+ public class DefaultScoreCounter : GameplayScoreCounter, ISkinnableComponent
{
public DefaultScoreCounter()
: base(6)
diff --git a/osu.Game/Screens/Play/HUD/GameplayAccuracyCounter.cs b/osu.Game/Screens/Play/HUD/GameplayAccuracyCounter.cs
new file mode 100644
index 0000000000..7a63084812
--- /dev/null
+++ b/osu.Game/Screens/Play/HUD/GameplayAccuracyCounter.cs
@@ -0,0 +1,18 @@
+// 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.Allocation;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Rulesets.Scoring;
+
+namespace osu.Game.Screens.Play.HUD
+{
+ public abstract class GameplayAccuracyCounter : PercentageCounter
+ {
+ [BackgroundDependencyLoader]
+ private void load(ScoreProcessor scoreProcessor)
+ {
+ Current.BindTo(scoreProcessor.Accuracy);
+ }
+ }
+}
diff --git a/osu.Game/Screens/Play/HUD/GameplayScoreCounter.cs b/osu.Game/Screens/Play/HUD/GameplayScoreCounter.cs
new file mode 100644
index 0000000000..e09630d2c4
--- /dev/null
+++ b/osu.Game/Screens/Play/HUD/GameplayScoreCounter.cs
@@ -0,0 +1,46 @@
+// 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 osu.Framework.Allocation;
+using osu.Framework.Bindables;
+using osu.Game.Configuration;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Rulesets.Scoring;
+
+namespace osu.Game.Screens.Play.HUD
+{
+ public abstract class GameplayScoreCounter : ScoreCounter
+ {
+ private Bindable scoreDisplayMode;
+
+ protected GameplayScoreCounter(int leading = 0, bool useCommaSeparator = false)
+ : base(leading, useCommaSeparator)
+ {
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(OsuConfigManager config, ScoreProcessor scoreProcessor)
+ {
+ scoreDisplayMode = config.GetBindable(OsuSetting.ScoreDisplayMode);
+ scoreDisplayMode.BindValueChanged(scoreMode =>
+ {
+ switch (scoreMode.NewValue)
+ {
+ case ScoringMode.Standardised:
+ RequiredDisplayDigits.Value = 6;
+ break;
+
+ case ScoringMode.Classic:
+ RequiredDisplayDigits.Value = 8;
+ break;
+
+ default:
+ throw new ArgumentOutOfRangeException(nameof(scoreMode));
+ }
+ }, true);
+
+ Current.BindTo(scoreProcessor.TotalScore);
+ }
+ }
+}
diff --git a/osu.Game/Screens/Play/HUD/IAccuracyCounter.cs b/osu.Game/Screens/Play/HUD/IAccuracyCounter.cs
deleted file mode 100644
index 0199250a08..0000000000
--- a/osu.Game/Screens/Play/HUD/IAccuracyCounter.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.Bindables;
-using osu.Framework.Graphics;
-
-namespace osu.Game.Screens.Play.HUD
-{
- ///
- /// An interface providing a set of methods to update a accuracy counter.
- ///
- public interface IAccuracyCounter : IDrawable
- {
- ///
- /// The current accuracy to be displayed.
- ///
- Bindable Current { get; }
- }
-}
diff --git a/osu.Game/Screens/Play/HUD/IComboCounter.cs b/osu.Game/Screens/Play/HUD/IComboCounter.cs
deleted file mode 100644
index ff235bf04e..0000000000
--- a/osu.Game/Screens/Play/HUD/IComboCounter.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// 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.Bindables;
-using osu.Framework.Graphics;
-
-namespace osu.Game.Screens.Play.HUD
-{
- ///
- /// An interface providing a set of methods to update a combo counter.
- ///
- public interface IComboCounter : IDrawable
- {
- ///
- /// The current combo to be displayed.
- ///
- Bindable Current { get; }
- }
-}
diff --git a/osu.Game/Screens/Play/HUD/IScoreCounter.cs b/osu.Game/Screens/Play/HUD/IScoreCounter.cs
deleted file mode 100644
index 7f5e81d5ef..0000000000
--- a/osu.Game/Screens/Play/HUD/IScoreCounter.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.Bindables;
-using osu.Framework.Graphics;
-
-namespace osu.Game.Screens.Play.HUD
-{
- ///
- /// An interface providing a set of methods to update a score counter.
- ///
- public interface IScoreCounter : IDrawable
- {
- ///
- /// The current score to be displayed.
- ///
- Bindable Current { get; }
-
- ///
- /// The number of digits required to display most sane scores.
- /// This may be exceeded in very rare cases, but is useful to pad or space the display to avoid it jumping around.
- ///
- Bindable RequiredDisplayDigits { get; }
- }
-}
diff --git a/osu.Game/Screens/Play/HUD/LegacyComboCounter.cs b/osu.Game/Screens/Play/HUD/LegacyComboCounter.cs
index 4ae722e44c..73305ac93e 100644
--- a/osu.Game/Screens/Play/HUD/LegacyComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/LegacyComboCounter.cs
@@ -6,6 +6,7 @@ using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
+using osu.Game.Rulesets.Scoring;
using osu.Game.Skinning;
using osuTK;
@@ -14,7 +15,7 @@ namespace osu.Game.Screens.Play.HUD
///
/// Uses the 'x' symbol and has a pop-out effect while rolling over.
///
- public class LegacyComboCounter : CompositeDrawable, IComboCounter, ISkinnableComponent
+ public class LegacyComboCounter : CompositeDrawable, ISkinnableComponent
{
public Bindable Current { get; } = new BindableInt { MinValue = 0, };
@@ -79,7 +80,7 @@ namespace osu.Game.Screens.Play.HUD
}
[BackgroundDependencyLoader]
- private void load()
+ private void load(ScoreProcessor scoreProcessor)
{
InternalChildren = new[]
{
@@ -95,7 +96,7 @@ namespace osu.Game.Screens.Play.HUD
},
};
- Current.ValueChanged += combo => updateCount(combo.NewValue == 0);
+ Current.BindTo(scoreProcessor.Combo);
}
protected override void LoadComplete()
@@ -109,7 +110,7 @@ namespace osu.Game.Screens.Play.HUD
popOutCount.Origin = Origin;
popOutCount.Anchor = Anchor;
- updateCount(false);
+ Current.BindValueChanged(combo => updateCount(combo.NewValue == 0), true);
}
private void updateCount(bool rolling)
diff --git a/osu.Game/Screens/Play/HUD/SkinnableAccuracyCounter.cs b/osu.Game/Screens/Play/HUD/SkinnableAccuracyCounter.cs
index 76c9c30813..fcb8fca35d 100644
--- a/osu.Game/Screens/Play/HUD/SkinnableAccuracyCounter.cs
+++ b/osu.Game/Screens/Play/HUD/SkinnableAccuracyCounter.cs
@@ -1,29 +1,16 @@
// 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.Bindables;
using osu.Game.Skinning;
namespace osu.Game.Screens.Play.HUD
{
- public class SkinnableAccuracyCounter : SkinnableDrawable, IAccuracyCounter
+ public class SkinnableAccuracyCounter : SkinnableDrawable
{
- public Bindable Current { get; } = new Bindable();
-
public SkinnableAccuracyCounter()
: base(new HUDSkinComponent(HUDSkinComponents.AccuracyCounter), _ => new DefaultAccuracyCounter())
{
CentreComponent = false;
}
-
- private IAccuracyCounter skinnedCounter;
-
- protected override void SkinChanged(ISkinSource skin, bool allowFallback)
- {
- base.SkinChanged(skin, allowFallback);
-
- skinnedCounter = Drawable as IAccuracyCounter;
- skinnedCounter?.Current.BindTo(Current);
- }
}
}
diff --git a/osu.Game/Screens/Play/HUD/SkinnableComboCounter.cs b/osu.Game/Screens/Play/HUD/SkinnableComboCounter.cs
index c04c50141a..c62f1460c9 100644
--- a/osu.Game/Screens/Play/HUD/SkinnableComboCounter.cs
+++ b/osu.Game/Screens/Play/HUD/SkinnableComboCounter.cs
@@ -1,29 +1,16 @@
// 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.Bindables;
using osu.Game.Skinning;
namespace osu.Game.Screens.Play.HUD
{
- public class SkinnableComboCounter : SkinnableDrawable, IComboCounter
+ public class SkinnableComboCounter : SkinnableDrawable
{
- public Bindable Current { get; } = new Bindable();
-
public SkinnableComboCounter()
: base(new HUDSkinComponent(HUDSkinComponents.ComboCounter), skinComponent => new DefaultComboCounter())
{
CentreComponent = false;
}
-
- private IComboCounter skinnedCounter;
-
- protected override void SkinChanged(ISkinSource skin, bool allowFallback)
- {
- base.SkinChanged(skin, allowFallback);
-
- skinnedCounter = Drawable as IComboCounter;
- skinnedCounter?.Current.BindTo(Current);
- }
}
}
diff --git a/osu.Game/Screens/Play/HUD/SkinnableScoreCounter.cs b/osu.Game/Screens/Play/HUD/SkinnableScoreCounter.cs
index b46f5684b1..cc9a712e97 100644
--- a/osu.Game/Screens/Play/HUD/SkinnableScoreCounter.cs
+++ b/osu.Game/Screens/Play/HUD/SkinnableScoreCounter.cs
@@ -1,61 +1,16 @@
// 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 osu.Framework.Allocation;
-using osu.Framework.Bindables;
-using osu.Game.Configuration;
-using osu.Game.Rulesets.Scoring;
using osu.Game.Skinning;
namespace osu.Game.Screens.Play.HUD
{
- public class SkinnableScoreCounter : SkinnableDrawable, IScoreCounter
+ public class SkinnableScoreCounter : SkinnableDrawable
{
- public Bindable Current { get; } = new Bindable();
-
- private Bindable scoreDisplayMode;
-
- public Bindable RequiredDisplayDigits { get; } = new Bindable();
-
public SkinnableScoreCounter()
: base(new HUDSkinComponent(HUDSkinComponents.ScoreCounter), _ => new DefaultScoreCounter())
{
CentreComponent = false;
}
-
- [BackgroundDependencyLoader]
- private void load(OsuConfigManager config)
- {
- scoreDisplayMode = config.GetBindable(OsuSetting.ScoreDisplayMode);
- scoreDisplayMode.BindValueChanged(scoreMode =>
- {
- switch (scoreMode.NewValue)
- {
- case ScoringMode.Standardised:
- RequiredDisplayDigits.Value = 6;
- break;
-
- case ScoringMode.Classic:
- RequiredDisplayDigits.Value = 8;
- break;
-
- default:
- throw new ArgumentOutOfRangeException(nameof(scoreMode));
- }
- }, true);
- }
-
- private IScoreCounter skinnedCounter;
-
- protected override void SkinChanged(ISkinSource skin, bool allowFallback)
- {
- base.SkinChanged(skin, allowFallback);
-
- skinnedCounter = Drawable as IScoreCounter;
-
- skinnedCounter?.Current.BindTo(Current);
- skinnedCounter?.RequiredDisplayDigits.BindTo(RequiredDisplayDigits);
- }
}
}
diff --git a/osu.Game/Screens/Play/HUDOverlay.cs b/osu.Game/Screens/Play/HUDOverlay.cs
index 669c920017..e9b376c433 100644
--- a/osu.Game/Screens/Play/HUDOverlay.cs
+++ b/osu.Game/Screens/Play/HUDOverlay.cs
@@ -34,7 +34,6 @@ namespace osu.Game.Screens.Play
public float TopScoringElementsHeight { get; private set; }
public readonly KeyCounterDisplay KeyCounter;
- public readonly SkinnableComboCounter ComboCounter;
public readonly SkinnableScoreCounter ScoreCounter;
public readonly SkinnableAccuracyCounter AccuracyCounter;
public readonly SkinnableHealthDisplay HealthDisplay;
@@ -106,7 +105,7 @@ namespace osu.Game.Screens.Play
HealthDisplay = CreateHealthDisplay(),
AccuracyCounter = CreateAccuracyCounter(),
ScoreCounter = CreateScoreCounter(),
- ComboCounter = CreateComboCounter(),
+ CreateComboCounter(),
HitErrorDisplay = CreateHitErrorDisplayOverlay(),
}
},
@@ -276,13 +275,13 @@ namespace osu.Game.Screens.Play
Progress.BindDrawableRuleset(drawableRuleset);
}
- protected virtual SkinnableAccuracyCounter CreateAccuracyCounter() => new SkinnableAccuracyCounter();
+ protected SkinnableAccuracyCounter CreateAccuracyCounter() => new SkinnableAccuracyCounter();
- protected virtual SkinnableScoreCounter CreateScoreCounter() => new SkinnableScoreCounter();
+ protected SkinnableScoreCounter CreateScoreCounter() => new SkinnableScoreCounter();
- protected virtual SkinnableComboCounter CreateComboCounter() => new SkinnableComboCounter();
+ protected SkinnableComboCounter CreateComboCounter() => new SkinnableComboCounter();
- protected virtual SkinnableHealthDisplay CreateHealthDisplay() => new SkinnableHealthDisplay();
+ protected SkinnableHealthDisplay CreateHealthDisplay() => new SkinnableHealthDisplay();
protected virtual FailingLayer CreateFailingLayer() => new FailingLayer
{
@@ -321,10 +320,6 @@ namespace osu.Game.Screens.Play
protected virtual void BindScoreProcessor(ScoreProcessor processor)
{
- ScoreCounter?.Current.BindTo(processor.TotalScore);
- AccuracyCounter?.Current.BindTo(processor.Accuracy);
- ComboCounter?.Current.BindTo(processor.Combo);
-
if (HealthDisplay is IHealthDisplay shd)
{
processor.NewJudgement += judgement =>
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 88e617245b..e141172a96 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -203,6 +203,8 @@ namespace osu.Game.Screens.Play
ScoreProcessor.ApplyBeatmap(playableBeatmap);
ScoreProcessor.Mods.BindTo(Mods);
+ dependencies.CacheAs(ScoreProcessor);
+
HealthProcessor = ruleset.CreateHealthProcessor(playableBeatmap.HitObjects[0].StartTime);
HealthProcessor.ApplyBeatmap(playableBeatmap);
@@ -541,8 +543,10 @@ namespace osu.Game.Screens.Play
}
// if the score is ready for display but results screen has not been pushed yet (e.g. storyboard is still playing beyond gameplay), then transition to results screen instead of exiting.
- if (prepareScoreForDisplayTask != null)
+ if (prepareScoreForDisplayTask != null && completionProgressDelegate == null)
+ {
updateCompletionState(true);
+ }
}
this.Exit();
diff --git a/osu.Game/Screens/Select/BeatmapInfoWedge.cs b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
index 18615d9192..e1cf0cef4e 100644
--- a/osu.Game/Screens/Select/BeatmapInfoWedge.cs
+++ b/osu.Game/Screens/Select/BeatmapInfoWedge.cs
@@ -28,6 +28,7 @@ using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.UI;
using osu.Game.Screens.Ranking.Expanded;
+using osu.Game.Graphics.Containers;
namespace osu.Game.Screens.Select
{
@@ -286,7 +287,7 @@ namespace osu.Game.Screens.Select
Margin = new MarginPadding { Top = 10 },
Direction = FillDirection.Horizontal,
AutoSizeAxes = Axes.Both,
- Children = getMapper(metadata)
+ Child = getMapper(metadata),
},
infoLabelContainer = new FillFlowContainer
{
@@ -406,24 +407,20 @@ namespace osu.Game.Screens.Select
});
}
- private OsuSpriteText[] getMapper(BeatmapMetadata metadata)
+ private Drawable getMapper(BeatmapMetadata metadata)
{
- if (string.IsNullOrEmpty(metadata.Author?.Username))
- return Array.Empty();
+ if (metadata.Author == null)
+ return Empty();
- return new[]
+ return new LinkFlowContainer(s =>
{
- new OsuSpriteText
- {
- Text = "mapped by ",
- Font = OsuFont.GetFont(size: 15),
- },
- new OsuSpriteText
- {
- Text = metadata.Author.Username,
- Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15),
- }
- };
+ s.Font = OsuFont.GetFont(weight: FontWeight.Bold, size: 15);
+ }).With(d =>
+ {
+ d.AutoSizeAxes = Axes.Both;
+ d.AddText("mapped by ");
+ d.AddUserLink(metadata.Author);
+ });
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
index bf045ed612..00c2c2cb4a 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
@@ -71,6 +71,9 @@ namespace osu.Game.Screens.Select.Carousel
case SortMode.Author:
return string.Compare(BeatmapSet.Metadata.Author.Username, otherSet.BeatmapSet.Metadata.Author.Username, StringComparison.OrdinalIgnoreCase);
+ case SortMode.Source:
+ return string.Compare(BeatmapSet.Metadata.Source, otherSet.BeatmapSet.Metadata.Source, StringComparison.OrdinalIgnoreCase);
+
case SortMode.DateAdded:
return otherSet.BeatmapSet.DateAdded.CompareTo(BeatmapSet.DateAdded);
diff --git a/osu.Game/Screens/Select/Filter/SortMode.cs b/osu.Game/Screens/Select/Filter/SortMode.cs
index be76fbc3ba..18c5d713e1 100644
--- a/osu.Game/Screens/Select/Filter/SortMode.cs
+++ b/osu.Game/Screens/Select/Filter/SortMode.cs
@@ -28,7 +28,10 @@ namespace osu.Game.Screens.Select.Filter
[Description("Rank Achieved")]
RankAchieved,
+ [Description("Source")]
+ Source,
+
[Description("Title")]
- Title
+ Title,
}
}
diff --git a/osu.Game/Skinning/LegacyAccuracyCounter.cs b/osu.Game/Skinning/LegacyAccuracyCounter.cs
index c592e06924..3efcd5555e 100644
--- a/osu.Game/Skinning/LegacyAccuracyCounter.cs
+++ b/osu.Game/Skinning/LegacyAccuracyCounter.cs
@@ -4,14 +4,13 @@
using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
using osu.Game.Screens.Play;
using osu.Game.Screens.Play.HUD;
using osuTK;
namespace osu.Game.Skinning
{
- public class LegacyAccuracyCounter : PercentageCounter, IAccuracyCounter, ISkinnableComponent
+ public class LegacyAccuracyCounter : GameplayAccuracyCounter, ISkinnableComponent
{
private readonly ISkin skin;
diff --git a/osu.Game/Skinning/LegacyScoreCounter.cs b/osu.Game/Skinning/LegacyScoreCounter.cs
index cae8044242..ecb907e601 100644
--- a/osu.Game/Skinning/LegacyScoreCounter.cs
+++ b/osu.Game/Skinning/LegacyScoreCounter.cs
@@ -1,24 +1,20 @@
// 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.Bindables;
using osu.Framework.Graphics;
using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
using osu.Game.Screens.Play.HUD;
using osuTK;
namespace osu.Game.Skinning
{
- public class LegacyScoreCounter : ScoreCounter, ISkinnableComponent
+ public class LegacyScoreCounter : GameplayScoreCounter, ISkinnableComponent
{
private readonly ISkin skin;
protected override double RollingDuration => 1000;
protected override Easing RollingEasing => Easing.Out;
- public new Bindable Current { get; } = new Bindable();
-
public LegacyScoreCounter(ISkin skin)
: base(6)
{
@@ -27,9 +23,6 @@ namespace osu.Game.Skinning
this.skin = skin;
- // base class uses int for display, but externally we bind to ScoreProcessor as a double for now.
- Current.BindValueChanged(v => base.Current.Value = (int)v.NewValue);
-
Scale = new Vector2(0.96f);
Margin = new MarginPadding(10);
}
diff --git a/osu.Game/Tests/Visual/EditorClockTestScene.cs b/osu.Game/Tests/Visual/EditorClockTestScene.cs
index 79cfee8518..34393fba7d 100644
--- a/osu.Game/Tests/Visual/EditorClockTestScene.cs
+++ b/osu.Game/Tests/Visual/EditorClockTestScene.cs
@@ -4,7 +4,6 @@
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Input.Events;
-using osu.Framework.Timing;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Screens.Edit;
@@ -46,7 +45,7 @@ namespace osu.Game.Tests.Visual
private void beatmapChanged(ValueChangedEvent e)
{
Clock.ControlPointInfo = e.NewValue.Beatmap.ControlPointInfo;
- Clock.ChangeSource((IAdjustableClock)e.NewValue.Track ?? new StopwatchClock());
+ Clock.ChangeSource(e.NewValue.Track);
Clock.ProcessFrame();
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index e448972066..29189781a7 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -29,7 +29,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 43ed2d7dc8..c4eb7aefba 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -93,7 +93,7 @@
-
+