From f5bea077a09bcca057d6ad628a7e9977f75f7399 Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Fri, 8 Dec 2017 11:26:34 +1100 Subject: [PATCH 01/64] Subclass ModIcon to remove the tooltip text --- osu.Game/Overlays/Mods/ModButton.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs index 77b7c3add2..22a39b470c 100644 --- a/osu.Game/Overlays/Mods/ModButton.cs +++ b/osu.Game/Overlays/Mods/ModButton.cs @@ -204,13 +204,13 @@ namespace osu.Game.Overlays.Mods { iconsContainer.AddRange(new[] { - backgroundIcon = new ModIcon(Mods[1]) + backgroundIcon = new DisplayableModIcon(Mods[1]) { Origin = Anchor.BottomRight, Anchor = Anchor.BottomRight, Position = new Vector2(1.5f), }, - foregroundIcon = new ModIcon(Mods[0]) + foregroundIcon = new DisplayableModIcon(Mods[0]) { Origin = Anchor.BottomRight, Anchor = Anchor.BottomRight, @@ -220,7 +220,7 @@ namespace osu.Game.Overlays.Mods } else { - iconsContainer.Add(foregroundIcon = new ModIcon(Mod) + iconsContainer.Add(foregroundIcon = new DisplayableModIcon(Mod) { Origin = Anchor.Centre, Anchor = Anchor.Centre, @@ -259,5 +259,15 @@ namespace osu.Game.Overlays.Mods Mod = mod; } + + private class DisplayableModIcon : ModIcon { + + public string TooltipText => null; + + public DisplayableModIcon(Mod mod) : base(mod) { + + } + + } } } From 9b3e666a077ac83d3cf951a7c91d2f12dbf45ce3 Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Fri, 8 Dec 2017 13:53:49 +1100 Subject: [PATCH 02/64] Added IgnoreTooltip to all classes required --- osu.Game.Tests/Visual/TestCaseTextAwesome.cs | 1 + osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs | 1 + osu.Game/Graphics/UserInterface/OsuSliderBar.cs | 1 + osu.Game/Overlays/BeatmapSet/AuthorInfo.cs | 1 + osu.Game/Overlays/BeatmapSet/BasicStats.cs | 1 + osu.Game/Overlays/Profile/ProfileHeader.cs | 1 + osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs | 1 + osu.Game/Overlays/Settings/SettingsItem.cs | 1 + osu.Game/Rulesets/UI/ModIcon.cs | 2 ++ osu.Game/Screens/Multiplayer/DrawableGameType.cs | 1 + osu.Game/Screens/Multiplayer/RoomInspector.cs | 1 + osu.Game/Tests/Visual/TestCasePerformancePoints.cs | 1 + 12 files changed, 13 insertions(+) diff --git a/osu.Game.Tests/Visual/TestCaseTextAwesome.cs b/osu.Game.Tests/Visual/TestCaseTextAwesome.cs index 37905a1883..1941aa76aa 100644 --- a/osu.Game.Tests/Visual/TestCaseTextAwesome.cs +++ b/osu.Game.Tests/Visual/TestCaseTextAwesome.cs @@ -36,6 +36,7 @@ namespace osu.Game.Tests.Visual private class Icon : Container, IHasTooltip { public string TooltipText { get; } + public bool IgnoreTooltip => false; public Icon(FontAwesome fa) { diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 7f193a0e1a..08c9ffadc2 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -103,6 +103,7 @@ namespace osu.Game.Graphics.UserInterface private class CapsWarning : SpriteIcon, IHasTooltip { public string TooltipText => @"Caps lock is active"; + public bool IgnoreTooltip => false; public CapsWarning() { diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs index fd75269610..f2cc668c5e 100644 --- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs +++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs @@ -46,6 +46,7 @@ namespace osu.Game.Graphics.UserInterface return Current.Value.ToString(); } } + public bool IgnoreTooltip => false; private Color4 accentColour; public Color4 AccentColour diff --git a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs index 46ee5a9cdb..4df4e48ab7 100644 --- a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs +++ b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs @@ -126,6 +126,7 @@ namespace osu.Game.Overlays.BeatmapSet private class ClickableArea : OsuClickableContainer, IHasTooltip { public string TooltipText => @"View Profile"; + public bool IgnoreTooltip => false; } } } diff --git a/osu.Game/Overlays/BeatmapSet/BasicStats.cs b/osu.Game/Overlays/BeatmapSet/BasicStats.cs index 3ecff85bee..29e19f3370 100644 --- a/osu.Game/Overlays/BeatmapSet/BasicStats.cs +++ b/osu.Game/Overlays/BeatmapSet/BasicStats.cs @@ -68,6 +68,7 @@ namespace osu.Game.Overlays.BeatmapSet private readonly OsuSpriteText value; public string TooltipText => name; + public bool IgnoreTooltip => false; public string Value { get { return value.Text; } diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs index c7bc5c1d93..e36385b7f4 100644 --- a/osu.Game/Overlays/Profile/ProfileHeader.cs +++ b/osu.Game/Overlays/Profile/ProfileHeader.cs @@ -531,6 +531,7 @@ namespace osu.Game.Overlays.Profile public class ProfileLink : LinkText, IHasTooltip { public string TooltipText => "View Profile in Browser"; + public bool IgnoreTooltip => false; public ProfileLink(User user) { diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs index 35f4778047..9aac6ec56c 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs @@ -185,6 +185,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks private class MetadataContainer : OsuHoverContainer, IHasTooltip { public string TooltipText { get; set; } + public bool IgnoreTooltip => false; public MetadataContainer(string title, string artist) { diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs index d9aac58c54..3731d385f3 100644 --- a/osu.Game/Overlays/Settings/SettingsItem.cs +++ b/osu.Game/Overlays/Settings/SettingsItem.cs @@ -158,6 +158,7 @@ namespace osu.Game.Overlays.Settings } public string TooltipText => "Revert to default"; + public bool IgnoreTooltip => false; public override bool HandleInput => true; diff --git a/osu.Game/Rulesets/UI/ModIcon.cs b/osu.Game/Rulesets/UI/ModIcon.cs index 5ca3d9521b..8cabd4f757 100644 --- a/osu.Game/Rulesets/UI/ModIcon.cs +++ b/osu.Game/Rulesets/UI/ModIcon.cs @@ -29,6 +29,7 @@ namespace osu.Game.Rulesets.UI private readonly ModType type; public string TooltipText { get; } + public virtual bool IgnoreTooltip { get; } public ModIcon(Mod mod) { @@ -37,6 +38,7 @@ namespace osu.Game.Rulesets.UI type = mod.Type; TooltipText = mod.Name; + IgnoreTooltip = false; Size = new Vector2(size); diff --git a/osu.Game/Screens/Multiplayer/DrawableGameType.cs b/osu.Game/Screens/Multiplayer/DrawableGameType.cs index 5b85fcc4da..5966abf865 100644 --- a/osu.Game/Screens/Multiplayer/DrawableGameType.cs +++ b/osu.Game/Screens/Multiplayer/DrawableGameType.cs @@ -16,6 +16,7 @@ namespace osu.Game.Screens.Multiplayer private readonly GameType type; public string TooltipText => type.Name; + public bool IgnoreTooltip => false; public DrawableGameType(GameType type) { diff --git a/osu.Game/Screens/Multiplayer/RoomInspector.cs b/osu.Game/Screens/Multiplayer/RoomInspector.cs index 8d7401500f..bafafeb1ec 100644 --- a/osu.Game/Screens/Multiplayer/RoomInspector.cs +++ b/osu.Game/Screens/Multiplayer/RoomInspector.cs @@ -384,6 +384,7 @@ namespace osu.Game.Screens.Multiplayer private readonly User user; public string TooltipText => user.Username; + public bool IgnoreTooltip => false; public UserTile(User user) { diff --git a/osu.Game/Tests/Visual/TestCasePerformancePoints.cs b/osu.Game/Tests/Visual/TestCasePerformancePoints.cs index 6da14e9b12..cf6a4946bc 100644 --- a/osu.Game/Tests/Visual/TestCasePerformancePoints.cs +++ b/osu.Game/Tests/Visual/TestCasePerformancePoints.cs @@ -144,6 +144,7 @@ namespace osu.Game.Tests.Visual private bool isSelected; public string TooltipText => text.Text; + public bool IgnoreTooltip => false; public BeatmapDisplay(BeatmapInfo beatmap) { From a491710fe42d61e2d77bbad23fe9ca55426ba24f Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Fri, 8 Dec 2017 13:55:54 +1100 Subject: [PATCH 03/64] Override IgnoreTooltip in DisplayableModIcon --- osu.Game/Overlays/Mods/ModButton.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs index 22a39b470c..e4a4413d09 100644 --- a/osu.Game/Overlays/Mods/ModButton.cs +++ b/osu.Game/Overlays/Mods/ModButton.cs @@ -35,6 +35,7 @@ namespace osu.Game.Overlays.Mods public Action Action; // Passed the selected mod or null if none public string TooltipText => (SelectedMod?.Description ?? Mods.FirstOrDefault()?.Description) ?? string.Empty; + public bool IgnoreTooltip => false; private const Easing mod_switch_easing = Easing.InOutSine; private const double mod_switch_duration = 120; @@ -262,10 +263,10 @@ namespace osu.Game.Overlays.Mods private class DisplayableModIcon : ModIcon { - public string TooltipText => null; + public override bool IgnoreTooltip { get; } public DisplayableModIcon(Mod mod) : base(mod) { - + IgnoreTooltip = true; } } From 71e59bc9e753777a86739446e3fb691b27bfb738 Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Sat, 16 Dec 2017 20:16:40 +1100 Subject: [PATCH 04/64] Removed the IgnoreTooltip property --- osu.Game.Tests/Visual/TestCaseTextAwesome.cs | 1 - osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs | 1 - osu.Game/Graphics/UserInterface/OsuSliderBar.cs | 1 - osu.Game/Overlays/BeatmapSet/AuthorInfo.cs | 1 - osu.Game/Overlays/BeatmapSet/BasicStats.cs | 1 - osu.Game/Overlays/Profile/ProfileHeader.cs | 1 - osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs | 1 - osu.Game/Overlays/Settings/SettingsItem.cs | 1 - osu.Game/Rulesets/UI/ModIcon.cs | 4 +--- osu.Game/Screens/Multiplayer/DrawableGameType.cs | 1 - osu.Game/Screens/Multiplayer/RoomInspector.cs | 1 - osu.Game/Tests/Visual/TestCasePerformancePoints.cs | 1 - 12 files changed, 1 insertion(+), 14 deletions(-) diff --git a/osu.Game.Tests/Visual/TestCaseTextAwesome.cs b/osu.Game.Tests/Visual/TestCaseTextAwesome.cs index 1941aa76aa..37905a1883 100644 --- a/osu.Game.Tests/Visual/TestCaseTextAwesome.cs +++ b/osu.Game.Tests/Visual/TestCaseTextAwesome.cs @@ -36,7 +36,6 @@ namespace osu.Game.Tests.Visual private class Icon : Container, IHasTooltip { public string TooltipText { get; } - public bool IgnoreTooltip => false; public Icon(FontAwesome fa) { diff --git a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs index 08c9ffadc2..7f193a0e1a 100644 --- a/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs +++ b/osu.Game/Graphics/UserInterface/OsuPasswordTextBox.cs @@ -103,7 +103,6 @@ namespace osu.Game.Graphics.UserInterface private class CapsWarning : SpriteIcon, IHasTooltip { public string TooltipText => @"Caps lock is active"; - public bool IgnoreTooltip => false; public CapsWarning() { diff --git a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs index f2cc668c5e..fd75269610 100644 --- a/osu.Game/Graphics/UserInterface/OsuSliderBar.cs +++ b/osu.Game/Graphics/UserInterface/OsuSliderBar.cs @@ -46,7 +46,6 @@ namespace osu.Game.Graphics.UserInterface return Current.Value.ToString(); } } - public bool IgnoreTooltip => false; private Color4 accentColour; public Color4 AccentColour diff --git a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs index 4df4e48ab7..46ee5a9cdb 100644 --- a/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs +++ b/osu.Game/Overlays/BeatmapSet/AuthorInfo.cs @@ -126,7 +126,6 @@ namespace osu.Game.Overlays.BeatmapSet private class ClickableArea : OsuClickableContainer, IHasTooltip { public string TooltipText => @"View Profile"; - public bool IgnoreTooltip => false; } } } diff --git a/osu.Game/Overlays/BeatmapSet/BasicStats.cs b/osu.Game/Overlays/BeatmapSet/BasicStats.cs index 29e19f3370..3ecff85bee 100644 --- a/osu.Game/Overlays/BeatmapSet/BasicStats.cs +++ b/osu.Game/Overlays/BeatmapSet/BasicStats.cs @@ -68,7 +68,6 @@ namespace osu.Game.Overlays.BeatmapSet private readonly OsuSpriteText value; public string TooltipText => name; - public bool IgnoreTooltip => false; public string Value { get { return value.Text; } diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs index e36385b7f4..c7bc5c1d93 100644 --- a/osu.Game/Overlays/Profile/ProfileHeader.cs +++ b/osu.Game/Overlays/Profile/ProfileHeader.cs @@ -531,7 +531,6 @@ namespace osu.Game.Overlays.Profile public class ProfileLink : LinkText, IHasTooltip { public string TooltipText => "View Profile in Browser"; - public bool IgnoreTooltip => false; public ProfileLink(User user) { diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs index 9aac6ec56c..35f4778047 100644 --- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs +++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs @@ -185,7 +185,6 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks private class MetadataContainer : OsuHoverContainer, IHasTooltip { public string TooltipText { get; set; } - public bool IgnoreTooltip => false; public MetadataContainer(string title, string artist) { diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs index 3731d385f3..d9aac58c54 100644 --- a/osu.Game/Overlays/Settings/SettingsItem.cs +++ b/osu.Game/Overlays/Settings/SettingsItem.cs @@ -158,7 +158,6 @@ namespace osu.Game.Overlays.Settings } public string TooltipText => "Revert to default"; - public bool IgnoreTooltip => false; public override bool HandleInput => true; diff --git a/osu.Game/Rulesets/UI/ModIcon.cs b/osu.Game/Rulesets/UI/ModIcon.cs index 8cabd4f757..90f63aeab6 100644 --- a/osu.Game/Rulesets/UI/ModIcon.cs +++ b/osu.Game/Rulesets/UI/ModIcon.cs @@ -28,8 +28,7 @@ namespace osu.Game.Rulesets.UI private readonly ModType type; - public string TooltipText { get; } - public virtual bool IgnoreTooltip { get; } + public virtual string TooltipText { get; } public ModIcon(Mod mod) { @@ -38,7 +37,6 @@ namespace osu.Game.Rulesets.UI type = mod.Type; TooltipText = mod.Name; - IgnoreTooltip = false; Size = new Vector2(size); diff --git a/osu.Game/Screens/Multiplayer/DrawableGameType.cs b/osu.Game/Screens/Multiplayer/DrawableGameType.cs index 5966abf865..5b85fcc4da 100644 --- a/osu.Game/Screens/Multiplayer/DrawableGameType.cs +++ b/osu.Game/Screens/Multiplayer/DrawableGameType.cs @@ -16,7 +16,6 @@ namespace osu.Game.Screens.Multiplayer private readonly GameType type; public string TooltipText => type.Name; - public bool IgnoreTooltip => false; public DrawableGameType(GameType type) { diff --git a/osu.Game/Screens/Multiplayer/RoomInspector.cs b/osu.Game/Screens/Multiplayer/RoomInspector.cs index bafafeb1ec..8d7401500f 100644 --- a/osu.Game/Screens/Multiplayer/RoomInspector.cs +++ b/osu.Game/Screens/Multiplayer/RoomInspector.cs @@ -384,7 +384,6 @@ namespace osu.Game.Screens.Multiplayer private readonly User user; public string TooltipText => user.Username; - public bool IgnoreTooltip => false; public UserTile(User user) { diff --git a/osu.Game/Tests/Visual/TestCasePerformancePoints.cs b/osu.Game/Tests/Visual/TestCasePerformancePoints.cs index cf6a4946bc..6da14e9b12 100644 --- a/osu.Game/Tests/Visual/TestCasePerformancePoints.cs +++ b/osu.Game/Tests/Visual/TestCasePerformancePoints.cs @@ -144,7 +144,6 @@ namespace osu.Game.Tests.Visual private bool isSelected; public string TooltipText => text.Text; - public bool IgnoreTooltip => false; public BeatmapDisplay(BeatmapInfo beatmap) { From 84ed91d5c94d9c9ebc001f4ae25d6387d7eb0f59 Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Sat, 16 Dec 2017 20:17:20 +1100 Subject: [PATCH 05/64] Remove IgnoreTooltip; Override TooltipText to null --- osu.Game/Overlays/Mods/ModButton.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs index e4a4413d09..e81ff44f03 100644 --- a/osu.Game/Overlays/Mods/ModButton.cs +++ b/osu.Game/Overlays/Mods/ModButton.cs @@ -35,7 +35,6 @@ namespace osu.Game.Overlays.Mods public Action Action; // Passed the selected mod or null if none public string TooltipText => (SelectedMod?.Description ?? Mods.FirstOrDefault()?.Description) ?? string.Empty; - public bool IgnoreTooltip => false; private const Easing mod_switch_easing = Easing.InOutSine; private const double mod_switch_duration = 120; @@ -263,10 +262,10 @@ namespace osu.Game.Overlays.Mods private class DisplayableModIcon : ModIcon { - public override bool IgnoreTooltip { get; } - + public override string TooltipText { get; } + public DisplayableModIcon(Mod mod) : base(mod) { - IgnoreTooltip = true; + TooltipText = null; } } From f5d4ed2a220e95e03d244a4819ec3112aa9de3e7 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 9 Dec 2017 17:43:30 +0100 Subject: [PATCH 06/64] add interface to adjust DrawableHitObjects --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 8 ++++++- .../Mods/IApplicableToDrawableHitObject.cs | 24 +++++++++++++++++++ osu.Game/Rulesets/UI/RulesetContainer.cs | 3 +++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 71349285b3..efe4a2002f 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -13,6 +13,7 @@ using osu.Game.Rulesets.Osu.UI; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; using OpenTK; +using osu.Game.Rulesets.Objects.Drawables; namespace osu.Game.Rulesets.Osu.Mods { @@ -26,10 +27,15 @@ namespace osu.Game.Rulesets.Osu.Mods } - public class OsuModHidden : ModHidden + public class OsuModHidden : ModHidden, IApplicableToDrawableHitObjects { public override string Description => @"Play with no approach circles and fading notes for a slight score advantage."; public override double ScoreMultiplier => 1.06; + + public void ApplyToDrawableHitObjects(IEnumerable drawables) + { + + } } public class OsuModHardRock : ModHardRock, IApplicableToHitObject diff --git a/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs new file mode 100644 index 0000000000..2751e36a25 --- /dev/null +++ b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs @@ -0,0 +1,24 @@ +// Copyright (c) 2007-2017 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using osu.Game.Rulesets.Objects.Drawables; + +namespace osu.Game.Rulesets.Mods +{ + /// + /// An interface for s that can be applied to s. + /// + public interface IApplicableToDrawableHitObjects + { + /// + /// Applies this to a list of s. + /// + /// The list of s to apply to. + void ApplyToDrawableHitObjects(IEnumerable drawables); + } +} diff --git a/osu.Game/Rulesets/UI/RulesetContainer.cs b/osu.Game/Rulesets/UI/RulesetContainer.cs index fe7c0c05ed..40a37c689b 100644 --- a/osu.Game/Rulesets/UI/RulesetContainer.cs +++ b/osu.Game/Rulesets/UI/RulesetContainer.cs @@ -260,6 +260,9 @@ namespace osu.Game.Rulesets.UI } Playfield.PostProcess(); + + foreach (var mod in Mods.OfType()) + mod.ApplyToDrawableHitObjects(Playfield.HitObjects.Objects); } protected override void Update() From 4c2554595eba4b035435fedc50795bee09c1ef0f Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Tue, 26 Dec 2017 17:25:18 +0100 Subject: [PATCH 07/64] implement hidden (mostly) some things work and others don't, I dunno --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 55 +++++++++++++--- .../Objects/Drawables/DrawableHitCircle.cs | 13 ++-- .../Objects/Drawables/DrawableOsuHitObject.cs | 13 ++-- .../Objects/Drawables/DrawableSlider.cs | 64 +++++++++---------- .../Objects/Drawables/DrawableSpinner.cs | 46 ++++++------- .../Objects/Drawables/Pieces/SpinnerDisc.cs | 2 + .../Mods/IApplicableToDrawableHitObject.cs | 4 -- .../Objects/Drawables/DrawableHitObject.cs | 8 +++ osu.Game/osu.Game.csproj | 1 + 9 files changed, 126 insertions(+), 80 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index efe4a2002f..6b8f30eaec 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -11,9 +11,10 @@ using System.Collections.Generic; using System.Linq; using osu.Game.Rulesets.Osu.UI; using osu.Game.Rulesets.Scoring; -using osu.Game.Rulesets.UI; using OpenTK; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Osu.Objects.Drawables; +using osu.Framework.Graphics; namespace osu.Game.Rulesets.Osu.Mods { @@ -24,7 +25,6 @@ namespace osu.Game.Rulesets.Osu.Mods public class OsuModEasy : ModEasy { - } public class OsuModHidden : ModHidden, IApplicableToDrawableHitObjects @@ -32,9 +32,54 @@ namespace osu.Game.Rulesets.Osu.Mods public override string Description => @"Play with no approach circles and fading notes for a slight score advantage."; public override double ScoreMultiplier => 1.06; + private const double fade_in_speed_multiplier = 0.6; + private const double fade_out_speed_multiplier = 0.3; + + private float preEmpt => DrawableOsuHitObject.TIME_PREEMPT; + public void ApplyToDrawableHitObjects(IEnumerable drawables) { + foreach (var d in drawables.OfType()) + d.ApplyCustomUpdateState += customSequence; + } + private void customSequence(DrawableHitObject drawable, ArmedState state) + { + if (!(drawable is DrawableOsuHitObject d)) + return; + + //var duration = (d.HitObject as IHasEndTime)?.Duration ?? 0; + var fadeInTime = d.HitObject.StartTime - preEmpt; + var fadeIn = d.HitObject.StartTime - preEmpt * fade_in_speed_multiplier - fadeInTime; + var fadeOutTime = fadeInTime + fadeIn; + var fadeOut = d.HitObject.StartTime - preEmpt * fade_out_speed_multiplier - fadeOutTime; + + d.FadeIn = fadeIn; + + using (drawable.BeginAbsoluteSequence(fadeInTime)) + { + switch (drawable) + { + case DrawableHitCircle circle: + circle.ApproachCircle.FadeOut(); + circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOut, circle.HitObject.HitWindowFor(HitResult.Miss)); + + using (circle.BeginDelayedSequence(fadeIn)) + circle.FadeOut(fadeOut); + break; + case DrawableSlider slider: + slider.InitialCircle.ApplyCustomUpdateState += customSequence; + + //using (slider.BeginDelayedSequence(fadeIn)) + // slider.Body.FadeOut(duration, Easing.Out); + break; + case DrawableSpinner spinner: + spinner.Disc.FadeOut(); + spinner.Ticks.FadeOut(); + spinner.Background.FadeOut(); + break; + } + } } } @@ -57,11 +102,6 @@ namespace osu.Game.Rulesets.Osu.Mods slider.ControlPoints = newControlPoints; slider.Curve?.Calculate(); // Recalculate the slider curve } - - public void ApplyToHitObjects(RulesetContainer rulesetContainer) - { - - } } public class OsuModSuddenDeath : ModSuddenDeath @@ -102,7 +142,6 @@ namespace osu.Game.Rulesets.Osu.Mods public class OsuModPerfect : ModPerfect { - } public class OsuModSpunOut : Mod diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index a973d2b580..84ae568a1d 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -6,7 +6,6 @@ using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables.Pieces; using OpenTK; -using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Osu.Judgements; namespace osu.Game.Rulesets.Osu.Objects.Drawables @@ -48,7 +47,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }, number = new NumberPiece { - Text = h is Spinner ? "S" : (HitObject.ComboIndex + 1).ToString(), + Text = (HitObject.ComboIndex + 1).ToString(), }, ring = new RingPiece(), flash = new FlashPiece(), @@ -88,25 +87,23 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdatePreemptState(); - ApproachCircle.FadeIn(Math.Min(TIME_FADEIN * 2, TIME_PREEMPT)); + ApproachCircle.FadeIn(Math.Min(FadeIn * 2, TIME_PREEMPT)); ApproachCircle.ScaleTo(1.1f, TIME_PREEMPT); } protected override void UpdateCurrentState(ArmedState state) { - double duration = ((HitObject as IHasEndTime)?.EndTime ?? HitObject.StartTime) - HitObject.StartTime; - - glow.Delay(duration).FadeOut(400); + glow.FadeOut(400); switch (state) { case ArmedState.Idle: - this.Delay(duration + TIME_PREEMPT).FadeOut(TIME_FADEOUT); + this.Delay(TIME_PREEMPT).FadeOut(500); Expire(true); break; case ArmedState.Miss: ApproachCircle.FadeOut(50); - this.FadeOut(TIME_FADEOUT / 5); + this.FadeOut(100); Expire(); break; case ArmedState.Hit: diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index 3e0c23a1ab..a5b5fc481a 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -12,7 +12,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public const float TIME_PREEMPT = 600; public const float TIME_FADEIN = 400; - public const float TIME_FADEOUT = 500; + + /// + /// The number of milliseconds used to fade in. + /// + public double FadeIn = TIME_FADEIN; + + public override bool IsPresent => base.IsPresent || State.Value == ArmedState.Idle && Time.Current >= HitObject.StartTime - TIME_PREEMPT; protected DrawableOsuHitObject(OsuHitObject hitObject) : base(hitObject) @@ -37,10 +43,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables } } - protected virtual void UpdatePreemptState() - { - this.FadeIn(TIME_FADEIN); - } + protected virtual void UpdatePreemptState() => this.FadeIn(FadeIn); protected virtual void UpdateCurrentState(ArmedState state) { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index befe84e3e9..e5387a1ce8 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -15,25 +15,25 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSlider : DrawableOsuHitObject, IDrawableHitObjectWithProxiedApproach { - private readonly Slider slider; + public readonly Slider Slider; - private readonly DrawableHitCircle initialCircle; + public readonly DrawableHitCircle InitialCircle; private readonly List components = new List(); private readonly Container ticks; private readonly Container repeatPoints; - private readonly SliderBody body; - private readonly SliderBall ball; + public readonly SliderBody Body; + public readonly SliderBall Ball; public DrawableSlider(Slider s) : base(s) { - slider = s; + Slider = s; Children = new Drawable[] { - body = new SliderBody(s) + Body = new SliderBody(s) { AccentColour = AccentColour, Position = s.StackedPosition, @@ -41,14 +41,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }, ticks = new Container(), repeatPoints = new Container(), - ball = new SliderBall(s) + Ball = new SliderBall(s) { Scale = new Vector2(s.Scale), AccentColour = AccentColour, AlwaysPresent = true, Alpha = 0 }, - initialCircle = new DrawableHitCircle(new HitCircle + InitialCircle = new DrawableHitCircle(new HitCircle { //todo: avoid creating this temporary HitCircle. StartTime = s.StartTime, @@ -61,16 +61,16 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }) }; - components.Add(body); - components.Add(ball); + components.Add(Body); + components.Add(Ball); - AddNested(initialCircle); + AddNested(InitialCircle); var repeatDuration = s.Curve.Distance / s.Velocity; foreach (var tick in s.NestedHitObjects.OfType()) { var repeatStartTime = s.StartTime + tick.RepeatIndex * repeatDuration; - var fadeInTime = repeatStartTime + (tick.StartTime - repeatStartTime) / 2 - (tick.RepeatIndex == 0 ? TIME_FADEIN : TIME_FADEIN / 2); + var fadeInTime = repeatStartTime + (tick.StartTime - repeatStartTime) / 2 - (tick.RepeatIndex == 0 ? FadeIn : FadeIn / 2); var fadeOutTime = repeatStartTime + repeatDuration; var drawableTick = new DrawableSliderTick(tick) @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables foreach (var repeatPoint in s.NestedHitObjects.OfType()) { var repeatStartTime = s.StartTime + repeatPoint.RepeatIndex * repeatDuration; - var fadeInTime = repeatStartTime + (repeatPoint.StartTime - repeatStartTime) / 2 - (repeatPoint.RepeatIndex == 0 ? TIME_FADEIN : TIME_FADEIN / 2); + var fadeInTime = repeatStartTime + (repeatPoint.StartTime - repeatStartTime) / 2 - (repeatPoint.RepeatIndex == 0 ? FadeIn : FadeIn / 2); var fadeOutTime = repeatStartTime + repeatDuration; var drawableRepeatPoint = new DrawableRepeatPoint(repeatPoint, this) @@ -109,41 +109,41 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.Update(); - Tracking = ball.Tracking; + Tracking = Ball.Tracking; - double progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1); + double progress = MathHelper.Clamp((Time.Current - Slider.StartTime) / Slider.Duration, 0, 1); - int repeat = slider.RepeatAt(progress); - progress = slider.ProgressAt(progress); + int repeat = Slider.RepeatAt(progress); + progress = Slider.ProgressAt(progress); if (repeat > currentRepeat) { - if (repeat < slider.RepeatCount && ball.Tracking) + if (repeat < Slider.RepeatCount && Ball.Tracking) PlaySamples(); currentRepeat = repeat; } //todo: we probably want to reconsider this before adding scoring, but it looks and feels nice. - if (!initialCircle.Judgements.Any(j => j.IsHit)) - initialCircle.Position = slider.Curve.PositionAt(progress); + if (!InitialCircle.Judgements.Any(j => j.IsHit)) + InitialCircle.Position = Slider.Curve.PositionAt(progress); foreach (var c in components) c.UpdateProgress(progress, repeat); - foreach (var t in ticks.Children) t.Tracking = ball.Tracking; + foreach (var t in ticks.Children) t.Tracking = Ball.Tracking; } protected override void CheckForJudgements(bool userTriggered, double timeOffset) { - if (!userTriggered && Time.Current >= slider.EndTime) + if (!userTriggered && Time.Current >= Slider.EndTime) { var judgementsCount = ticks.Children.Count + repeatPoints.Children.Count + 1; var judgementsHit = ticks.Children.Count(t => t.Judgements.Any(j => j.IsHit)) + repeatPoints.Children.Count(t => t.Judgements.Any(j => j.IsHit)); - if (initialCircle.Judgements.Any(j => j.IsHit)) + if (InitialCircle.Judgements.Any(j => j.IsHit)) judgementsHit++; var hitFraction = (double)judgementsHit / judgementsCount; - if (hitFraction == 1 && initialCircle.Judgements.Any(j => j.Result == HitResult.Great)) + if (hitFraction == 1 && InitialCircle.Judgements.Any(j => j.Result == HitResult.Great)) AddJudgement(new OsuJudgement { Result = HitResult.Great }); - else if (hitFraction >= 0.5 && initialCircle.Judgements.Any(j => j.Result >= HitResult.Good)) + else if (hitFraction >= 0.5 && InitialCircle.Judgements.Any(j => j.Result >= HitResult.Good)) AddJudgement(new OsuJudgement { Result = HitResult.Good }); else if (hitFraction > 0) AddJudgement(new OsuJudgement { Result = HitResult.Meh }); @@ -154,22 +154,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables protected override void UpdateCurrentState(ArmedState state) { - ball.FadeIn(); + Ball.FadeIn(); - using (BeginDelayedSequence(slider.Duration, true)) + using (BeginDelayedSequence(Slider.Duration, true)) { - body.FadeOut(160); - ball.FadeOut(160); + Body.FadeOut(160); + Ball.FadeOut(160); this.FadeOut(800) .Expire(); } } - public Drawable ProxiedLayer => initialCircle.ApproachCircle; + public Drawable ProxiedLayer => InitialCircle.ApproachCircle; - public override Vector2 SelectionPoint => ToScreenSpace(body.Position); - public override Quad SelectionQuad => body.PathDrawQuad; + public override Vector2 SelectionPoint => ToScreenSpace(Body.Position); + public override Quad SelectionQuad => Body.PathDrawQuad; } internal interface ISliderProgress diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 054a2067ec..9e80e3ccd1 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -20,13 +20,13 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { private readonly Spinner spinner; - private readonly SpinnerDisc disc; - private readonly SpinnerTicks ticks; + public readonly SpinnerDisc Disc; + public readonly SpinnerTicks Ticks; private readonly SpinnerSpmCounter spmCounter; private readonly Container mainContainer; - private readonly SpinnerBackground background; + public readonly SpinnerBackground Background; private readonly Container circleContainer; private readonly CirclePiece circle; private readonly GlowPiece glow; @@ -84,20 +84,20 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables RelativeSizeAxes = Axes.Y, Children = new Drawable[] { - background = new SpinnerBackground + Background = new SpinnerBackground { Alpha = 0.6f, Anchor = Anchor.Centre, Origin = Anchor.Centre, }, - disc = new SpinnerDisc(spinner) + Disc = new SpinnerDisc(spinner) { Scale = Vector2.Zero, Anchor = Anchor.Centre, Origin = Anchor.Centre, }, circleContainer.CreateProxy(), - ticks = new SpinnerTicks + Ticks = new SpinnerTicks { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -114,22 +114,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }; } - public float Progress => MathHelper.Clamp(disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); + public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); protected override void CheckForJudgements(bool userTriggered, double timeOffset) { if (Time.Current < HitObject.StartTime) return; - if (Progress >= 1 && !disc.Complete) + if (Progress >= 1 && !Disc.Complete) { - disc.Complete = true; + Disc.Complete = true; const float duration = 200; - disc.FadeAccent(completeColour, duration); + Disc.FadeAccent(completeColour, duration); - background.FadeAccent(completeColour, duration); - background.FadeOut(duration); + Background.FadeAccent(completeColour, duration); + Background.FadeOut(duration); circle.FadeColour(completeColour, duration); glow.FadeColour(completeColour, duration); @@ -153,20 +153,20 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { normalColour = baseColour; - background.AccentColour = normalColour; + Background.AccentColour = normalColour; completeColour = colours.YellowLight.Opacity(0.75f); - disc.AccentColour = fillColour; + Disc.AccentColour = fillColour; circle.Colour = colours.BlueDark; glow.Colour = colours.BlueDark; } protected override void Update() { - disc.Tracking = OsuActionInputManager.PressedActions.Any(x => x == OsuAction.LeftButton || x == OsuAction.RightButton); - if (!spmCounter.IsPresent && disc.Tracking) - spmCounter.FadeIn(TIME_FADEIN); + Disc.Tracking = OsuActionInputManager.PressedActions.Any(x => x == OsuAction.LeftButton || x == OsuAction.RightButton); + if (!spmCounter.IsPresent && Disc.Tracking) + spmCounter.FadeIn(FadeIn); base.Update(); } @@ -175,14 +175,14 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdateAfterChildren(); - circle.Rotation = disc.Rotation; - ticks.Rotation = disc.Rotation; - spmCounter.SetRotation(disc.RotationAbsolute); + circle.Rotation = Disc.Rotation; + Ticks.Rotation = Disc.Rotation; + spmCounter.SetRotation(Disc.RotationAbsolute); float relativeCircleScale = spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; - disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint); + Disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint); - symbol.RotateTo(disc.Rotation / 2, 500, Easing.OutQuint); + symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint); } protected override void UpdatePreemptState() @@ -192,7 +192,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables circleContainer.ScaleTo(spinner.Scale * 0.3f); circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); - disc.RotateTo(-720); + Disc.RotateTo(-720); symbol.RotateTo(-720); mainContainer diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs index ca75a61738..9f54ce3fa3 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/Pieces/SpinnerDisc.cs @@ -26,6 +26,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables.Pieces private const float idle_alpha = 0.2f; private const float tracking_alpha = 0.4f; + public override bool IsPresent => true; // handle input when hidden + public SpinnerDisc(Spinner s) { spinner = s; diff --git a/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs index 2751e36a25..1024d5686d 100644 --- a/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs +++ b/osu.Game/Rulesets/Mods/IApplicableToDrawableHitObject.cs @@ -1,11 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using osu.Game.Rulesets.Objects.Drawables; namespace osu.Game.Rulesets.Mods diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index ab4c04be3f..ca5326f35e 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -119,6 +119,9 @@ namespace osu.Game.Rulesets.Objects.Drawables { UpdateState(state); + // apply any custom state overrides + ApplyCustomUpdateState?.Invoke(this, state); + if (State == ArmedState.Hit) PlaySamples(); }; @@ -243,6 +246,11 @@ namespace osu.Game.Rulesets.Objects.Drawables nestedHitObjects.Add(h); } + /// + /// Bind to apply a custom state which can override the default implementation. + /// + public event Action ApplyCustomUpdateState; + protected abstract void UpdateState(ArmedState state); } } diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index b5f93123fd..a5d60f80f6 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -310,6 +310,7 @@ + From 7d29c076d2eed3d70c1f55aad4c479a0eea4871c Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Wed, 27 Dec 2017 21:12:02 +0100 Subject: [PATCH 08/64] fix circles and slider sequences + minor cleanup --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 21 ++++++++++++------- .../UI/OsuRulesetContainer.cs | 9 +++----- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 6b8f30eaec..8c8e8e7d3a 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -48,7 +48,6 @@ namespace osu.Game.Rulesets.Osu.Mods if (!(drawable is DrawableOsuHitObject d)) return; - //var duration = (d.HitObject as IHasEndTime)?.Duration ?? 0; var fadeInTime = d.HitObject.StartTime - preEmpt; var fadeIn = d.HitObject.StartTime - preEmpt * fade_in_speed_multiplier - fadeInTime; var fadeOutTime = fadeInTime + fadeIn; @@ -56,22 +55,30 @@ namespace osu.Game.Rulesets.Osu.Mods d.FadeIn = fadeIn; - using (drawable.BeginAbsoluteSequence(fadeInTime)) + using (drawable.BeginAbsoluteSequence(fadeInTime, true)) { switch (drawable) { case DrawableHitCircle circle: circle.ApproachCircle.FadeOut(); + // prolong the hitcircle long enough so misses are still possible circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOut, circle.HitObject.HitWindowFor(HitResult.Miss)); - - using (circle.BeginDelayedSequence(fadeIn)) - circle.FadeOut(fadeOut); + circle.FadeIn(fadeIn).Then().FadeOut(fadeOut); // override fade in as it somehow gets cut otherwise break; case DrawableSlider slider: slider.InitialCircle.ApplyCustomUpdateState += customSequence; - //using (slider.BeginDelayedSequence(fadeIn)) - // slider.Body.FadeOut(duration, Easing.Out); + using (slider.BeginAbsoluteSequence(fadeOutTime, true)) + { + var duration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider + slider.Body.FadeOut(duration); + // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut + using (slider.BeginDelayedSequence(duration - fadeOut, true)) + { + slider.Ball.FadeOut(fadeOut); + slider.Delay(fadeOut).Expire(); + } + } break; case DrawableSpinner spinner: spinner.Disc.FadeOut(); diff --git a/osu.Game.Rulesets.Osu/UI/OsuRulesetContainer.cs b/osu.Game.Rulesets.Osu/UI/OsuRulesetContainer.cs index 7c9cbd63fc..f37b87e533 100644 --- a/osu.Game.Rulesets.Osu/UI/OsuRulesetContainer.cs +++ b/osu.Game.Rulesets.Osu/UI/OsuRulesetContainer.cs @@ -35,16 +35,13 @@ namespace osu.Game.Rulesets.Osu.UI protected override DrawableHitObject GetVisualRepresentation(OsuHitObject h) { - var circle = h as HitCircle; - if (circle != null) + if (h is HitCircle circle) return new DrawableHitCircle(circle); - var slider = h as Slider; - if (slider != null) + if (h is Slider slider) return new DrawableSlider(slider); - var spinner = h as Spinner; - if (spinner != null) + if (h is Spinner spinner) return new DrawableSpinner(spinner); return null; } From e42fa7205b7f160376ebdffcd498abefb5e0a838 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Wed, 27 Dec 2017 21:23:56 +0100 Subject: [PATCH 09/64] adjust spinner sequence to the new fadeout speed --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 23 ++++++++++++++++--- .../Objects/Drawables/DrawableSpinner.cs | 22 +++++++++--------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 8c8e8e7d3a..318ccab2f1 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -70,10 +70,10 @@ namespace osu.Game.Rulesets.Osu.Mods using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { - var duration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider - slider.Body.FadeOut(duration); + var sliderDuration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider + slider.Body.FadeOut(sliderDuration); // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(duration - fadeOut, true)) + using (slider.BeginDelayedSequence(sliderDuration - fadeOut, true)) { slider.Ball.FadeOut(fadeOut); slider.Delay(fadeOut).Expire(); @@ -84,6 +84,23 @@ namespace osu.Game.Rulesets.Osu.Mods spinner.Disc.FadeOut(); spinner.Ticks.FadeOut(); spinner.Background.FadeOut(); + + using (spinner.BeginAbsoluteSequence(fadeOutTime, true)) + { + var spinnerDuration = spinner.Spinner.EndTime - fadeOutTime; // new duration from fade in to end of the spinner + var sequence = spinner.Delay(spinnerDuration).FadeOut(fadeOut); + // speed up the end sequence accordingly + switch (state) + { + case ArmedState.Hit: + sequence.ScaleTo(spinner.Scale * 1.2f, fadeOut * 2, Easing.Out); + break; + case ArmedState.Miss: + sequence.ScaleTo(spinner.Scale * 0.8f, fadeOut * 2, Easing.Out); + break; + } + sequence.Expire(); + } break; } } diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 9e80e3ccd1..57aa0f2c09 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSpinner : DrawableOsuHitObject { - private readonly Spinner spinner; + public readonly Spinner Spinner; public readonly SpinnerDisc Disc; public readonly SpinnerTicks Ticks; @@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables // we are slightly bigger than our parent, to clip the top and bottom of the circle Height = 1.3f; - spinner = s; + Spinner = s; Children = new Drawable[] { @@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Anchor = Anchor.Centre, Origin = Anchor.Centre, }, - Disc = new SpinnerDisc(spinner) + Disc = new SpinnerDisc(Spinner) { Scale = Vector2.Zero, Anchor = Anchor.Centre, @@ -114,7 +114,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }; } - public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); + public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / Spinner.SpinsRequired, 0, 1); protected override void CheckForJudgements(bool userTriggered, double timeOffset) { @@ -135,7 +135,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables glow.FadeColour(completeColour, duration); } - if (!userTriggered && Time.Current >= spinner.EndTime) + if (!userTriggered && Time.Current >= Spinner.EndTime) { if (Progress >= 1) AddJudgement(new OsuJudgement { Result = HitResult.Great }); @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables AddJudgement(new OsuJudgement { Result = HitResult.Good }); else if (Progress > .75) AddJudgement(new OsuJudgement { Result = HitResult.Meh }); - else if (Time.Current >= spinner.EndTime) + else if (Time.Current >= Spinner.EndTime) AddJudgement(new OsuJudgement { Result = HitResult.Miss }); } } @@ -179,7 +179,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Ticks.Rotation = Disc.Rotation; spmCounter.SetRotation(Disc.RotationAbsolute); - float relativeCircleScale = spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; + float relativeCircleScale = Spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; Disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint); symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint); @@ -189,22 +189,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdatePreemptState(); - circleContainer.ScaleTo(spinner.Scale * 0.3f); - circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); + circleContainer.ScaleTo(Spinner.Scale * 0.3f); + circleContainer.ScaleTo(Spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); Disc.RotateTo(-720); symbol.RotateTo(-720); mainContainer .ScaleTo(0) - .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) + .ScaleTo(Spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) .Then() .ScaleTo(1, 500, Easing.OutQuint); } protected override void UpdateCurrentState(ArmedState state) { - var sequence = this.Delay(spinner.Duration).FadeOut(160); + var sequence = this.Delay(Spinner.Duration).FadeOut(160); switch (state) { From 4c3b4dc5bbf204d6f52423d482f0d4ffd5a4892a Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Wed, 27 Dec 2017 21:26:11 +0100 Subject: [PATCH 10/64] Updated submodule osu-framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 08f85f9bf9..10cae790c6 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 08f85f9bf9a7376aec8dfcde8c7c96d267d8c295 +Subproject commit 10cae790c6f1d559c326f9438958d0b012d61dc6 From 5b735a07c28c0264465c61f51b4406e2e83950ef Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Wed, 27 Dec 2017 21:48:41 +0100 Subject: [PATCH 11/64] Updated submodule osu-resources --- osu-resources | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-resources b/osu-resources index 4287ee8043..e01f71160f 160000 --- a/osu-resources +++ b/osu-resources @@ -1 +1 @@ -Subproject commit 4287ee8043fb1419017359bc3a5db5dc06bc643f +Subproject commit e01f71160fb9b3167efcd177c7d7dba9e5d36604 From 7250d2e6ca9ffce02846e4eec956e9fa0c1fd575 Mon Sep 17 00:00:00 2001 From: kiroma Date: Thu, 28 Dec 2017 00:49:15 +0100 Subject: [PATCH 12/64] Create a compilation guide --- COMPILING.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 COMPILING.md diff --git a/COMPILING.md b/COMPILING.md new file mode 100644 index 0000000000..8f717520ee --- /dev/null +++ b/COMPILING.md @@ -0,0 +1,40 @@ +# Linux +### 1. Requirements: +Mono >= 5.4.0 (>= 5.8.0 recommended) +Please check [here](http://www.mono-project.com/download/) for stable or [here](http://www.mono-project.com/download/alpha/) for an alpha release. +NuGet >= 4.4.0 +msbuild +git + +### 2. Cloning project +Clone the entire repository with submodules using +``` +git clone https://github.com/ppy/osu --recursive +``` +Then restore NuGet packages from the repository +``` +nuget restore +``` +We also need OpenTK >= 3.0.0-pre +``` +nuget install opentk -version=3.0.0-pre +``` +### 3. Compiling +Simply run `msbuild` where `osu.sln` is located, this will create all binaries in `osu/osu.Desktop/bin/Debug`. +### 4. Optimizing +If you want additional performance you can change build type to Release with +``` +msbuild -p:Configuration=Release +``` +Additionally, mono provides an AOT utility which attempts to precompile binaries. You can utilize that by running +``` +mono --aot ./osu\!.exe +``` +### 5. Troubleshooting +You may run into trouble with NuGet versioning, as the one in packaging system is almost always out of date. Simply run +``` +nuget +sudo nuget update -self +``` +**Warning** NuGet creates few config files when it's run for the first time. +Do not run NuGet as root on the first run or you might run into very peculiar issues. From e0f23a056ab838af5dde01e9b247bc3306779eef Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 28 Dec 2017 21:07:19 +0900 Subject: [PATCH 13/64] Fix crash from being able to perform selection after entering play mode Closes #1757 --- .../Select/Carousel/DrawableCarouselBeatmap.cs | 2 +- osu.Game/Screens/Select/EditSongSelect.cs | 6 +++++- osu.Game/Screens/Select/MatchSongSelect.cs | 6 +++++- osu.Game/Screens/Select/PlaySongSelect.cs | 11 ++++++++--- osu.Game/Screens/Select/SongSelect.cs | 18 ++++++++++++------ 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs index 6c0cc341fd..cea658b06c 100644 --- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs +++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmap.cs @@ -46,7 +46,7 @@ namespace osu.Game.Screens.Select.Carousel { if (songSelect != null) { - startRequested = songSelect.Start; + startRequested = songSelect.FinaliseSelection; editRequested = songSelect.Edit; } diff --git a/osu.Game/Screens/Select/EditSongSelect.cs b/osu.Game/Screens/Select/EditSongSelect.cs index f02d25501e..37f2663d91 100644 --- a/osu.Game/Screens/Select/EditSongSelect.cs +++ b/osu.Game/Screens/Select/EditSongSelect.cs @@ -7,6 +7,10 @@ namespace osu.Game.Screens.Select { protected override bool ShowFooter => false; - protected override void Start() => Exit(); + protected override bool OnSelectionFinalised() + { + Exit(); + return true; + } } } diff --git a/osu.Game/Screens/Select/MatchSongSelect.cs b/osu.Game/Screens/Select/MatchSongSelect.cs index 898c195432..9143da326d 100644 --- a/osu.Game/Screens/Select/MatchSongSelect.cs +++ b/osu.Game/Screens/Select/MatchSongSelect.cs @@ -5,6 +5,10 @@ namespace osu.Game.Screens.Select { public class MatchSongSelect : SongSelect { - protected override void Start() => Exit(); + protected override bool OnSelectionFinalised() + { + Exit(); + return true; + } } } diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 727cdb9959..87b3485dc1 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -124,9 +124,9 @@ namespace osu.Game.Screens.Select return false; } - protected override void Start() + protected override bool OnSelectionFinalised() { - if (player != null) return; + if (player != null) return false; // Ctrl+Enter should start map with autoplay enabled. if (GetContainingInputManager().CurrentState?.Keyboard.ControlPressed == true) @@ -147,7 +147,12 @@ namespace osu.Game.Screens.Select sampleConfirm?.Play(); - LoadComponentAsync(player = new PlayerLoader(new Player()), l => Push(player)); + LoadComponentAsync(player = new PlayerLoader(new Player()), l => + { + if (IsCurrentScreen) Push(player); + }); + + return true; } } } diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs index 9e5a2fa633..b89a8a4e73 100644 --- a/osu.Game/Screens/Select/SongSelect.cs +++ b/osu.Game/Screens/Select/SongSelect.cs @@ -227,13 +227,18 @@ namespace osu.Game.Screens.Select Push(new Editor()); } - public void Start(BeatmapInfo beatmap) + /// + /// Call to make a selection and perform the default action for this SongSelect. + /// + /// An optional beatmap to override the current carousel selection. + public void FinaliseSelection(BeatmapInfo beatmap = null) { // if we have a pending filter operation, we want to run it now. // it could change selection (ie. if the ruleset has been changed). Carousel.FlushPendingFilterOperations(); - Carousel.SelectBeatmap(beatmap); + if (beatmap != null) + Carousel.SelectBeatmap(beatmap); if (selectionChangedDebounce?.Completed == false) { @@ -242,13 +247,14 @@ namespace osu.Game.Screens.Select selectionChangedDebounce = null; } - Start(); + OnSelectionFinalised(); } /// /// Called when a selection is made. /// - protected abstract void Start(); + /// If a resultant action occurred that takes the user away from SongSelect. + protected abstract bool OnSelectionFinalised(); private ScheduledDelegate selectionChangedDebounce; @@ -339,7 +345,7 @@ namespace osu.Game.Screens.Select logo.Action = () => { - Start(); + FinaliseSelection(); return false; }; } @@ -462,7 +468,7 @@ namespace osu.Game.Screens.Select { case Key.KeypadEnter: case Key.Enter: - Start(); + FinaliseSelection(); return true; case Key.Delete: if (state.Keyboard.ShiftPressed) From 0cea0185767d71d7a94538c9127d2fb49ef158d4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 28 Dec 2017 21:23:59 +0900 Subject: [PATCH 14/64] Use a more suiting (?) icon for import dialog Closes #1763. --- osu.Game/Screens/Select/ImportFromStablePopup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Select/ImportFromStablePopup.cs b/osu.Game/Screens/Select/ImportFromStablePopup.cs index 489ab79fa4..03e9462636 100644 --- a/osu.Game/Screens/Select/ImportFromStablePopup.cs +++ b/osu.Game/Screens/Select/ImportFromStablePopup.cs @@ -14,7 +14,7 @@ namespace osu.Game.Screens.Select HeaderText = @"You have no beatmaps!"; BodyText = "An existing copy of osu! was found, though.\nWould you like to import your beatmaps?"; - Icon = FontAwesome.fa_trash_o; + Icon = FontAwesome.fa_plane; Buttons = new PopupDialogButton[] { From 379d488160c7bb3ef150e24731086d0001af9906 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 28 Dec 2017 21:54:34 +0900 Subject: [PATCH 15/64] Update framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 10cae790c6..293b156697 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 10cae790c6f1d559c326f9438958d0b012d61dc6 +Subproject commit 293b1566971963202986d781f23df4ac1a6e8f20 From 2669974bff052a75d6502a6dcd92d3eed29a93d0 Mon Sep 17 00:00:00 2001 From: kiroma Date: Thu, 28 Dec 2017 15:25:54 +0100 Subject: [PATCH 16/64] Update COMPILING.md NuGet - 10/10 would use again --- COMPILING.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/COMPILING.md b/COMPILING.md index 8f717520ee..bfcbf6bc2c 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -15,10 +15,6 @@ Then restore NuGet packages from the repository ``` nuget restore ``` -We also need OpenTK >= 3.0.0-pre -``` -nuget install opentk -version=3.0.0-pre -``` ### 3. Compiling Simply run `msbuild` where `osu.sln` is located, this will create all binaries in `osu/osu.Desktop/bin/Debug`. ### 4. Optimizing From 0b23ceb7815d3e26b175de600ab7aa76b80cbcc5 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Thu, 28 Dec 2017 15:36:27 +0100 Subject: [PATCH 17/64] fix slider fade out to be eased + move duration calculation to not be done twice + made Slider / Spinner private again as they are not accessed externally anymore --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 12 +++++----- .../Objects/Drawables/DrawableSlider.cs | 16 +++++++------- .../Objects/Drawables/DrawableSpinner.cs | 22 +++++++++---------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 318ccab2f1..e8d98aebf3 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -15,6 +15,7 @@ using OpenTK; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Framework.Graphics; +using osu.Game.Rulesets.Objects.Types; namespace osu.Game.Rulesets.Osu.Mods { @@ -53,6 +54,9 @@ namespace osu.Game.Rulesets.Osu.Mods var fadeOutTime = fadeInTime + fadeIn; var fadeOut = d.HitObject.StartTime - preEmpt * fade_out_speed_multiplier - fadeOutTime; + // new duration from completed fade in to end (before fading out) + var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutTime; + d.FadeIn = fadeIn; using (drawable.BeginAbsoluteSequence(fadeInTime, true)) @@ -70,10 +74,9 @@ namespace osu.Game.Rulesets.Osu.Mods using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { - var sliderDuration = slider.Slider.EndTime - fadeOutTime; // new duration from fade in to end of the slider - slider.Body.FadeOut(sliderDuration); + slider.Body.FadeOut(newDuration, Easing.Out); // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(sliderDuration - fadeOut, true)) + using (slider.BeginDelayedSequence(newDuration - fadeOut, true)) { slider.Ball.FadeOut(fadeOut); slider.Delay(fadeOut).Expire(); @@ -87,8 +90,7 @@ namespace osu.Game.Rulesets.Osu.Mods using (spinner.BeginAbsoluteSequence(fadeOutTime, true)) { - var spinnerDuration = spinner.Spinner.EndTime - fadeOutTime; // new duration from fade in to end of the spinner - var sequence = spinner.Delay(spinnerDuration).FadeOut(fadeOut); + var sequence = spinner.Delay(newDuration).FadeOut(fadeOut); // speed up the end sequence accordingly switch (state) { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 6beb430895..75fa3e0f01 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSlider : DrawableOsuHitObject, IDrawableHitObjectWithProxiedApproach { - public readonly Slider Slider; + private readonly Slider slider; public readonly DrawableHitCircle InitialCircle; @@ -29,7 +29,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables public DrawableSlider(Slider s) : base(s) { - Slider = s; + slider = s; Children = new Drawable[] { @@ -111,17 +111,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Tracking = Ball.Tracking; - double progress = MathHelper.Clamp((Time.Current - Slider.StartTime) / Slider.Duration, 0, 1); + double progress = MathHelper.Clamp((Time.Current - slider.StartTime) / slider.Duration, 0, 1); - int repeat = Slider.RepeatAt(progress); - progress = Slider.ProgressAt(progress); + int repeat = slider.RepeatAt(progress); + progress = slider.ProgressAt(progress); if (repeat > currentRepeat) currentRepeat = repeat; //todo: we probably want to reconsider this before adding scoring, but it looks and feels nice. if (!InitialCircle.Judgements.Any(j => j.IsHit)) - InitialCircle.Position = Slider.Curve.PositionAt(progress); + InitialCircle.Position = slider.Curve.PositionAt(progress); foreach (var c in components) c.UpdateProgress(progress, repeat); foreach (var t in ticks.Children) t.Tracking = Ball.Tracking; @@ -129,7 +129,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables protected override void CheckForJudgements(bool userTriggered, double timeOffset) { - if (!userTriggered && Time.Current >= Slider.EndTime) + if (!userTriggered && Time.Current >= slider.EndTime) { var judgementsCount = ticks.Children.Count + repeatPoints.Children.Count + 1; var judgementsHit = ticks.Children.Count(t => t.Judgements.Any(j => j.IsHit)) + repeatPoints.Children.Count(t => t.Judgements.Any(j => j.IsHit)); @@ -152,7 +152,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { Ball.FadeIn(); - using (BeginDelayedSequence(Slider.Duration, true)) + using (BeginDelayedSequence(slider.Duration, true)) { Body.FadeOut(160); Ball.FadeOut(160); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 57aa0f2c09..9e80e3ccd1 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { public class DrawableSpinner : DrawableOsuHitObject { - public readonly Spinner Spinner; + private readonly Spinner spinner; public readonly SpinnerDisc Disc; public readonly SpinnerTicks Ticks; @@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables // we are slightly bigger than our parent, to clip the top and bottom of the circle Height = 1.3f; - Spinner = s; + spinner = s; Children = new Drawable[] { @@ -90,7 +90,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Anchor = Anchor.Centre, Origin = Anchor.Centre, }, - Disc = new SpinnerDisc(Spinner) + Disc = new SpinnerDisc(spinner) { Scale = Vector2.Zero, Anchor = Anchor.Centre, @@ -114,7 +114,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }; } - public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / Spinner.SpinsRequired, 0, 1); + public float Progress => MathHelper.Clamp(Disc.RotationAbsolute / 360 / spinner.SpinsRequired, 0, 1); protected override void CheckForJudgements(bool userTriggered, double timeOffset) { @@ -135,7 +135,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables glow.FadeColour(completeColour, duration); } - if (!userTriggered && Time.Current >= Spinner.EndTime) + if (!userTriggered && Time.Current >= spinner.EndTime) { if (Progress >= 1) AddJudgement(new OsuJudgement { Result = HitResult.Great }); @@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables AddJudgement(new OsuJudgement { Result = HitResult.Good }); else if (Progress > .75) AddJudgement(new OsuJudgement { Result = HitResult.Meh }); - else if (Time.Current >= Spinner.EndTime) + else if (Time.Current >= spinner.EndTime) AddJudgement(new OsuJudgement { Result = HitResult.Miss }); } } @@ -179,7 +179,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Ticks.Rotation = Disc.Rotation; spmCounter.SetRotation(Disc.RotationAbsolute); - float relativeCircleScale = Spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; + float relativeCircleScale = spinner.Scale * circle.DrawHeight / mainContainer.DrawHeight; Disc.ScaleTo(relativeCircleScale + (1 - relativeCircleScale) * Progress, 200, Easing.OutQuint); symbol.RotateTo(Disc.Rotation / 2, 500, Easing.OutQuint); @@ -189,22 +189,22 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdatePreemptState(); - circleContainer.ScaleTo(Spinner.Scale * 0.3f); - circleContainer.ScaleTo(Spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); + circleContainer.ScaleTo(spinner.Scale * 0.3f); + circleContainer.ScaleTo(spinner.Scale, TIME_PREEMPT / 1.4f, Easing.OutQuint); Disc.RotateTo(-720); symbol.RotateTo(-720); mainContainer .ScaleTo(0) - .ScaleTo(Spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) + .ScaleTo(spinner.Scale * circle.DrawHeight / DrawHeight * 1.4f, TIME_PREEMPT - 150, Easing.OutQuint) .Then() .ScaleTo(1, 500, Easing.OutQuint); } protected override void UpdateCurrentState(ArmedState state) { - var sequence = this.Delay(Spinner.Duration).FadeOut(160); + var sequence = this.Delay(spinner.Duration).FadeOut(160); switch (state) { From cd237da6d39fb2f846e2b575e8bde7230ca02612 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Thu, 28 Dec 2017 17:06:15 +0100 Subject: [PATCH 18/64] extend TestCaseHitCircle with new steps - Hidden, Size and Scale - also fix Auto still missing because no judgement was created --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 6 +-- .../Tests/TestCaseHitCircle.cs | 48 +++++++++++++++++-- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index e8d98aebf3..77ce7235ee 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -41,10 +41,10 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObjects(IEnumerable drawables) { foreach (var d in drawables.OfType()) - d.ApplyCustomUpdateState += customSequence; + d.ApplyCustomUpdateState += CustomSequence; } - private void customSequence(DrawableHitObject drawable, ArmedState state) + protected void CustomSequence(DrawableHitObject drawable, ArmedState state) { if (!(drawable is DrawableOsuHitObject d)) return; @@ -70,7 +70,7 @@ namespace osu.Game.Rulesets.Osu.Mods circle.FadeIn(fadeIn).Then().FadeOut(fadeOut); // override fade in as it somehow gets cut otherwise break; case DrawableSlider slider: - slider.InitialCircle.ApplyCustomUpdateState += customSequence; + slider.InitialCircle.ApplyCustomUpdateState += CustomSequence; using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index ef0bffa14e..3e5201efc7 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -11,6 +11,9 @@ using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Tests.Visual; using OpenTK; +using osu.Game.Rulesets.Osu.Mods; +using OpenTK.Graphics; +using osu.Game.Rulesets.Osu.Judgements; namespace osu.Game.Rulesets.Osu.Tests { @@ -21,7 +24,10 @@ namespace osu.Game.Rulesets.Osu.Tests protected override Container Content => content; private bool auto; + private bool hidden; private int depthIndex; + private int circleSize; + private float circleScale; public TestCaseHitCircle() { @@ -30,6 +36,9 @@ namespace osu.Game.Rulesets.Osu.Tests AddStep("Single", () => addSingle()); AddStep("Stream", addStream); AddToggleStep("Auto", v => auto = v); + AddToggleStep("Hidden", v => hidden = v); + AddSliderStep("CircleSize", 0, 10, 0, s => circleSize = s); + AddSliderStep("CircleScale", 0.5f, 2, 1, s => circleScale = s); } private void addSingle(double timeOffset = 0, Vector2? positionOffset = null) @@ -39,20 +48,25 @@ namespace osu.Game.Rulesets.Osu.Tests var circle = new HitCircle { StartTime = Time.Current + 1000 + timeOffset, - Position = positionOffset.Value + Position = positionOffset.Value, + ComboColour = Color4.LightSeaGreen }; - circle.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = 0 }); + circle.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = circleSize }); - var drawable = new DrawableHitCircle(circle) + var drawable = new TestDrawableHitCircle(circle, auto) { Anchor = Anchor.Centre, + Scale = new Vector2(circleScale), Depth = depthIndex++ }; if (auto) drawable.State.Value = ArmedState.Hit; + if (hidden) + drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + Add(drawable); } @@ -66,5 +80,33 @@ namespace osu.Game.Rulesets.Osu.Tests pos += new Vector2(10); } } + + private class TestOsuModHidden : OsuModHidden + { + public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); + } + + private class TestDrawableHitCircle : DrawableHitCircle + { + private readonly bool auto; + + public TestDrawableHitCircle(OsuHitObject h, bool auto) : base(h) + { + this.auto = auto; + } + + protected override void CheckForJudgements(bool userTriggered, double timeOffset) + { + if (auto && !userTriggered && timeOffset > 0) + { + // pretend we really hit it + AddJudgement(new OsuJudgement + { + Result = HitObject.ScoreResultForOffset(timeOffset) + }); + } + base.CheckForJudgements(userTriggered, timeOffset); + } + } } } From 8d5f4d4f19f6d71d97892d717baa5abb38b67d6a Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Thu, 28 Dec 2017 18:09:35 +0100 Subject: [PATCH 19/64] extend TestCaseSlider with new steps - Hidden, Size and Scale - made Repeats an SliderStep instead --- .../Tests/TestCaseHitCircle.cs | 10 +-- osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 86 +++++++++++-------- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index 3e5201efc7..babe39c41d 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -33,15 +33,15 @@ namespace osu.Game.Rulesets.Osu.Tests { base.Content.Add(content = new OsuInputManager(new RulesetInfo { ID = 0 })); - AddStep("Single", () => addSingle()); - AddStep("Stream", addStream); + AddStep("Single", () => testSingle()); + AddStep("Stream", testStream); AddToggleStep("Auto", v => auto = v); AddToggleStep("Hidden", v => hidden = v); AddSliderStep("CircleSize", 0, 10, 0, s => circleSize = s); AddSliderStep("CircleScale", 0.5f, 2, 1, s => circleScale = s); } - private void addSingle(double timeOffset = 0, Vector2? positionOffset = null) + private void testSingle(double timeOffset = 0, Vector2? positionOffset = null) { positionOffset = positionOffset ?? Vector2.Zero; @@ -70,13 +70,13 @@ namespace osu.Game.Rulesets.Osu.Tests Add(drawable); } - private void addStream() + private void testStream() { Vector2 pos = Vector2.Zero; for (int i = 0; i <= 1000; i += 100) { - addSingle(i, pos); + testSingle(i, pos); pos += new Vector2(10); } } diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 7ce9c35bd5..224e2ea3ef 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -13,6 +13,8 @@ using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Tests.Visual; using OpenTK; +using osu.Game.Rulesets.Osu.Mods; +using osu.Game.Rulesets.Objects.Drawables; namespace osu.Game.Rulesets.Osu.Tests { @@ -24,26 +26,30 @@ namespace osu.Game.Rulesets.Osu.Tests private readonly Container content; protected override Container Content => content; + private bool hidden; + private int repeats; + private int depthIndex; + private int circleSize; + private float circleScale; private double speedMultiplier = 2; private double sliderMultiplier = 2; - private int depthIndex; public TestCaseSlider() { base.Content.Add(content = new OsuInputManager(new RulesetInfo { ID = 0 })); - AddStep("Single", () => addSingle()); - AddStep("Repeated (1)", () => addRepeated(1)); - AddStep("Repeated (2)", () => addRepeated(2)); - AddStep("Repeated (3)", () => addRepeated(3)); - AddStep("Repeated (4)", () => addRepeated(4)); - AddStep("Stream", addStream); - - AddSliderStep("SpeedMultiplier", 0.01, 10, 2, s => speedMultiplier = s); - AddSliderStep("SliderMultiplier", 0.01, 10, 2, s => sliderMultiplier = s); + AddStep("Single", () => testSingle()); + AddStep("Stream", testStream); + AddStep("Repeated", () => testRepeated(repeats)); + AddToggleStep("Hidden", v => hidden = v); + AddSliderStep("Repeats", 1, 10, 1, s => repeats = s); + AddSliderStep("CircleSize", 0, 10, 0, s => circleSize = s); + AddSliderStep("CircleScale", 0.5f, 2, 1, s => circleScale = s); + AddSliderStep("SpeedMultiplier", 0.1, 10, 2, s => speedMultiplier = s); + AddSliderStep("SliderMultiplier", 0.1, 10, 2, s => sliderMultiplier = s); } - private void addSingle(double timeOffset = 0, Vector2? positionOffset = null) + private void testSingle(double timeOffset = 0, Vector2? positionOffset = null) { positionOffset = positionOffset ?? Vector2.Zero; @@ -59,24 +65,10 @@ namespace osu.Game.Rulesets.Osu.Tests Distance = 400, }; - var cpi = new ControlPointInfo(); - cpi.DifficultyPoints.Add(new DifficultyControlPoint { SpeedMultiplier = speedMultiplier }); - - var difficulty = new BeatmapDifficulty - { - SliderMultiplier = (float)sliderMultiplier, - CircleSize = 0 - }; - - slider.ApplyDefaults(cpi, difficulty); - Add(new DrawableSlider(slider) - { - Anchor = Anchor.Centre, - Depth = depthIndex++ - }); + addSlider(slider); } - private void addRepeated(int repeats) + private void testRepeated(int repeats) { // The first run through the slider is considered a repeat repeats++; @@ -99,32 +91,50 @@ namespace osu.Game.Rulesets.Osu.Tests RepeatSamples = repeatSamples }; + addSlider(slider); + } + + private void testStream() + { + Vector2 pos = Vector2.Zero; + + for (int i = 0; i <= 1000; i += 100) + { + testSingle(i, pos); + pos += new Vector2(10); + } + } + + private void addSlider(Slider slider) + { var cpi = new ControlPointInfo(); cpi.DifficultyPoints.Add(new DifficultyControlPoint { SpeedMultiplier = speedMultiplier }); var difficulty = new BeatmapDifficulty { SliderMultiplier = (float)sliderMultiplier, - CircleSize = 0 + CircleSize = circleSize }; slider.ApplyDefaults(cpi, difficulty); - Add(new DrawableSlider(slider) + + var drawable = new DrawableSlider(slider) { Anchor = Anchor.Centre, + Scale = new Vector2(circleScale), Depth = depthIndex++ - }); + }; + + if (hidden) + drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + + Add(drawable); } - private void addStream() + private class TestOsuModHidden : OsuModHidden { - Vector2 pos = Vector2.Zero; - - for (int i = 0; i <= 1000; i += 100) - { - addSingle(i, pos); - pos += new Vector2(10); - } + public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); } } + } From ca650e8d48fde20add55bccbae7b666fd30cfb50 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Thu, 28 Dec 2017 18:21:08 +0100 Subject: [PATCH 20/64] extend TestCaseSpinner with new steps - Hidden, Size and Scale --- .../Tests/TestCaseHitCircle.cs | 2 +- osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 2 +- .../Tests/TestCaseSpinner.cs | 24 ++++++++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index babe39c41d..ddb6000fbb 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -27,7 +27,7 @@ namespace osu.Game.Rulesets.Osu.Tests private bool hidden; private int depthIndex; private int circleSize; - private float circleScale; + private float circleScale = 1; public TestCaseHitCircle() { diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 224e2ea3ef..8b2eb8baef 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -30,7 +30,7 @@ namespace osu.Game.Rulesets.Osu.Tests private int repeats; private int depthIndex; private int circleSize; - private float circleScale; + private float circleScale = 1; private double speedMultiplier = 2; private double sliderMultiplier = 2; diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs index 76cc70effd..4f97ba9697 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs @@ -2,10 +2,13 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using NUnit.Framework; +using OpenTK; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Tests.Visual; @@ -18,28 +21,43 @@ namespace osu.Game.Rulesets.Osu.Tests private readonly Container content; protected override Container Content => content; + private bool hidden; private int depthIndex; + private int circleSize; + private float circleScale = 1; public TestCaseSpinner() { base.Content.Add(content = new OsuInputManager(new RulesetInfo { ID = 0 })); - AddStep("Single", addSingle); + AddStep("Single", testSingle); + AddToggleStep("Hidden", v => hidden = v); + AddSliderStep("CircleSize", 0, 10, 0, s => circleSize = s); + AddSliderStep("CircleScale", 0.5f, 2, 1, s => circleScale = s); } - private void addSingle() + private void testSingle() { var spinner = new Spinner { StartTime = Time.Current + 1000, EndTime = Time.Current + 4000 }; - spinner.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = 0 }); + spinner.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { CircleSize = circleSize }); var drawable = new DrawableSpinner(spinner) { Anchor = Anchor.Centre, + Scale = new Vector2(circleScale), Depth = depthIndex++ }; + if (hidden) + drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + Add(drawable); } + + private class TestOsuModHidden : OsuModHidden + { + public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); + } } } From 2ca10b28c6a10ae29d62cf5210133042e41bfa59 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 15:42:51 +0900 Subject: [PATCH 21/64] Use a non-broken opentk library --- NuGet.config | 6 ------ osu.Desktop/osu.Desktop.csproj | 2 +- osu.Desktop/packages.config | 2 +- osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj | 2 +- osu.Game.Rulesets.Catch/packages.config | 2 +- osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj | 2 +- osu.Game.Rulesets.Mania/packages.config | 2 +- osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj | 2 +- osu.Game.Rulesets.Osu/packages.config | 2 +- osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj | 2 +- osu.Game.Rulesets.Taiko/packages.config | 2 +- osu.Game.Tests/osu.Game.Tests.csproj | 2 +- osu.Game.Tests/packages.config | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.Game/packages.config | 2 +- 15 files changed, 14 insertions(+), 20 deletions(-) delete mode 100644 NuGet.config diff --git a/NuGet.config b/NuGet.config deleted file mode 100644 index 95f993e510..0000000000 --- a/NuGet.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj index 4a1798feb4..3cc4e7f943 100644 --- a/osu.Desktop/osu.Desktop.csproj +++ b/osu.Desktop/osu.Desktop.csproj @@ -136,7 +136,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Desktop/packages.config b/osu.Desktop/packages.config index e7233a42ac..4757b50c4c 100644 --- a/osu.Desktop/packages.config +++ b/osu.Desktop/packages.config @@ -6,7 +6,7 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste - + diff --git a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj index 578d8eb34d..16c909e063 100644 --- a/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj +++ b/osu.Game.Rulesets.Catch/osu.Game.Rulesets.Catch.csproj @@ -37,7 +37,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game.Rulesets.Catch/packages.config b/osu.Game.Rulesets.Catch/packages.config index 2369f7529b..b39a85a382 100644 --- a/osu.Game.Rulesets.Catch/packages.config +++ b/osu.Game.Rulesets.Catch/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index bdd6656ed9..3393774a9c 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -37,7 +37,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game.Rulesets.Mania/packages.config b/osu.Game.Rulesets.Mania/packages.config index 2369f7529b..b39a85a382 100644 --- a/osu.Game.Rulesets.Mania/packages.config +++ b/osu.Game.Rulesets.Mania/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj index 245f3eed91..785c3e17fb 100644 --- a/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj +++ b/osu.Game.Rulesets.Osu/osu.Game.Rulesets.Osu.csproj @@ -38,7 +38,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game.Rulesets.Osu/packages.config b/osu.Game.Rulesets.Osu/packages.config index 2369f7529b..b39a85a382 100644 --- a/osu.Game.Rulesets.Osu/packages.config +++ b/osu.Game.Rulesets.Osu/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj index 7e44e85e52..1aed86f8f9 100644 --- a/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj +++ b/osu.Game.Rulesets.Taiko/osu.Game.Rulesets.Taiko.csproj @@ -37,7 +37,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game.Rulesets.Taiko/packages.config b/osu.Game.Rulesets.Taiko/packages.config index 2369f7529b..b39a85a382 100644 --- a/osu.Game.Rulesets.Taiko/packages.config +++ b/osu.Game.Rulesets.Taiko/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj index df66896d9b..8c04874e75 100644 --- a/osu.Game.Tests/osu.Game.Tests.csproj +++ b/osu.Game.Tests/osu.Game.Tests.csproj @@ -38,7 +38,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game.Tests/packages.config b/osu.Game.Tests/packages.config index c2056e09a8..9fbb0537bc 100644 --- a/osu.Game.Tests/packages.config +++ b/osu.Game.Tests/packages.config @@ -6,6 +6,6 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste - + \ No newline at end of file diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 7d146c0a12..22191c98ab 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -144,7 +144,7 @@ True - $(SolutionDir)\packages\OpenTK.3.0.0-git00021\lib\net20\OpenTK.dll + $(SolutionDir)\packages\ppy.OpenTK.3.0.11\lib\net45\OpenTK.dll True diff --git a/osu.Game/packages.config b/osu.Game/packages.config index 3ba50388e8..e35f06dd67 100644 --- a/osu.Game/packages.config +++ b/osu.Game/packages.config @@ -66,7 +66,7 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste - + From 16c1bc9880539664b2e90f967a8a19c91b8969ec Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 15:43:38 +0900 Subject: [PATCH 22/64] Update framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 10cae790c6..2438afea86 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 10cae790c6f1d559c326f9438958d0b012d61dc6 +Subproject commit 2438afea86d0ce1f91b1b2f01bca1cf8afdd4659 From b74248a705665adf9f68037c5f8dfbb9b26e7f7a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 16:22:06 +0900 Subject: [PATCH 23/64] Rename application method --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 6 +++--- osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs | 4 ++-- osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 2 +- osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 77ce7235ee..09360bea68 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -41,10 +41,10 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObjects(IEnumerable drawables) { foreach (var d in drawables.OfType()) - d.ApplyCustomUpdateState += CustomSequence; + d.ApplyCustomUpdateState += ApplyHiddenState; } - protected void CustomSequence(DrawableHitObject drawable, ArmedState state) + protected void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) { if (!(drawable is DrawableOsuHitObject d)) return; @@ -70,7 +70,7 @@ namespace osu.Game.Rulesets.Osu.Mods circle.FadeIn(fadeIn).Then().FadeOut(fadeOut); // override fade in as it somehow gets cut otherwise break; case DrawableSlider slider: - slider.InitialCircle.ApplyCustomUpdateState += CustomSequence; + slider.InitialCircle.ApplyCustomUpdateState += ApplyHiddenState; using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index ddb6000fbb..045d95e942 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -65,7 +65,7 @@ namespace osu.Game.Rulesets.Osu.Tests drawable.State.Value = ArmedState.Hit; if (hidden) - drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + drawable.ApplyCustomUpdateState += new TestOsuModHidden().ApplyHiddenState; Add(drawable); } @@ -83,7 +83,7 @@ namespace osu.Game.Rulesets.Osu.Tests private class TestOsuModHidden : OsuModHidden { - public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); + public new void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); } private class TestDrawableHitCircle : DrawableHitCircle diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 8b2eb8baef..87ed67fe82 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -133,7 +133,7 @@ namespace osu.Game.Rulesets.Osu.Tests private class TestOsuModHidden : OsuModHidden { - public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); + public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); } } diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs index 4f97ba9697..96f9b6b97f 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs @@ -57,7 +57,7 @@ namespace osu.Game.Rulesets.Osu.Tests private class TestOsuModHidden : OsuModHidden { - public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.CustomSequence(drawable, state); + public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); } } } From 2c61ebbcd9b04367c7dbb9d000e2ecd4f37cb0cb Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 17:10:33 +0900 Subject: [PATCH 24/64] Remove unnecessary local derived classes --- osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs | 7 +------ osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 8 +------- osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs | 8 +------- 3 files changed, 3 insertions(+), 20 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index 045d95e942..c0a67e5dc1 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -65,7 +65,7 @@ namespace osu.Game.Rulesets.Osu.Tests drawable.State.Value = ArmedState.Hit; if (hidden) - drawable.ApplyCustomUpdateState += new TestOsuModHidden().ApplyHiddenState; + new OsuModHidden().ApplyToDrawableHitObjects(new [] { drawable }); Add(drawable); } @@ -81,11 +81,6 @@ namespace osu.Game.Rulesets.Osu.Tests } } - private class TestOsuModHidden : OsuModHidden - { - public new void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); - } - private class TestDrawableHitCircle : DrawableHitCircle { private readonly bool auto; diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 87ed67fe82..9acf286915 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -14,7 +14,6 @@ using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Tests.Visual; using OpenTK; using osu.Game.Rulesets.Osu.Mods; -using osu.Game.Rulesets.Objects.Drawables; namespace osu.Game.Rulesets.Osu.Tests { @@ -126,15 +125,10 @@ namespace osu.Game.Rulesets.Osu.Tests }; if (hidden) - drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + new OsuModHidden().ApplyToDrawableHitObjects(new [] { drawable }); Add(drawable); } - - private class TestOsuModHidden : OsuModHidden - { - public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); - } } } diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs index 96f9b6b97f..895984c1ce 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs @@ -7,7 +7,6 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; @@ -50,14 +49,9 @@ namespace osu.Game.Rulesets.Osu.Tests }; if (hidden) - drawable.ApplyCustomUpdateState += new TestOsuModHidden().CustomSequence; + new OsuModHidden().ApplyToDrawableHitObjects(new [] { drawable }); Add(drawable); } - - private class TestOsuModHidden : OsuModHidden - { - public new void CustomSequence(DrawableHitObject drawable, ArmedState state) => base.ApplyHiddenState(drawable, state); - } } } From 27cb445c24927285219752d8e7e5b0ead86b783d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 17:48:05 +0900 Subject: [PATCH 25/64] Always recrusively apply custom sequence to nested hitobjects --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 2 -- osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 09360bea68..36429bbca5 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -70,8 +70,6 @@ namespace osu.Game.Rulesets.Osu.Mods circle.FadeIn(fadeIn).Then().FadeOut(fadeOut); // override fade in as it somehow gets cut otherwise break; case DrawableSlider slider: - slider.InitialCircle.ApplyCustomUpdateState += ApplyHiddenState; - using (slider.BeginAbsoluteSequence(fadeOutTime, true)) { slider.Body.FadeOut(newDuration, Easing.Out); diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index af525903c5..af038909d2 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -246,6 +246,7 @@ namespace osu.Game.Rulesets.Objects.Drawables h.OnJudgement += (d, j) => OnJudgement?.Invoke(d, j); h.OnJudgementRemoved += (d, j) => OnJudgementRemoved?.Invoke(d, j); + h.ApplyCustomUpdateState += (d, s) => ApplyCustomUpdateState?.Invoke(d, s); nestedHitObjects.Add(h); } From c9d4da65d2c382cbf7df4003e2c0c133642ccd88 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:06:41 +0900 Subject: [PATCH 26/64] Simplify and rename time variables --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 38 +++++++++++++++------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 36429bbca5..0ed72db18c 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -49,35 +49,37 @@ namespace osu.Game.Rulesets.Osu.Mods if (!(drawable is DrawableOsuHitObject d)) return; - var fadeInTime = d.HitObject.StartTime - preEmpt; - var fadeIn = d.HitObject.StartTime - preEmpt * fade_in_speed_multiplier - fadeInTime; - var fadeOutTime = fadeInTime + fadeIn; - var fadeOut = d.HitObject.StartTime - preEmpt * fade_out_speed_multiplier - fadeOutTime; + var fadeInStartTime = d.HitObject.StartTime - preEmpt; + var fadeInDuration = preEmpt * fade_in_speed_multiplier; + + var fadeOutStartTime = fadeInStartTime + fadeInDuration; + var fadeOutDuration = preEmpt * fade_out_speed_multiplier; // new duration from completed fade in to end (before fading out) - var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutTime; + var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutStartTime; - d.FadeIn = fadeIn; + d.FadeIn = fadeInDuration; - using (drawable.BeginAbsoluteSequence(fadeInTime, true)) + using (drawable.BeginAbsoluteSequence(fadeInStartTime, true)) { switch (drawable) { case DrawableHitCircle circle: - circle.ApproachCircle.FadeOut(); + // we don't want to see the approach circle + circle.ApproachCircle.Hide(); // prolong the hitcircle long enough so misses are still possible - circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOut, circle.HitObject.HitWindowFor(HitResult.Miss)); - circle.FadeIn(fadeIn).Then().FadeOut(fadeOut); // override fade in as it somehow gets cut otherwise + circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOutDuration, circle.HitObject.HitWindowFor(HitResult.Miss)); + circle.FadeIn(fadeInDuration).Then().FadeOut(fadeOutDuration); // override fade in as it somehow gets cut otherwise break; case DrawableSlider slider: - using (slider.BeginAbsoluteSequence(fadeOutTime, true)) + using (slider.BeginAbsoluteSequence(fadeOutStartTime, true)) { slider.Body.FadeOut(newDuration, Easing.Out); // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(newDuration - fadeOut, true)) + using (slider.BeginDelayedSequence(newDuration - fadeOutDuration, true)) { - slider.Ball.FadeOut(fadeOut); - slider.Delay(fadeOut).Expire(); + slider.Ball.FadeOut(fadeOutDuration); + slider.Delay(fadeOutDuration).Expire(); } } break; @@ -86,17 +88,17 @@ namespace osu.Game.Rulesets.Osu.Mods spinner.Ticks.FadeOut(); spinner.Background.FadeOut(); - using (spinner.BeginAbsoluteSequence(fadeOutTime, true)) + using (spinner.BeginAbsoluteSequence(fadeOutStartTime, true)) { - var sequence = spinner.Delay(newDuration).FadeOut(fadeOut); + var sequence = spinner.Delay(newDuration).FadeOut(fadeOutDuration); // speed up the end sequence accordingly switch (state) { case ArmedState.Hit: - sequence.ScaleTo(spinner.Scale * 1.2f, fadeOut * 2, Easing.Out); + sequence.ScaleTo(spinner.Scale * 1.2f, fadeOutDuration * 2, Easing.Out); break; case ArmedState.Miss: - sequence.ScaleTo(spinner.Scale * 0.8f, fadeOut * 2, Easing.Out); + sequence.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.Out); break; } sequence.Expire(); From ced2d9749d61a9bbe2830aab8609ab59dfd0a9d9 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:25:33 +0900 Subject: [PATCH 27/64] Adjust presets and rename more --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 0ed72db18c..f24a360575 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -33,8 +33,8 @@ namespace osu.Game.Rulesets.Osu.Mods public override string Description => @"Play with no approach circles and fading notes for a slight score advantage."; public override double ScoreMultiplier => 1.06; - private const double fade_in_speed_multiplier = 0.6; - private const double fade_out_speed_multiplier = 0.3; + private const double fade_in_duration_multiplier = 0.4; + private const double fade_out_duration_multiplier = 0.3; private float preEmpt => DrawableOsuHitObject.TIME_PREEMPT; @@ -50,10 +50,10 @@ namespace osu.Game.Rulesets.Osu.Mods return; var fadeInStartTime = d.HitObject.StartTime - preEmpt; - var fadeInDuration = preEmpt * fade_in_speed_multiplier; + var fadeInDuration = preEmpt * fade_in_duration_multiplier; var fadeOutStartTime = fadeInStartTime + fadeInDuration; - var fadeOutDuration = preEmpt * fade_out_speed_multiplier; + var fadeOutDuration = preEmpt * fade_out_duration_multiplier; // new duration from completed fade in to end (before fading out) var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutStartTime; @@ -67,6 +67,7 @@ namespace osu.Game.Rulesets.Osu.Mods case DrawableHitCircle circle: // we don't want to see the approach circle circle.ApproachCircle.Hide(); + // prolong the hitcircle long enough so misses are still possible circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOutDuration, circle.HitObject.HitWindowFor(HitResult.Miss)); circle.FadeIn(fadeInDuration).Then().FadeOut(fadeOutDuration); // override fade in as it somehow gets cut otherwise @@ -75,6 +76,7 @@ namespace osu.Game.Rulesets.Osu.Mods using (slider.BeginAbsoluteSequence(fadeOutStartTime, true)) { slider.Body.FadeOut(newDuration, Easing.Out); + // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut using (slider.BeginDelayedSequence(newDuration - fadeOutDuration, true)) { @@ -91,6 +93,7 @@ namespace osu.Game.Rulesets.Osu.Mods using (spinner.BeginAbsoluteSequence(fadeOutStartTime, true)) { var sequence = spinner.Delay(newDuration).FadeOut(fadeOutDuration); + // speed up the end sequence accordingly switch (state) { @@ -101,6 +104,7 @@ namespace osu.Game.Rulesets.Osu.Mods sequence.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.Out); break; } + sequence.Expire(); } break; From 0ae00cbd17f006272a4ea1ecde3f03bbaf9a1619 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:28:16 +0900 Subject: [PATCH 28/64] Rename one more variable --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index f24a360575..c19f8a679b 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -56,7 +56,7 @@ namespace osu.Game.Rulesets.Osu.Mods var fadeOutDuration = preEmpt * fade_out_duration_multiplier; // new duration from completed fade in to end (before fading out) - var newDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutStartTime; + var longFadeDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutStartTime; d.FadeIn = fadeInDuration; @@ -75,10 +75,10 @@ namespace osu.Game.Rulesets.Osu.Mods case DrawableSlider slider: using (slider.BeginAbsoluteSequence(fadeOutStartTime, true)) { - slider.Body.FadeOut(newDuration, Easing.Out); + slider.Body.FadeOut(longFadeDuration, Easing.Out); // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(newDuration - fadeOutDuration, true)) + using (slider.BeginDelayedSequence(longFadeDuration - fadeOutDuration, true)) { slider.Ball.FadeOut(fadeOutDuration); slider.Delay(fadeOutDuration).Expire(); @@ -92,7 +92,7 @@ namespace osu.Game.Rulesets.Osu.Mods using (spinner.BeginAbsoluteSequence(fadeOutStartTime, true)) { - var sequence = spinner.Delay(newDuration).FadeOut(fadeOutDuration); + var sequence = spinner.Delay(longFadeDuration).FadeOut(fadeOutDuration); // speed up the end sequence accordingly switch (state) From dd2ae3f701974e00ef053b1a78fae9904c6babe7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:48:10 +0900 Subject: [PATCH 29/64] SImplify everything --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 87 ++++++++++++++-------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index c19f8a679b..1c0f694e4f 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -60,55 +60,58 @@ namespace osu.Game.Rulesets.Osu.Mods d.FadeIn = fadeInDuration; - using (drawable.BeginAbsoluteSequence(fadeInStartTime, true)) + switch (drawable) { - switch (drawable) - { - case DrawableHitCircle circle: - // we don't want to see the approach circle - circle.ApproachCircle.Hide(); + case DrawableHitCircle circle: + // we don't want to see the approach circle + circle.ApproachCircle.Hide(); - // prolong the hitcircle long enough so misses are still possible - circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOutDuration, circle.HitObject.HitWindowFor(HitResult.Miss)); - circle.FadeIn(fadeInDuration).Then().FadeOut(fadeOutDuration); // override fade in as it somehow gets cut otherwise - break; - case DrawableSlider slider: - using (slider.BeginAbsoluteSequence(fadeOutStartTime, true)) + // prolong the hitcircle long enough so misses are still possible + circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOutDuration, circle.HitObject.HitWindowFor(HitResult.Miss)); + + // fade out immediately after fade in. + using (drawable.BeginAbsoluteSequence(fadeInStartTime + fadeInDuration, true)) + circle.FadeOut(fadeOutDuration); + break; + case DrawableSlider slider: + using (slider.BeginAbsoluteSequence(fadeOutStartTime, true)) + { + slider.Body.FadeOut(longFadeDuration, Easing.Out); + + // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut + using (slider.BeginDelayedSequence(longFadeDuration - fadeOutDuration, true)) { - slider.Body.FadeOut(longFadeDuration, Easing.Out); - - // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut - using (slider.BeginDelayedSequence(longFadeDuration - fadeOutDuration, true)) - { - slider.Ball.FadeOut(fadeOutDuration); - slider.Delay(fadeOutDuration).Expire(); - } + slider.Ball.FadeOut(fadeOutDuration); + slider.Delay(fadeOutDuration).Expire(); } - break; - case DrawableSpinner spinner: - spinner.Disc.FadeOut(); - spinner.Ticks.FadeOut(); - spinner.Background.FadeOut(); + } - using (spinner.BeginAbsoluteSequence(fadeOutStartTime, true)) + break; + case DrawableSpinner spinner: + // hide elements we don't care about. + spinner.Disc.Hide(); + spinner.Ticks.Hide(); + spinner.Background.Hide(); + + using (spinner.BeginAbsoluteSequence(fadeOutStartTime + longFadeDuration, true)) + { + spinner.FadeOut(fadeOutDuration); + + // speed up the end sequence accordingly + switch (state) { - var sequence = spinner.Delay(longFadeDuration).FadeOut(fadeOutDuration); - - // speed up the end sequence accordingly - switch (state) - { - case ArmedState.Hit: - sequence.ScaleTo(spinner.Scale * 1.2f, fadeOutDuration * 2, Easing.Out); - break; - case ArmedState.Miss: - sequence.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.Out); - break; - } - - sequence.Expire(); + case ArmedState.Hit: + spinner.ScaleTo(spinner.Scale * 1.2f, fadeOutDuration * 2, Easing.Out); + break; + case ArmedState.Miss: + spinner.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.Out); + break; } - break; - } + + spinner.Expire(); + } + + break; } } } From a4f941cdf161bf802729f2a7d092b54056077fd6 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:51:14 +0900 Subject: [PATCH 30/64] Move lifetime adjustment to DrawableHitCircle --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 3 --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 1c0f694e4f..6f2657c3ce 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -66,9 +66,6 @@ namespace osu.Game.Rulesets.Osu.Mods // we don't want to see the approach circle circle.ApproachCircle.Hide(); - // prolong the hitcircle long enough so misses are still possible - circle.LifetimeEnd = circle.HitObject.StartTime + Math.Max(fadeOutDuration, circle.HitObject.HitWindowFor(HitResult.Miss)); - // fade out immediately after fade in. using (drawable.BeginAbsoluteSequence(fadeInStartTime + fadeInDuration, true)) circle.FadeOut(fadeOutDuration); diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 84ae568a1d..5ee1f3dd05 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -99,7 +99,11 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { case ArmedState.Idle: this.Delay(TIME_PREEMPT).FadeOut(500); + Expire(true); + + // override lifetime end as FadeIn may have been changed externally, causing out expiration to be too early. + LifetimeEnd = HitObject.StartTime + HitObject.HitWindowFor(HitResult.Miss); break; case ArmedState.Miss: ApproachCircle.FadeOut(50); From db8228f69d1b90d969fa4f82f3074367fd046752 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 18:57:38 +0900 Subject: [PATCH 31/64] Don't think we need this expire call --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 6f2657c3ce..34694ac1ab 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -77,10 +77,7 @@ namespace osu.Game.Rulesets.Osu.Mods // delay a bit less to let the sliderball fade out peacefully instead of having a hard cut using (slider.BeginDelayedSequence(longFadeDuration - fadeOutDuration, true)) - { slider.Ball.FadeOut(fadeOutDuration); - slider.Delay(fadeOutDuration).Expire(); - } } break; From b200134a18269f177899f6c1cc5717ba38d9877a Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:44:10 +0100 Subject: [PATCH 32/64] fix spinner easing with hidden --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 34694ac1ab..26aa7cd023 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Osu.Mods spinner.ScaleTo(spinner.Scale * 1.2f, fadeOutDuration * 2, Easing.Out); break; case ArmedState.Miss: - spinner.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.Out); + spinner.ScaleTo(spinner.Scale * 0.8f, fadeOutDuration * 2, Easing.In); break; } From ca9f0147141ee4e0f307a7afdacd4b376c642827 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:44:38 +0100 Subject: [PATCH 33/64] add required types to testclasses --- osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs | 9 +++++++++ osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 9 ++++++++- osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs | 9 +++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index c0a67e5dc1..e669dd234a 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -14,12 +14,21 @@ using OpenTK; using osu.Game.Rulesets.Osu.Mods; using OpenTK.Graphics; using osu.Game.Rulesets.Osu.Judgements; +using System.Collections.Generic; +using System; namespace osu.Game.Rulesets.Osu.Tests { [Ignore("getting CI working")] public class TestCaseHitCircle : OsuTestCase { + public override IReadOnlyList RequiredTypes => new[] + { + typeof(HitCircle), + typeof(OsuModHidden), + typeof(DrawableHitCircle) + }; + private readonly Container content; protected override Container Content => content; diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 9acf286915..80d23be6a6 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -20,7 +20,14 @@ namespace osu.Game.Rulesets.Osu.Tests [Ignore("getting CI working")] public class TestCaseSlider : OsuTestCase { - public override IReadOnlyList RequiredTypes => new[] { typeof(DrawableSlider) }; + public override IReadOnlyList RequiredTypes => new[] + { + typeof(Slider), + typeof(HitCircle), + typeof(OsuModHidden), + typeof(DrawableSlider), + typeof(DrawableHitCircle) + }; private readonly Container content; protected override Container Content => content; diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs index 895984c1ce..c4ee56455a 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSpinner.cs @@ -1,6 +1,8 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; +using System.Collections.Generic; using NUnit.Framework; using OpenTK; using osu.Framework.Graphics; @@ -17,6 +19,13 @@ namespace osu.Game.Rulesets.Osu.Tests [Ignore("getting CI working")] public class TestCaseSpinner : OsuTestCase { + public override IReadOnlyList RequiredTypes => new[] +{ + typeof(Spinner), + typeof(OsuModHidden), + typeof(DrawableSpinner) + }; + private readonly Container content; protected override Container Content => content; From a58b5ff5f226e0abac33329a895ce1b505799860 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:46:22 +0100 Subject: [PATCH 34/64] simplify sequence --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 26aa7cd023..4a4ecec654 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -67,7 +67,7 @@ namespace osu.Game.Rulesets.Osu.Mods circle.ApproachCircle.Hide(); // fade out immediately after fade in. - using (drawable.BeginAbsoluteSequence(fadeInStartTime + fadeInDuration, true)) + using (drawable.BeginAbsoluteSequence(fadeOutStartTime, true)) circle.FadeOut(fadeOutDuration); break; case DrawableSlider slider: From f547c7986d91e498f4452cd53e7020f716cc982a Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:50:55 +0100 Subject: [PATCH 35/64] created option to override values before UpdateState is called --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 10 ++++++++-- .../Rulesets/Objects/Drawables/DrawableHitObject.cs | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 4a4ecec654..6da9bea1f2 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -44,6 +44,14 @@ namespace osu.Game.Rulesets.Osu.Mods d.ApplyCustomUpdateState += ApplyHiddenState; } + protected void ApplyHiddenValues(DrawableHitObject drawable) + { + if (!(drawable is DrawableOsuHitObject d)) + return; + + d.FadeIn = preEmpt * fade_in_duration_multiplier; + } + protected void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) { if (!(drawable is DrawableOsuHitObject d)) @@ -58,8 +66,6 @@ namespace osu.Game.Rulesets.Osu.Mods // new duration from completed fade in to end (before fading out) var longFadeDuration = ((d.HitObject as IHasEndTime)?.EndTime ?? d.HitObject.StartTime) - fadeOutStartTime; - d.FadeIn = fadeInDuration; - switch (drawable) { case DrawableHitCircle circle: diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index af038909d2..76afd57178 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -120,6 +120,9 @@ namespace osu.Game.Rulesets.Objects.Drawables State.ValueChanged += state => { + // apply any custom values + ApplyCustomValues?.Invoke(this); + UpdateState(state); // apply any custom state overrides @@ -250,6 +253,11 @@ namespace osu.Game.Rulesets.Objects.Drawables nestedHitObjects.Add(h); } + /// + /// Bind to apply custom values. + /// + public event Action ApplyCustomValues; + /// /// Bind to apply a custom state which can override the default implementation. /// From 5c3b67bcef25cd7a628aaf9dcd8ed8def0ed06d9 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:51:59 +0100 Subject: [PATCH 36/64] remove unnecessary values --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 6da9bea1f2..39c34fa246 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -57,10 +57,7 @@ namespace osu.Game.Rulesets.Osu.Mods if (!(drawable is DrawableOsuHitObject d)) return; - var fadeInStartTime = d.HitObject.StartTime - preEmpt; - var fadeInDuration = preEmpt * fade_in_duration_multiplier; - - var fadeOutStartTime = fadeInStartTime + fadeInDuration; + var fadeOutStartTime = d.HitObject.StartTime - preEmpt + d.FadeIn; var fadeOutDuration = preEmpt * fade_out_duration_multiplier; // new duration from completed fade in to end (before fading out) From 07040f9fd161c039e13e70441bd85c847805d54e Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:52:28 +0100 Subject: [PATCH 37/64] rename field --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 4 ++-- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs | 2 +- .../Objects/Drawables/DrawableOsuHitObject.cs | 4 ++-- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs | 4 ++-- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index 39c34fa246..a5331321c2 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.Osu.Mods if (!(drawable is DrawableOsuHitObject d)) return; - d.FadeIn = preEmpt * fade_in_duration_multiplier; + d.FadeInDuration = preEmpt * fade_in_duration_multiplier; } protected void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) @@ -57,7 +57,7 @@ namespace osu.Game.Rulesets.Osu.Mods if (!(drawable is DrawableOsuHitObject d)) return; - var fadeOutStartTime = d.HitObject.StartTime - preEmpt + d.FadeIn; + var fadeOutStartTime = d.HitObject.StartTime - preEmpt + d.FadeInDuration; var fadeOutDuration = preEmpt * fade_out_duration_multiplier; // new duration from completed fade in to end (before fading out) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 5ee1f3dd05..29b31a3fcc 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { base.UpdatePreemptState(); - ApproachCircle.FadeIn(Math.Min(FadeIn * 2, TIME_PREEMPT)); + ApproachCircle.FadeIn(Math.Min(FadeInDuration * 2, TIME_PREEMPT)); ApproachCircle.ScaleTo(1.1f, TIME_PREEMPT); } diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index a5b5fc481a..33657c200f 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// /// The number of milliseconds used to fade in. /// - public double FadeIn = TIME_FADEIN; + public double FadeInDuration = TIME_FADEIN; public override bool IsPresent => base.IsPresent || State.Value == ArmedState.Idle && Time.Current >= HitObject.StartTime - TIME_PREEMPT; @@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables } } - protected virtual void UpdatePreemptState() => this.FadeIn(FadeIn); + protected virtual void UpdatePreemptState() => this.FadeIn(FadeInDuration); protected virtual void UpdateCurrentState(ArmedState state) { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 75fa3e0f01..9c04acb011 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -70,7 +70,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables foreach (var tick in s.NestedHitObjects.OfType()) { var repeatStartTime = s.StartTime + tick.RepeatIndex * repeatDuration; - var fadeInTime = repeatStartTime + (tick.StartTime - repeatStartTime) / 2 - (tick.RepeatIndex == 0 ? FadeIn : FadeIn / 2); + var fadeInTime = repeatStartTime + (tick.StartTime - repeatStartTime) / 2 - (tick.RepeatIndex == 0 ? FadeInDuration : FadeInDuration / 2); var fadeOutTime = repeatStartTime + repeatDuration; var drawableTick = new DrawableSliderTick(tick) @@ -87,7 +87,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables foreach (var repeatPoint in s.NestedHitObjects.OfType()) { var repeatStartTime = s.StartTime + repeatPoint.RepeatIndex * repeatDuration; - var fadeInTime = repeatStartTime + (repeatPoint.StartTime - repeatStartTime) / 2 - (repeatPoint.RepeatIndex == 0 ? FadeIn : FadeIn / 2); + var fadeInTime = repeatStartTime + (repeatPoint.StartTime - repeatStartTime) / 2 - (repeatPoint.RepeatIndex == 0 ? FadeInDuration : FadeInDuration / 2); var fadeOutTime = repeatStartTime + repeatDuration; var drawableRepeatPoint = new DrawableRepeatPoint(repeatPoint, this) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 9e80e3ccd1..30c9fb13d0 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -166,7 +166,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables { Disc.Tracking = OsuActionInputManager.PressedActions.Any(x => x == OsuAction.LeftButton || x == OsuAction.RightButton); if (!spmCounter.IsPresent && Disc.Tracking) - spmCounter.FadeIn(FadeIn); + spmCounter.FadeIn(FadeInDuration); base.Update(); } From 6c6fa08a06cf01c98ce4a08c019c20efb4ddc9b5 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 17:56:48 +0100 Subject: [PATCH 38/64] added some colour to testsliders gray just wasn't sticking out well --- osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 80d23be6a6..22ab64636e 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -14,6 +14,7 @@ using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Tests.Visual; using OpenTK; using osu.Game.Rulesets.Osu.Mods; +using OpenTK.Graphics; namespace osu.Game.Rulesets.Osu.Tests { @@ -63,12 +64,13 @@ namespace osu.Game.Rulesets.Osu.Tests { StartTime = Time.Current + 1000 + timeOffset, Position = new Vector2(-200, 0) + positionOffset.Value, + ComboColour = Color4.LightSeaGreen, ControlPoints = new List { new Vector2(-200, 0) + positionOffset.Value, new Vector2(400, 0) + positionOffset.Value, }, - Distance = 400, + Distance = 400 }; addSlider(slider); @@ -87,6 +89,7 @@ namespace osu.Game.Rulesets.Osu.Tests { StartTime = Time.Current + 1000, Position = new Vector2(-200, 0), + ComboColour = Color4.LightSeaGreen, ControlPoints = new List { new Vector2(-200, 0), From 5e887240aeeee6229535672f56d64945161e3dc3 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 18:04:40 +0100 Subject: [PATCH 39/64] actually use option to override values... --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index a5331321c2..cc52a6eb72 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -41,7 +41,10 @@ namespace osu.Game.Rulesets.Osu.Mods public void ApplyToDrawableHitObjects(IEnumerable drawables) { foreach (var d in drawables.OfType()) + { + d.ApplyCustomValues += ApplyHiddenValues; d.ApplyCustomUpdateState += ApplyHiddenState; + } } protected void ApplyHiddenValues(DrawableHitObject drawable) From 0a2e41884e7d7a19d05acd147aeb9eec7ac21bcb Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 20:01:26 +0100 Subject: [PATCH 40/64] add more required types for test slider --- osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs index 22ab64636e..5b6b357351 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseSlider.cs @@ -27,7 +27,9 @@ namespace osu.Game.Rulesets.Osu.Tests typeof(HitCircle), typeof(OsuModHidden), typeof(DrawableSlider), - typeof(DrawableHitCircle) + typeof(DrawableHitCircle), + typeof(DrawableSliderTick), + typeof(DrawableRepeatPoint) }; private readonly Container content; From 52dd5ddba66c50ba33b25c7005314bac12436e76 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Fri, 29 Dec 2017 20:03:43 +0100 Subject: [PATCH 41/64] fix repeat points not scaling properly --- .../Objects/Drawables/DrawableRepeatPoint.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs index a9b63ea642..dc64294eea 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs @@ -27,8 +27,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables AutoSizeAxes = Axes.Both; Blending = BlendingMode.Additive; Origin = Anchor.Centre; - Scale = new Vector2(0.5f); - Children = new Drawable[] { new SpriteIcon @@ -36,7 +34,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables Icon = FontAwesome.fa_eercast, Anchor = Anchor.Centre, Origin = Anchor.Centre, - Size = new Vector2(32), + Size = new Vector2(32 * repeatPoint.Scale), } }; } From b1dd64983dcc5eb7b0bd76cedfc9de9d257ea5f9 Mon Sep 17 00:00:00 2001 From: jai_ Date: Fri, 29 Dec 2017 19:05:50 +0000 Subject: [PATCH 42/64] Add tooltip text to supporter icon --- osu.Game/Overlays/Profile/SupporterIcon.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Profile/SupporterIcon.cs b/osu.Game/Overlays/Profile/SupporterIcon.cs index 570d5a13bb..0b40281193 100644 --- a/osu.Game/Overlays/Profile/SupporterIcon.cs +++ b/osu.Game/Overlays/Profile/SupporterIcon.cs @@ -1,19 +1,22 @@ -// Copyright (c) 2007-2017 ppy Pty Ltd . +// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using OpenTK; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; using osu.Game.Graphics; using osu.Game.Graphics.Backgrounds; namespace osu.Game.Overlays.Profile { - public class SupporterIcon : CircularContainer + public class SupporterIcon : CircularContainer, IHasToolTip { private readonly Box background; + + public string TooltipText => "osu!supporter"; public SupporterIcon() { From 6de41ba1729a78a25f65028a4019f45bdb9ff6e8 Mon Sep 17 00:00:00 2001 From: jai_ Date: Fri, 29 Dec 2017 19:16:43 +0000 Subject: [PATCH 43/64] Trim whitespace --- osu.Game/Overlays/Profile/SupporterIcon.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Profile/SupporterIcon.cs b/osu.Game/Overlays/Profile/SupporterIcon.cs index 0b40281193..1ac6daa19e 100644 --- a/osu.Game/Overlays/Profile/SupporterIcon.cs +++ b/osu.Game/Overlays/Profile/SupporterIcon.cs @@ -15,7 +15,7 @@ namespace osu.Game.Overlays.Profile public class SupporterIcon : CircularContainer, IHasToolTip { private readonly Box background; - + public string TooltipText => "osu!supporter"; public SupporterIcon() From 9660e0885b11acbcade28cd1799dc39501fe1478 Mon Sep 17 00:00:00 2001 From: jai_ Date: Fri, 29 Dec 2017 19:20:37 +0000 Subject: [PATCH 44/64] correctly name tooltip interface --- osu.Game/Overlays/Profile/SupporterIcon.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Profile/SupporterIcon.cs b/osu.Game/Overlays/Profile/SupporterIcon.cs index 1ac6daa19e..b5cd94e54b 100644 --- a/osu.Game/Overlays/Profile/SupporterIcon.cs +++ b/osu.Game/Overlays/Profile/SupporterIcon.cs @@ -12,7 +12,7 @@ using osu.Game.Graphics.Backgrounds; namespace osu.Game.Overlays.Profile { - public class SupporterIcon : CircularContainer, IHasToolTip + public class SupporterIcon : CircularContainer, IHasTooltip { private readonly Box background; From b99e0a0439cab0fa7c0831018605f53631f9865a Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Sat, 30 Dec 2017 14:15:42 +0900 Subject: [PATCH 45/64] Fix DrawableHitCircle accepting a base OsuHitObject parameter Fixes #1778. --- osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index a973d2b580..736bc5267d 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private readonly NumberPiece number; private readonly GlowPiece glow; - public DrawableHitCircle(OsuHitObject h) : base(h) + public DrawableHitCircle(HitCircle h) : base(h) { Origin = Anchor.Centre; @@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }, number = new NumberPiece { - Text = h is Spinner ? "S" : (HitObject.ComboIndex + 1).ToString(), + Text = (HitObject.ComboIndex + 1).ToString(), }, ring = new RingPiece(), flash = new FlashPiece(), From a0966305d4fae937ab12fdfa354d6f5bff4de54e Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 30 Dec 2017 14:46:44 +0900 Subject: [PATCH 46/64] Remove unnecessary new event --- osu.Game.Rulesets.Osu/Mods/OsuMod.cs | 10 +--------- .../Rulesets/Objects/Drawables/DrawableHitObject.cs | 8 -------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs index cc52a6eb72..7b1f80f439 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuMod.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuMod.cs @@ -42,19 +42,11 @@ namespace osu.Game.Rulesets.Osu.Mods { foreach (var d in drawables.OfType()) { - d.ApplyCustomValues += ApplyHiddenValues; d.ApplyCustomUpdateState += ApplyHiddenState; + d.FadeInDuration = preEmpt * fade_in_duration_multiplier; } } - protected void ApplyHiddenValues(DrawableHitObject drawable) - { - if (!(drawable is DrawableOsuHitObject d)) - return; - - d.FadeInDuration = preEmpt * fade_in_duration_multiplier; - } - protected void ApplyHiddenState(DrawableHitObject drawable, ArmedState state) { if (!(drawable is DrawableOsuHitObject d)) diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index 76afd57178..af038909d2 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -120,9 +120,6 @@ namespace osu.Game.Rulesets.Objects.Drawables State.ValueChanged += state => { - // apply any custom values - ApplyCustomValues?.Invoke(this); - UpdateState(state); // apply any custom state overrides @@ -253,11 +250,6 @@ namespace osu.Game.Rulesets.Objects.Drawables nestedHitObjects.Add(h); } - /// - /// Bind to apply custom values. - /// - public event Action ApplyCustomValues; - /// /// Bind to apply a custom state which can override the default implementation. /// From a2840d2519a6faddfd7346fd6275690552493a4c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 30 Dec 2017 15:21:25 +0900 Subject: [PATCH 47/64] Fix FadeInDuration not being passed down to sliders' InitialCircle --- .../Objects/Drawables/DrawableOsuHitObject.cs | 2 +- .../Objects/Drawables/DrawableSlider.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index 33657c200f..f5f0300ae1 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables /// /// The number of milliseconds used to fade in. /// - public double FadeInDuration = TIME_FADEIN; + public virtual double FadeInDuration { get; set; } = TIME_FADEIN; public override bool IsPresent => base.IsPresent || State.Value == ArmedState.Idle && Time.Current >= HitObject.StartTime - TIME_PREEMPT; diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 9c04acb011..022bedf1fd 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -27,7 +27,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables public readonly SliderBody Body; public readonly SliderBall Ball; - public DrawableSlider(Slider s) : base(s) + public DrawableSlider(Slider s) + : base(s) { slider = s; @@ -50,7 +51,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables }, InitialCircle = new DrawableHitCircle(new HitCircle { - //todo: avoid creating this temporary HitCircle. StartTime = s.StartTime, Position = s.StackedPosition, ComboIndex = s.ComboIndex, @@ -105,6 +105,12 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables private int currentRepeat; public bool Tracking; + public override double FadeInDuration + { + get { return base.FadeInDuration; } + set { InitialCircle.FadeInDuration = base.FadeInDuration = value; } + } + protected override void Update() { base.Update(); From 0bd1b75d0b4910b14c69dfbd6c17c7f892091fff Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 30 Dec 2017 15:38:10 +0900 Subject: [PATCH 48/64] Fix test case --- osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs index e669dd234a..cdce19ad21 100644 --- a/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Tests/TestCaseHitCircle.cs @@ -94,7 +94,7 @@ namespace osu.Game.Rulesets.Osu.Tests { private readonly bool auto; - public TestDrawableHitCircle(OsuHitObject h, bool auto) : base(h) + public TestDrawableHitCircle(HitCircle h, bool auto) : base(h) { this.auto = auto; } From 1ab2c0e21b5aec815d7b431f3a2944936b3a1fe1 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Sat, 30 Dec 2017 16:45:59 +0900 Subject: [PATCH 49/64] Update framework --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 797a351db2..0c48da1d49 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 797a351db2e852fef5296453641ffbf6b2f6dc11 +Subproject commit 0c48da1d49f470d56aeab9b15651ce0a4f5ac261 From 616ad5b723bfaaa4be5a58e944372bed4bed8971 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Sat, 30 Dec 2017 16:55:01 +0900 Subject: [PATCH 50/64] Cleanups --- osu.Game/Overlays/Mods/ModButton.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/osu.Game/Overlays/Mods/ModButton.cs b/osu.Game/Overlays/Mods/ModButton.cs index e81ff44f03..35c2e9234d 100644 --- a/osu.Game/Overlays/Mods/ModButton.cs +++ b/osu.Game/Overlays/Mods/ModButton.cs @@ -204,13 +204,13 @@ namespace osu.Game.Overlays.Mods { iconsContainer.AddRange(new[] { - backgroundIcon = new DisplayableModIcon(Mods[1]) + backgroundIcon = new PassThroughTooltipModIcon(Mods[1]) { Origin = Anchor.BottomRight, Anchor = Anchor.BottomRight, Position = new Vector2(1.5f), }, - foregroundIcon = new DisplayableModIcon(Mods[0]) + foregroundIcon = new PassThroughTooltipModIcon(Mods[0]) { Origin = Anchor.BottomRight, Anchor = Anchor.BottomRight, @@ -220,7 +220,7 @@ namespace osu.Game.Overlays.Mods } else { - iconsContainer.Add(foregroundIcon = new DisplayableModIcon(Mod) + iconsContainer.Add(foregroundIcon = new PassThroughTooltipModIcon(Mod) { Origin = Anchor.Centre, Anchor = Anchor.Centre, @@ -260,14 +260,13 @@ namespace osu.Game.Overlays.Mods Mod = mod; } - private class DisplayableModIcon : ModIcon { + private class PassThroughTooltipModIcon : ModIcon + { + public override string TooltipText => null; - public override string TooltipText { get; } - - public DisplayableModIcon(Mod mod) : base(mod) { - TooltipText = null; + public PassThroughTooltipModIcon(Mod mod) : base(mod) + { } - } } } From 1f71bd3425910870b843c36a1dbbcffe5657dc8c Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 09:05:40 +0100 Subject: [PATCH 51/64] scale the correct part of the repeat point --- .../Objects/Drawables/DrawableRepeatPoint.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs index dc64294eea..4f3f951948 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs @@ -24,17 +24,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables this.repeatPoint = repeatPoint; this.drawableSlider = drawableSlider; - AutoSizeAxes = Axes.Both; + Size = new Vector2(32 * repeatPoint.Scale); + Blending = BlendingMode.Additive; Origin = Anchor.Centre; + Children = new Drawable[] { new SpriteIcon { - Icon = FontAwesome.fa_eercast, - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - Size = new Vector2(32 * repeatPoint.Scale), + RelativeSizeAxes = Axes.Both, + Icon = FontAwesome.fa_eercast } }; } From 03e9b05c3fba27c1e65a4880d3cb8c694d2f1cc3 Mon Sep 17 00:00:00 2001 From: Techno-coder Date: Sat, 30 Dec 2017 21:38:33 +1300 Subject: [PATCH 52/64] Add Getting Started section to Readme and MonoDevelop IDE for Linux --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 856536d22d..f9936e9259 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,13 @@ This is still heavily under development and is not intended for end-user use. Th # Requirements -- A desktop platform which can compile .NET 4.5 (tested on macOS, linux and windows). We recommend using [Visual Studio Code](https://code.visualstudio.com/) (all platforms) or [Visual Studio Community Edition](https://www.visualstudio.com/) (windows only), both of which are free. +- A desktop platform which can compile .NET 4.5 (tested on macOS, linux and windows). We recommend using [MonoDevelop](http://www.monodevelop.com/download/) (Linux), [Visual Studio Code](https://code.visualstudio.com/) (macOS) or [Visual Studio Community Edition](https://www.visualstudio.com/) (Windows), all of which are free. - Make sure you initialise and keep submodules up-to-date. +# Getting Started +- Clone the repository including submodules (`git clone --recurse-submodules https://github.com/ppy/osu`) +- Build in your IDE of choice (recommended IDEs automatically restore nuget packages; if you are using an alternative make sure to `nuget restore`) + # Contributing We welcome all contributions, but keep in mind that we already have a lot of the UI designed. If you wish to work on something with the intention on having it included in the official distribution, please open an issue for discussion and we will give you what you need from a design perspective to proceed. If you want to make *changes* to the design, we recommend you open an issue with your intentions before spending too much time, to ensure no effort is wasted. From e28f91a6028dd8b60231e9da40ecf99b29181b8c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 30 Dec 2017 18:20:51 +0900 Subject: [PATCH 53/64] Improve wording and fix macOS requirement --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index f9936e9259..47df86f57e 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,7 @@ This is still heavily under development and is not intended for end-user use. Th # Requirements -- A desktop platform which can compile .NET 4.5 (tested on macOS, linux and windows). We recommend using [MonoDevelop](http://www.monodevelop.com/download/) (Linux), [Visual Studio Code](https://code.visualstudio.com/) (macOS) or [Visual Studio Community Edition](https://www.visualstudio.com/) (Windows), all of which are free. -- Make sure you initialise and keep submodules up-to-date. +- A desktop platform that can compile .NET 4.6.1. We recommend using [Visual Studio Community Edition](https://www.visualstudio.com/) (Windows), [Visual Studio for Mac](https://www.visualstudio.com/vs/visual-studio-mac/) (macOS) or [MonoDevelop](http://www.monodevelop.com/download/) (Linux), all of which are free. [Visual Studio Code](https://code.visualstudio.com/) may also be used but requires further setup steps which are not covered here. # Getting Started - Clone the repository including submodules (`git clone --recurse-submodules https://github.com/ppy/osu`) From 86a00411d719e4a55e4f0466c213f6d41ac33994 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Sat, 30 Dec 2017 19:58:01 +0900 Subject: [PATCH 54/64] Update framework Reverts fillflow changes. --- osu-framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu-framework b/osu-framework index 0c48da1d49..6134dafccb 160000 --- a/osu-framework +++ b/osu-framework @@ -1 +1 @@ -Subproject commit 0c48da1d49f470d56aeab9b15651ce0a4f5ac261 +Subproject commit 6134dafccb3368dac96d837537325c04b89fb8ee From f7fe0830181e28248f29131afd2b1feaa1b6da0a Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 14:57:57 +0100 Subject: [PATCH 55/64] add tooltip to country flags --- .../BeatmapSet/Scores/DrawableScore.cs | 2 +- .../BeatmapSet/Scores/DrawableTopScore.cs | 2 +- osu.Game/Overlays/Profile/ProfileHeader.cs | 4 +- .../Screens/Multiplayer/ParticipantInfo.cs | 2 +- .../Select/Leaderboards/LeaderboardScore.cs | 2 +- osu.Game/Users/Country.cs | 43 +++++++++++-------- osu.Game/Users/UserPanel.cs | 2 +- 7 files changed, 32 insertions(+), 25 deletions(-) diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs index 5a3aba7b43..8b407ac208 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs @@ -48,7 +48,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores Font = @"Exo2.0-RegularItalic", Margin = new MarginPadding { Left = side_margin } }, - new DrawableFlag(score.User.Country?.FlagName) + new DrawableFlag(score.User.Country) { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs index 833ed94c0f..66bf89bbac 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs @@ -52,7 +52,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores score = value; avatar.User = username.User = score.User; - flag.FlagName = score.User.Country?.FlagName; + flag.Country = score.User.Country; date.Text = $@"achieved {score.Date:MMM d, yyyy}"; rank.UpdateRank(score.Rank); diff --git a/osu.Game/Overlays/Profile/ProfileHeader.cs b/osu.Game/Overlays/Profile/ProfileHeader.cs index 18e77cf186..960bb60287 100644 --- a/osu.Game/Overlays/Profile/ProfileHeader.cs +++ b/osu.Game/Overlays/Profile/ProfileHeader.cs @@ -109,7 +109,7 @@ namespace osu.Game.Overlays.Profile Origin = Anchor.BottomLeft, Y = -48, }, - countryFlag = new DrawableFlag(user.Country?.FlagName) + countryFlag = new DrawableFlag(user.Country) { Anchor = Anchor.BottomLeft, Origin = Anchor.BottomLeft, @@ -333,7 +333,7 @@ namespace osu.Game.Overlays.Profile { infoTextLeft.AddText("from "); infoTextLeft.AddText(user.Country.FullName, boldItalic); - countryFlag.FlagName = user.Country.FlagName; + countryFlag.Country = user.Country; } infoTextLeft.NewParagraph(); diff --git a/osu.Game/Screens/Multiplayer/ParticipantInfo.cs b/osu.Game/Screens/Multiplayer/ParticipantInfo.cs index fa48287ce1..2197b7477c 100644 --- a/osu.Game/Screens/Multiplayer/ParticipantInfo.cs +++ b/osu.Game/Screens/Multiplayer/ParticipantInfo.cs @@ -27,7 +27,7 @@ namespace osu.Game.Screens.Multiplayer set { host.Text = value.Username; - flagContainer.Children = new[] { new DrawableFlag(value.Country?.FlagName) { RelativeSizeAxes = Axes.Both } }; + flagContainer.Children = new[] { new DrawableFlag(value.Country) { RelativeSizeAxes = Axes.Both } }; } } diff --git a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs index 03466439ad..e0c9a3e04e 100644 --- a/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs +++ b/osu.Game/Screens/Select/Leaderboards/LeaderboardScore.cs @@ -145,7 +145,7 @@ namespace osu.Game.Screens.Select.Leaderboards Masking = true, Children = new Drawable[] { - new DrawableFlag(Score.User?.Country?.FlagName) + new DrawableFlag(Score.User?.Country) { Width = 30, RelativeSizeAxes = Axes.Y, diff --git a/osu.Game/Users/Country.cs b/osu.Game/Users/Country.cs index 0c0d12c1cc..46ddaee637 100644 --- a/osu.Game/Users/Country.cs +++ b/osu.Game/Users/Country.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; @@ -26,36 +27,30 @@ namespace osu.Game.Users public string FlagName; } - public class DrawableFlag : Container + public class DrawableFlag : Container, IHasTooltip { private readonly Sprite sprite; private TextureStore textures; - private string flagName; - public string FlagName + private Country country; + public Country Country { - get { return flagName; } + get { return country; } set { - if (value == flagName) return; - flagName = value; - sprite.Texture = textures.Get($@"Flags/{flagName}"); + if (value == country) + return; + + country = value; + sprite.Texture = getFlagTexture(); } } - [BackgroundDependencyLoader] - private void load(TextureStore ts) - { - if (ts == null) - throw new ArgumentNullException(nameof(ts)); + public string TooltipText => country?.FullName; - textures = ts; - sprite.Texture = textures.Get($@"Flags/{flagName}"); - } - - public DrawableFlag(string name = null) + public DrawableFlag(Country country = null) { - flagName = name ?? @"__"; + this.country = country; Children = new Drawable[] { @@ -65,5 +60,17 @@ namespace osu.Game.Users }, }; } + + [BackgroundDependencyLoader] + private void load(TextureStore ts) + { + if (ts == null) + throw new ArgumentNullException(nameof(ts)); + + textures = ts; + sprite.Texture = getFlagTexture(); + } + + private Texture getFlagTexture() => textures.Get($@"Flags/{country?.FlagName ?? @"__"}"); } } diff --git a/osu.Game/Users/UserPanel.cs b/osu.Game/Users/UserPanel.cs index a2cc8e8d49..e0a4e3184d 100644 --- a/osu.Game/Users/UserPanel.cs +++ b/osu.Game/Users/UserPanel.cs @@ -114,7 +114,7 @@ namespace osu.Game.Users Spacing = new Vector2(5f, 0f), Children = new Drawable[] { - new DrawableFlag(user.Country?.FlagName) + new DrawableFlag(user.Country) { Width = 30f, RelativeSizeAxes = Axes.Y, From 138d78309f3af57e27f363c806d8d78934986cd7 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 18:07:30 +0100 Subject: [PATCH 56/64] add HitCount enum and replace string usage with enum --- .../Scoring/OsuPerformanceCalculator.cs | 9 +++++---- .../Scoring/OsuScoreProcessor.cs | 12 ++++++------ .../Visual/TestCaseBeatmapScoresContainer.cs | 19 ++++++++++--------- osu.Game.Tests/Visual/TestCaseResults.cs | 11 ++++++----- .../Online/API/Requests/GetScoresRequest.cs | 14 +++++++------- .../BeatmapSet/Scores/DrawableScore.cs | 3 ++- .../BeatmapSet/Scores/DrawableTopScore.cs | 3 ++- osu.Game/Rulesets/Scoring/Score.cs | 18 +++++++++++++++++- osu.Game/Screens/Ranking/ResultsPageScore.cs | 8 +++++--- 9 files changed, 60 insertions(+), 37 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs b/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs index 2cf321da50..0d9dc0e43b 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs @@ -10,6 +10,7 @@ using osu.Game.Rulesets.Osu.Beatmaps; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Rulesets.Osu.Scoring { @@ -41,10 +42,10 @@ namespace osu.Game.Rulesets.Osu.Scoring mods = Score.Mods; accuracy = Score.Accuracy; scoreMaxCombo = Score.MaxCombo; - count300 = Convert.ToInt32(Score.Statistics["300"]); - count100 = Convert.ToInt32(Score.Statistics["100"]); - count50 = Convert.ToInt32(Score.Statistics["50"]); - countMiss = Convert.ToInt32(Score.Statistics["x"]); + count300 = Convert.ToInt32(Score.Statistics[HitCount.Great]); + count100 = Convert.ToInt32(Score.Statistics[HitCount.Good]); + count50 = Convert.ToInt32(Score.Statistics[HitCount.Meh]); + countMiss = Convert.ToInt32(Score.Statistics[HitCount.Miss]); // Don't count scores made with supposedly unranked mods if (mods.Any(m => !m.Ranked)) diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs index ad9737af52..1c376d7c63 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs @@ -12,6 +12,7 @@ using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Rulesets.Osu.Scoring { @@ -33,8 +34,7 @@ namespace osu.Game.Rulesets.Osu.Scoring foreach (var obj in beatmap.HitObjects) { - var slider = obj as Slider; - if (slider != null) + if (obj is Slider slider) { // Head AddJudgement(new OsuJudgement { Result = HitResult.Great }); @@ -64,10 +64,10 @@ namespace osu.Game.Rulesets.Osu.Scoring { base.PopulateScore(score); - score.Statistics[@"300"] = scoreResultCounts.GetOrDefault(HitResult.Great); - score.Statistics[@"100"] = scoreResultCounts.GetOrDefault(HitResult.Good); - score.Statistics[@"50"] = scoreResultCounts.GetOrDefault(HitResult.Meh); - score.Statistics[@"x"] = scoreResultCounts.GetOrDefault(HitResult.Miss); + score.Statistics[HitCount.Great] = scoreResultCounts.GetOrDefault(HitResult.Great); + score.Statistics[HitCount.Good] = scoreResultCounts.GetOrDefault(HitResult.Good); + score.Statistics[HitCount.Meh] = scoreResultCounts.GetOrDefault(HitResult.Meh); + score.Statistics[HitCount.Miss] = scoreResultCounts.GetOrDefault(HitResult.Miss); } protected override void OnNewJudgement(Judgement judgement) diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs b/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs index cef8797f20..75ec0481e8 100644 --- a/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs +++ b/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs @@ -14,6 +14,7 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Users; using System.Collections.Generic; using osu.Framework.Graphics.Containers; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Tests.Visual { @@ -160,9 +161,9 @@ namespace osu.Game.Tests.Visual }; foreach(var s in scores) { - s.Statistics.Add("300", RNG.Next(2000)); - s.Statistics.Add("100", RNG.Next(2000)); - s.Statistics.Add("50", RNG.Next(2000)); + s.Statistics.Add(HitCount.Great, RNG.Next(2000)); + s.Statistics.Add(HitCount.Good, RNG.Next(2000)); + s.Statistics.Add(HitCount.Meh, RNG.Next(2000)); } anotherScores = new[] @@ -272,9 +273,9 @@ namespace osu.Game.Tests.Visual }; foreach (var s in anotherScores) { - s.Statistics.Add("300", RNG.Next(2000)); - s.Statistics.Add("100", RNG.Next(2000)); - s.Statistics.Add("50", RNG.Next(2000)); + s.Statistics.Add(HitCount.Great, RNG.Next(2000)); + s.Statistics.Add(HitCount.Good, RNG.Next(2000)); + s.Statistics.Add(HitCount.Meh, RNG.Next(2000)); } topScore = new OnlineScore @@ -299,9 +300,9 @@ namespace osu.Game.Tests.Visual TotalScore = 987654321, Accuracy = 0.8487, }; - topScore.Statistics.Add("300", RNG.Next(2000)); - topScore.Statistics.Add("100", RNG.Next(2000)); - topScore.Statistics.Add("50", RNG.Next(2000)); + topScore.Statistics.Add(HitCount.Great, RNG.Next(2000)); + topScore.Statistics.Add(HitCount.Good, RNG.Next(2000)); + topScore.Statistics.Add(HitCount.Meh, RNG.Next(2000)); } [BackgroundDependencyLoader] diff --git a/osu.Game.Tests/Visual/TestCaseResults.cs b/osu.Game.Tests/Visual/TestCaseResults.cs index d0c5aa4939..5190baff4e 100644 --- a/osu.Game.Tests/Visual/TestCaseResults.cs +++ b/osu.Game.Tests/Visual/TestCaseResults.cs @@ -8,6 +8,7 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Scoring; using osu.Game.Screens.Ranking; using osu.Game.Users; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Tests.Visual { @@ -41,12 +42,12 @@ namespace osu.Game.Tests.Visual MaxCombo = 123, Rank = ScoreRank.A, Date = DateTimeOffset.Now, - Statistics = new Dictionary + Statistics = new Dictionary { - { "300", 50 }, - { "100", 20 }, - { "50", 50 }, - { "x", 1 } + { HitCount.Great, 50 }, + { HitCount.Good, 20 }, + { HitCount.Meh, 50 }, + { HitCount.Miss, 1 } }, User = new User { diff --git a/osu.Game/Online/API/Requests/GetScoresRequest.cs b/osu.Game/Online/API/Requests/GetScoresRequest.cs index 065c770738..9e5aa6d93f 100644 --- a/osu.Game/Online/API/Requests/GetScoresRequest.cs +++ b/osu.Game/Online/API/Requests/GetScoresRequest.cs @@ -122,26 +122,26 @@ namespace osu.Game.Online.API.Requests { foreach (var kvp in value) { - string key = kvp.Key; - switch (key) + HitCount newKey; + switch (kvp.Key) { case @"count_300": - key = @"300"; + newKey = HitCount.Great; break; case @"count_100": - key = @"100"; + newKey = HitCount.Good; break; case @"count_50": - key = @"50"; + newKey = HitCount.Meh; break; case @"count_miss": - key = @"x"; + newKey = HitCount.Miss; break; default: continue; } - Statistics.Add(key, kvp.Value); + Statistics.Add(newKey, kvp.Value); } } } diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs index 8b407ac208..301c62ee77 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs @@ -15,6 +15,7 @@ using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Overlays.BeatmapSet.Scores { @@ -104,7 +105,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Text = $"{score.Statistics["300"]}/{score.Statistics["100"]}/{score.Statistics["50"]}", + Text = $"{score.Statistics[HitCount.Great]}/{score.Statistics[HitCount.Good]}/{score.Statistics[HitCount.Meh]}", Font = @"Exo2.0-RegularItalic", Margin = new MarginPadding { Right = side_margin } }, diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs index 66bf89bbac..612728ff4c 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs @@ -18,6 +18,7 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; +using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Overlays.BeatmapSet.Scores { @@ -58,7 +59,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores totalScore.Value = $@"{score.TotalScore:N0}"; accuracy.Value = $@"{score.Accuracy:P2}"; - statistics.Value = $"{score.Statistics["300"]}/{score.Statistics["100"]}/{score.Statistics["50"]}"; + statistics.Value = $"{score.Statistics[HitCount.Great]}/{score.Statistics[HitCount.Good]}/{score.Statistics[HitCount.Meh]}"; modsContainer.Clear(); foreach (Mod mod in score.Mods) diff --git a/osu.Game/Rulesets/Scoring/Score.cs b/osu.Game/Rulesets/Scoring/Score.cs index 6a06f364c6..56c7bc583f 100644 --- a/osu.Game/Rulesets/Scoring/Score.cs +++ b/osu.Game/Rulesets/Scoring/Score.cs @@ -7,6 +7,7 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Mods; using osu.Game.Users; using osu.Game.Rulesets.Replays; +using System.ComponentModel; namespace osu.Game.Rulesets.Scoring { @@ -40,6 +41,21 @@ namespace osu.Game.Rulesets.Scoring public DateTimeOffset Date; - public Dictionary Statistics = new Dictionary(); + public Dictionary Statistics = new Dictionary(); + + public enum HitCount + { + [Description("300")] + Great, + + [Description("100")] + Good, + + [Description("50")] + Meh, + + [Description("x")] + Miss + } } } diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 25a42cae1c..e2de44ab14 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -23,6 +23,8 @@ using osu.Game.Screens.Play; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; using osu.Framework.Graphics.Shapes; +using static osu.Game.Rulesets.Scoring.Score; +using osu.Framework.Extensions; namespace osu.Game.Screens.Ranking { @@ -186,9 +188,9 @@ namespace osu.Game.Screens.Ranking private class DrawableScoreStatistic : Container { - private readonly KeyValuePair statistic; + private readonly KeyValuePair statistic; - public DrawableScoreStatistic(KeyValuePair statistic) + public DrawableScoreStatistic(KeyValuePair statistic) { this.statistic = statistic; @@ -209,7 +211,7 @@ namespace osu.Game.Screens.Ranking Origin = Anchor.TopCentre, }, new OsuSpriteText { - Text = statistic.Key, + Text = statistic.Key.GetDescription(), Colour = colours.Gray7, Font = @"Exo2.0-Bold", Y = 26, From 1ef4ff6776be903f64df9b63deba3808a8d6d7e5 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 18:07:53 +0100 Subject: [PATCH 57/64] order statistics before adding to resultpage --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index e2de44ab14..6d2aa8fce8 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -165,7 +165,7 @@ namespace osu.Game.Screens.Ranking } }; - statisticsContainer.ChildrenEnumerable = Score.Statistics.Select(s => new DrawableScoreStatistic(s)); + statisticsContainer.ChildrenEnumerable = Score.Statistics.OrderBy(p => p.Key).Select(s => new DrawableScoreStatistic(s)); } protected override void LoadComplete() From ccb69d16d9c81a056da0b07f340e2e14a1a8894b Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 21:23:18 +0100 Subject: [PATCH 58/64] move HitResult in Scoring namespace to replace HitCount --- .../Drawable/DrawableCatchHitObject.cs | 1 + .../Scoring/CatchScoreProcessor.cs | 1 - .../Judgements/HitWindows.cs | 2 +- .../Judgements/HoldNoteTailJudgement.cs | 4 ++-- .../Judgements/HoldNoteTickJudgement.cs | 4 ++-- .../Judgements/ManiaJudgement.cs | 2 +- .../Objects/Drawables/DrawableHoldNote.cs | 1 + .../Objects/Drawables/DrawableHoldNoteTick.cs | 3 ++- .../Objects/Drawables/DrawableNote.cs | 1 + .../Scoring/ManiaScoreProcessor.cs | 1 - .../Tests/TestCaseManiaPlayfield.cs | 2 +- .../Judgements/OsuJudgement.cs | 4 ++-- .../Objects/Drawables/DrawableHitCircle.cs | 1 + .../Objects/Drawables/DrawableOsuJudgement.cs | 4 ++-- .../Objects/Drawables/DrawableRepeatPoint.cs | 1 + .../Objects/Drawables/DrawableSlider.cs | 1 + .../Objects/Drawables/DrawableSliderTick.cs | 1 + .../Objects/Drawables/DrawableSpinner.cs | 1 + osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs | 2 +- .../Replays/OsuAutoGenerator.cs | 2 +- .../Scoring/OsuPerformanceCalculator.cs | 9 ++++----- .../Scoring/OsuScoreProcessor.cs | 10 ++++------ .../Judgements/TaikoDrumRollTickJudgement.cs | 4 ++-- .../Judgements/TaikoJudgement.cs | 2 +- .../Objects/Drawables/DrawableDrumRoll.cs | 1 + .../Objects/Drawables/DrawableDrumRollTick.cs | 1 + .../Objects/Drawables/DrawableHit.cs | 1 + .../Objects/Drawables/DrawableHitStrong.cs | 2 +- .../Objects/Drawables/DrawableSwell.cs | 1 + .../Scoring/TaikoScoreProcessor.cs | 1 - .../Tests/TestCaseTaikoPlayfield.cs | 1 + .../UI/DrawableTaikoJudgement.cs | 3 ++- .../Visual/TestCaseBeatmapScoresContainer.cs | 19 +++++++++---------- osu.Game.Tests/Visual/TestCaseResults.cs | 11 +++++------ .../Online/API/Requests/GetScoresRequest.cs | 10 +++++----- .../BeatmapSet/Scores/DrawableScore.cs | 4 ++-- .../BeatmapSet/Scores/DrawableTopScore.cs | 3 +-- .../Rulesets/Judgements/DrawableJudgement.cs | 2 +- osu.Game/Rulesets/Judgements/Judgement.cs | 1 + .../Objects/Drawables/DrawableHitObject.cs | 1 + .../Drawables => Scoring}/HitResult.cs | 2 +- osu.Game/Rulesets/Scoring/Score.cs | 18 +----------------- osu.Game/Rulesets/Scoring/ScoreProcessor.cs | 1 - .../Screens/Play/HUD/StandardHealthDisplay.cs | 2 +- osu.Game/Screens/Ranking/ResultsPageScore.cs | 5 ++--- osu.Game/osu.Game.csproj | 2 +- 46 files changed, 73 insertions(+), 83 deletions(-) rename osu.Game/Rulesets/{Objects/Drawables => Scoring}/HitResult.cs (91%) diff --git a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableCatchHitObject.cs b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableCatchHitObject.cs index b90a06b94e..a617b65676 100644 --- a/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableCatchHitObject.cs +++ b/osu.Game.Rulesets.Catch/Objects/Drawable/DrawableCatchHitObject.cs @@ -6,6 +6,7 @@ using osu.Framework.Graphics; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects.Drawables; using OpenTK; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Catch.Objects.Drawable { diff --git a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs index 3826fd1129..3b9eacde9c 100644 --- a/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs +++ b/osu.Game.Rulesets.Catch/Scoring/CatchScoreProcessor.cs @@ -5,7 +5,6 @@ using System.Linq; using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Judgements; using osu.Game.Rulesets.Catch.Objects; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; diff --git a/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs b/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs index d7bfa9caa1..ded1bc17af 100644 --- a/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs +++ b/osu.Game.Rulesets.Mania/Judgements/HitWindows.cs @@ -2,7 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Game.Beatmaps; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Judgements { diff --git a/osu.Game.Rulesets.Mania/Judgements/HoldNoteTailJudgement.cs b/osu.Game.Rulesets.Mania/Judgements/HoldNoteTailJudgement.cs index a8d1b079eb..e369df6ae1 100644 --- a/osu.Game.Rulesets.Mania/Judgements/HoldNoteTailJudgement.cs +++ b/osu.Game.Rulesets.Mania/Judgements/HoldNoteTailJudgement.cs @@ -1,7 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Judgements { @@ -24,4 +24,4 @@ namespace osu.Game.Rulesets.Mania.Judgements } } } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Mania/Judgements/HoldNoteTickJudgement.cs b/osu.Game.Rulesets.Mania/Judgements/HoldNoteTickJudgement.cs index d326c6fc0a..4787a4977b 100644 --- a/osu.Game.Rulesets.Mania/Judgements/HoldNoteTickJudgement.cs +++ b/osu.Game.Rulesets.Mania/Judgements/HoldNoteTickJudgement.cs @@ -1,7 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Judgements { @@ -11,4 +11,4 @@ namespace osu.Game.Rulesets.Mania.Judgements protected override int NumericResultFor(HitResult result) => 20; } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Mania/Judgements/ManiaJudgement.cs b/osu.Game.Rulesets.Mania/Judgements/ManiaJudgement.cs index 1f3b352da4..4762a98c40 100644 --- a/osu.Game.Rulesets.Mania/Judgements/ManiaJudgement.cs +++ b/osu.Game.Rulesets.Mania/Judgements/ManiaJudgement.cs @@ -2,7 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Judgements { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs index 7b207ca229..41d817a746 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNote.cs @@ -12,6 +12,7 @@ using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Mania.Judgements; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Input.Bindings; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Objects.Drawables { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTick.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTick.cs index 557fbf6ea8..8ed5d2b924 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTick.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTick.cs @@ -10,6 +10,7 @@ using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Mania.Judgements; using osu.Game.Rulesets.Objects.Drawables; using osu.Framework.Graphics.Shapes; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Objects.Drawables { @@ -113,4 +114,4 @@ namespace osu.Game.Rulesets.Mania.Objects.Drawables UpdateJudgement(true); } } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs index 537246509b..aabfcafa85 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableNote.cs @@ -8,6 +8,7 @@ using osu.Framework.Input.Bindings; using osu.Game.Rulesets.Mania.Judgements; using osu.Game.Rulesets.Mania.Objects.Drawables.Pieces; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Objects.Drawables { diff --git a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs index 012137f555..140bab2225 100644 --- a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs +++ b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs @@ -6,7 +6,6 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Mania.Judgements; using osu.Game.Rulesets.Mania.Objects; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; diff --git a/osu.Game.Rulesets.Mania/Tests/TestCaseManiaPlayfield.cs b/osu.Game.Rulesets.Mania/Tests/TestCaseManiaPlayfield.cs index 1932038411..b5890b289f 100644 --- a/osu.Game.Rulesets.Mania/Tests/TestCaseManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/Tests/TestCaseManiaPlayfield.cs @@ -13,7 +13,7 @@ using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mania.Objects.Drawables; using osu.Game.Rulesets.Mania.Timing; using osu.Game.Rulesets.Mania.UI; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Timing; using osu.Game.Tests.Visual; diff --git a/osu.Game.Rulesets.Osu/Judgements/OsuJudgement.cs b/osu.Game.Rulesets.Osu/Judgements/OsuJudgement.cs index 28b6a04376..cd9c3888df 100644 --- a/osu.Game.Rulesets.Osu/Judgements/OsuJudgement.cs +++ b/osu.Game.Rulesets.Osu/Judgements/OsuJudgement.cs @@ -4,7 +4,7 @@ using OpenTK; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Osu.Objects.Drawables; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Judgements { @@ -34,4 +34,4 @@ namespace osu.Game.Rulesets.Osu.Judgements public ComboResult Combo; } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 7bdb6d04b6..6220bbd120 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -7,6 +7,7 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables.Pieces; using OpenTK; using osu.Game.Rulesets.Osu.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs index 7755a54e88..f16a41519e 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuJudgement.cs @@ -2,10 +2,10 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Framework.Graphics; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Judgements; using OpenTK; using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { @@ -24,4 +24,4 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables base.LoadComplete(); } } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs index 4f3f951948..477ced01c6 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableRepeatPoint.cs @@ -7,6 +7,7 @@ using osu.Game.Rulesets.Objects.Drawables; using OpenTK; using osu.Game.Graphics; using osu.Game.Rulesets.Osu.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs index 022bedf1fd..5a8bcae277 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSlider.cs @@ -10,6 +10,7 @@ using System.Linq; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Osu.Judgements; using osu.Framework.Graphics.Primitives; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs index 7199691ae6..bce7ef6141 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs @@ -8,6 +8,7 @@ using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics.Shapes; using osu.Game.Rulesets.Osu.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs index 30c9fb13d0..5351ad50c4 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs @@ -13,6 +13,7 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Allocation; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Screens.Ranking; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects.Drawables { diff --git a/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs index 7532387aa2..a3a6527b31 100644 --- a/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/OsuHitObject.cs @@ -7,7 +7,7 @@ using OpenTK; using osu.Game.Rulesets.Objects.Types; using OpenTK.Graphics; using osu.Game.Beatmaps.ControlPoints; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Objects { diff --git a/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs b/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs index f82c6ce3b2..ba774e887f 100644 --- a/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs +++ b/osu.Game.Rulesets.Osu/Replays/OsuAutoGenerator.cs @@ -9,9 +9,9 @@ using osu.Game.Rulesets.Osu.Objects.Drawables; using System; using System.Diagnostics; using osu.Framework.Graphics; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Replays; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Osu.Replays { diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs b/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs index 0d9dc0e43b..38c602bc42 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuPerformanceCalculator.cs @@ -10,7 +10,6 @@ using osu.Game.Rulesets.Osu.Beatmaps; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Scoring; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Rulesets.Osu.Scoring { @@ -42,10 +41,10 @@ namespace osu.Game.Rulesets.Osu.Scoring mods = Score.Mods; accuracy = Score.Accuracy; scoreMaxCombo = Score.MaxCombo; - count300 = Convert.ToInt32(Score.Statistics[HitCount.Great]); - count100 = Convert.ToInt32(Score.Statistics[HitCount.Good]); - count50 = Convert.ToInt32(Score.Statistics[HitCount.Meh]); - countMiss = Convert.ToInt32(Score.Statistics[HitCount.Miss]); + count300 = Convert.ToInt32(Score.Statistics[HitResult.Great]); + count100 = Convert.ToInt32(Score.Statistics[HitResult.Good]); + count50 = Convert.ToInt32(Score.Statistics[HitResult.Meh]); + countMiss = Convert.ToInt32(Score.Statistics[HitResult.Miss]); // Don't count scores made with supposedly unranked mods if (mods.Any(m => !m.Ranked)) diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs index 1c376d7c63..7520e1801c 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuScoreProcessor.cs @@ -6,13 +6,11 @@ using System.Linq; using osu.Framework.Extensions; using osu.Game.Beatmaps; using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Rulesets.Osu.Scoring { @@ -64,10 +62,10 @@ namespace osu.Game.Rulesets.Osu.Scoring { base.PopulateScore(score); - score.Statistics[HitCount.Great] = scoreResultCounts.GetOrDefault(HitResult.Great); - score.Statistics[HitCount.Good] = scoreResultCounts.GetOrDefault(HitResult.Good); - score.Statistics[HitCount.Meh] = scoreResultCounts.GetOrDefault(HitResult.Meh); - score.Statistics[HitCount.Miss] = scoreResultCounts.GetOrDefault(HitResult.Miss); + score.Statistics[HitResult.Great] = scoreResultCounts.GetOrDefault(HitResult.Great); + score.Statistics[HitResult.Good] = scoreResultCounts.GetOrDefault(HitResult.Good); + score.Statistics[HitResult.Meh] = scoreResultCounts.GetOrDefault(HitResult.Meh); + score.Statistics[HitResult.Miss] = scoreResultCounts.GetOrDefault(HitResult.Miss); } protected override void OnNewJudgement(Judgement judgement) diff --git a/osu.Game.Rulesets.Taiko/Judgements/TaikoDrumRollTickJudgement.cs b/osu.Game.Rulesets.Taiko/Judgements/TaikoDrumRollTickJudgement.cs index c9daef8c99..ce5be8d148 100644 --- a/osu.Game.Rulesets.Taiko/Judgements/TaikoDrumRollTickJudgement.cs +++ b/osu.Game.Rulesets.Taiko/Judgements/TaikoDrumRollTickJudgement.cs @@ -1,7 +1,7 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Judgements { @@ -20,4 +20,4 @@ namespace osu.Game.Rulesets.Taiko.Judgements } } } -} \ No newline at end of file +} diff --git a/osu.Game.Rulesets.Taiko/Judgements/TaikoJudgement.cs b/osu.Game.Rulesets.Taiko/Judgements/TaikoJudgement.cs index 3cd134f3f7..70cdd1fe0e 100644 --- a/osu.Game.Rulesets.Taiko/Judgements/TaikoJudgement.cs +++ b/osu.Game.Rulesets.Taiko/Judgements/TaikoJudgement.cs @@ -2,7 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Judgements { diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index 75e988ced6..f5bafefd0b 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -13,6 +13,7 @@ using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Objects.Drawables { diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs index e662f61bbe..a741e35963 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs @@ -4,6 +4,7 @@ using System; using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index fd35f0eaec..0c10c7142e 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs index cda82afe0e..249bb41d91 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs @@ -3,7 +3,7 @@ using System; using System.Linq; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Judgements; namespace osu.Game.Rulesets.Taiko.Objects.Drawables diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index 5ca33aaea2..26e6585fb9 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -14,6 +14,7 @@ using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics.Shapes; using osu.Game.Rulesets.Taiko.Judgements; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Objects.Drawables { diff --git a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs index df9ce5e2eb..3848e36fc9 100644 --- a/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs +++ b/osu.Game.Rulesets.Taiko/Scoring/TaikoScoreProcessor.cs @@ -4,7 +4,6 @@ using System.Linq; using osu.Game.Beatmaps; using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects; diff --git a/osu.Game.Rulesets.Taiko/Tests/TestCaseTaikoPlayfield.cs b/osu.Game.Rulesets.Taiko/Tests/TestCaseTaikoPlayfield.cs index b1e6e9c4ce..1f13864c2a 100644 --- a/osu.Game.Rulesets.Taiko/Tests/TestCaseTaikoPlayfield.cs +++ b/osu.Game.Rulesets.Taiko/Tests/TestCaseTaikoPlayfield.cs @@ -20,6 +20,7 @@ using osu.Game.Rulesets.Taiko.UI; using osu.Game.Tests.Beatmaps; using osu.Game.Tests.Visual; using OpenTK; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Tests { diff --git a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs index 41b66c286b..0b67613ec3 100644 --- a/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs +++ b/osu.Game.Rulesets.Taiko/UI/DrawableTaikoJudgement.cs @@ -6,6 +6,7 @@ using osu.Framework.Allocation; using osu.Game.Graphics; using osu.Game.Rulesets.Judgements; using osu.Framework.Graphics; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.UI { @@ -49,4 +50,4 @@ namespace osu.Game.Rulesets.Taiko.UI base.LoadComplete(); } } -} \ No newline at end of file +} diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs b/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs index 75ec0481e8..ad15833569 100644 --- a/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs +++ b/osu.Game.Tests/Visual/TestCaseBeatmapScoresContainer.cs @@ -14,7 +14,6 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Users; using System.Collections.Generic; using osu.Framework.Graphics.Containers; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Tests.Visual { @@ -161,9 +160,9 @@ namespace osu.Game.Tests.Visual }; foreach(var s in scores) { - s.Statistics.Add(HitCount.Great, RNG.Next(2000)); - s.Statistics.Add(HitCount.Good, RNG.Next(2000)); - s.Statistics.Add(HitCount.Meh, RNG.Next(2000)); + s.Statistics.Add(HitResult.Great, RNG.Next(2000)); + s.Statistics.Add(HitResult.Good, RNG.Next(2000)); + s.Statistics.Add(HitResult.Meh, RNG.Next(2000)); } anotherScores = new[] @@ -273,9 +272,9 @@ namespace osu.Game.Tests.Visual }; foreach (var s in anotherScores) { - s.Statistics.Add(HitCount.Great, RNG.Next(2000)); - s.Statistics.Add(HitCount.Good, RNG.Next(2000)); - s.Statistics.Add(HitCount.Meh, RNG.Next(2000)); + s.Statistics.Add(HitResult.Great, RNG.Next(2000)); + s.Statistics.Add(HitResult.Good, RNG.Next(2000)); + s.Statistics.Add(HitResult.Meh, RNG.Next(2000)); } topScore = new OnlineScore @@ -300,9 +299,9 @@ namespace osu.Game.Tests.Visual TotalScore = 987654321, Accuracy = 0.8487, }; - topScore.Statistics.Add(HitCount.Great, RNG.Next(2000)); - topScore.Statistics.Add(HitCount.Good, RNG.Next(2000)); - topScore.Statistics.Add(HitCount.Meh, RNG.Next(2000)); + topScore.Statistics.Add(HitResult.Great, RNG.Next(2000)); + topScore.Statistics.Add(HitResult.Good, RNG.Next(2000)); + topScore.Statistics.Add(HitResult.Meh, RNG.Next(2000)); } [BackgroundDependencyLoader] diff --git a/osu.Game.Tests/Visual/TestCaseResults.cs b/osu.Game.Tests/Visual/TestCaseResults.cs index 5190baff4e..5c474461cb 100644 --- a/osu.Game.Tests/Visual/TestCaseResults.cs +++ b/osu.Game.Tests/Visual/TestCaseResults.cs @@ -8,7 +8,6 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Scoring; using osu.Game.Screens.Ranking; using osu.Game.Users; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Tests.Visual { @@ -42,12 +41,12 @@ namespace osu.Game.Tests.Visual MaxCombo = 123, Rank = ScoreRank.A, Date = DateTimeOffset.Now, - Statistics = new Dictionary + Statistics = new Dictionary { - { HitCount.Great, 50 }, - { HitCount.Good, 20 }, - { HitCount.Meh, 50 }, - { HitCount.Miss, 1 } + { HitResult.Great, 50 }, + { HitResult.Good, 20 }, + { HitResult.Meh, 50 }, + { HitResult.Miss, 1 } }, User = new User { diff --git a/osu.Game/Online/API/Requests/GetScoresRequest.cs b/osu.Game/Online/API/Requests/GetScoresRequest.cs index 9e5aa6d93f..14605081b6 100644 --- a/osu.Game/Online/API/Requests/GetScoresRequest.cs +++ b/osu.Game/Online/API/Requests/GetScoresRequest.cs @@ -122,20 +122,20 @@ namespace osu.Game.Online.API.Requests { foreach (var kvp in value) { - HitCount newKey; + HitResult newKey; switch (kvp.Key) { case @"count_300": - newKey = HitCount.Great; + newKey = HitResult.Great; break; case @"count_100": - newKey = HitCount.Good; + newKey = HitResult.Good; break; case @"count_50": - newKey = HitCount.Meh; + newKey = HitResult.Meh; break; case @"count_miss": - newKey = HitCount.Miss; + newKey = HitResult.Miss; break; default: continue; diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs index 301c62ee77..2d5913d8ca 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableScore.cs @@ -12,10 +12,10 @@ using osu.Game.Graphics.Sprites; using osu.Game.Online.API.Requests; using osu.Game.Overlays.Profile.Sections.Ranks; using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Overlays.BeatmapSet.Scores { @@ -105,7 +105,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Text = $"{score.Statistics[HitCount.Great]}/{score.Statistics[HitCount.Good]}/{score.Statistics[HitCount.Meh]}", + Text = $"{score.Statistics[HitResult.Great]}/{score.Statistics[HitResult.Good]}/{score.Statistics[HitResult.Meh]}", Font = @"Exo2.0-RegularItalic", Margin = new MarginPadding { Right = side_margin } }, diff --git a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs index 612728ff4c..e3b878587d 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/DrawableTopScore.cs @@ -18,7 +18,6 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; -using static osu.Game.Rulesets.Scoring.Score; namespace osu.Game.Overlays.BeatmapSet.Scores { @@ -59,7 +58,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores totalScore.Value = $@"{score.TotalScore:N0}"; accuracy.Value = $@"{score.Accuracy:P2}"; - statistics.Value = $"{score.Statistics[HitCount.Great]}/{score.Statistics[HitCount.Good]}/{score.Statistics[HitCount.Meh]}"; + statistics.Value = $"{score.Statistics[HitResult.Great]}/{score.Statistics[HitResult.Good]}/{score.Statistics[HitResult.Meh]}"; modsContainer.Clear(); foreach (Mod mod in score.Mods) diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs index 5ab4b7636b..3d7880f56f 100644 --- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs +++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs @@ -9,7 +9,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; -using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Judgements { diff --git a/osu.Game/Rulesets/Judgements/Judgement.cs b/osu.Game/Rulesets/Judgements/Judgement.cs index d804111a7f..f8c9b9734f 100644 --- a/osu.Game/Rulesets/Judgements/Judgement.cs +++ b/osu.Game/Rulesets/Judgements/Judgement.cs @@ -2,6 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Judgements { diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs index af038909d2..45a7275c53 100644 --- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs +++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs @@ -16,6 +16,7 @@ using osu.Game.Graphics; using osu.Framework.Configuration; using OpenTK; using osu.Framework.Graphics.Primitives; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Objects.Drawables { diff --git a/osu.Game/Rulesets/Objects/Drawables/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs similarity index 91% rename from osu.Game/Rulesets/Objects/Drawables/HitResult.cs rename to osu.Game/Rulesets/Scoring/HitResult.cs index 961843cbd7..49ab9fd2f0 100644 --- a/osu.Game/Rulesets/Objects/Drawables/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -3,7 +3,7 @@ using System.ComponentModel; -namespace osu.Game.Rulesets.Objects.Drawables +namespace osu.Game.Rulesets.Scoring { public enum HitResult { diff --git a/osu.Game/Rulesets/Scoring/Score.cs b/osu.Game/Rulesets/Scoring/Score.cs index 56c7bc583f..025335ba55 100644 --- a/osu.Game/Rulesets/Scoring/Score.cs +++ b/osu.Game/Rulesets/Scoring/Score.cs @@ -7,7 +7,6 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Mods; using osu.Game.Users; using osu.Game.Rulesets.Replays; -using System.ComponentModel; namespace osu.Game.Rulesets.Scoring { @@ -41,21 +40,6 @@ namespace osu.Game.Rulesets.Scoring public DateTimeOffset Date; - public Dictionary Statistics = new Dictionary(); - - public enum HitCount - { - [Description("300")] - Great, - - [Description("100")] - Good, - - [Description("50")] - Meh, - - [Description("x")] - Miss - } + public Dictionary Statistics = new Dictionary(); } } diff --git a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs index e129a81116..23c4464bb1 100644 --- a/osu.Game/Rulesets/Scoring/ScoreProcessor.cs +++ b/osu.Game/Rulesets/Scoring/ScoreProcessor.cs @@ -8,7 +8,6 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.UI; -using osu.Game.Rulesets.Objects.Drawables; namespace osu.Game.Rulesets.Scoring { diff --git a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs index 06ef87276a..351db533f3 100644 --- a/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs +++ b/osu.Game/Screens/Play/HUD/StandardHealthDisplay.cs @@ -7,10 +7,10 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Graphics; using osu.Game.Rulesets.Judgements; -using osu.Game.Rulesets.Objects.Drawables; using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics.Shapes; +using osu.Game.Rulesets.Scoring; namespace osu.Game.Screens.Play.HUD { diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 6d2aa8fce8..4b5f590dce 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -23,7 +23,6 @@ using osu.Game.Screens.Play; using osu.Game.Screens.Select.Leaderboards; using osu.Game.Users; using osu.Framework.Graphics.Shapes; -using static osu.Game.Rulesets.Scoring.Score; using osu.Framework.Extensions; namespace osu.Game.Screens.Ranking @@ -188,9 +187,9 @@ namespace osu.Game.Screens.Ranking private class DrawableScoreStatistic : Container { - private readonly KeyValuePair statistic; + private readonly KeyValuePair statistic; - public DrawableScoreStatistic(KeyValuePair statistic) + public DrawableScoreStatistic(KeyValuePair statistic) { this.statistic = statistic; diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 6cb12430c3..82b9f41567 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -612,7 +612,7 @@ - + From 61bbb669960eed59f443886b96288a75dd9aedcf Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 21:27:15 +0100 Subject: [PATCH 59/64] sort resultpage hitresults descending HitCount was good to bad but HitResult is the opposite. To account for this just descending order on the result page. --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 4b5f590dce..b8098b3b4b 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -164,7 +164,7 @@ namespace osu.Game.Screens.Ranking } }; - statisticsContainer.ChildrenEnumerable = Score.Statistics.OrderBy(p => p.Key).Select(s => new DrawableScoreStatistic(s)); + statisticsContainer.ChildrenEnumerable = Score.Statistics.OrderByDescending(p => p.Key).Select(s => new DrawableScoreStatistic(s)); } protected override void LoadComplete() From d6af8ad748c6c5e6831670d4e5b8a37bbea7d133 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 21:48:49 +0100 Subject: [PATCH 60/64] swap date and time in ResultsPageScore --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 25a42cae1c..f24ad1da14 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -250,16 +250,16 @@ namespace osu.Game.Screens.Ranking { Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, - Text = datetime.ToString("HH:mm"), - Padding = new MarginPadding { Left = 10, Right = 10, Top = 5, Bottom = 5 }, + Text = datetime.ToString("yyyy/MM/dd"), + Padding = new MarginPadding { Horizontal = 10, Vertical = 5 }, Colour = Color4.White, }, new OsuSpriteText { Origin = Anchor.CentreRight, Anchor = Anchor.CentreRight, - Text = datetime.ToString("yyyy/MM/dd"), - Padding = new MarginPadding { Left = 10, Right = 10, Top = 5, Bottom = 5 }, + Text = datetime.ToString("HH:mm"), + Padding = new MarginPadding { Horizontal = 10, Vertical = 5 }, Colour = Color4.White, } }; From 0dad9cbe53aa35f8946dc8e18229fa52cf6d546c Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 21:49:05 +0100 Subject: [PATCH 61/64] change date to be more friendly to read --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index f24ad1da14..993f192cd5 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -250,7 +250,7 @@ namespace osu.Game.Screens.Ranking { Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, - Text = datetime.ToString("yyyy/MM/dd"), + Text = datetime.ToString("dd/MM/yyyy"), Padding = new MarginPadding { Horizontal = 10, Vertical = 5 }, Colour = Color4.White, }, From 2a0699f13cae859af78c5c91747312c1bf6a8010 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 22:41:01 +0100 Subject: [PATCH 62/64] use ToShortDateString to create a date depending on current culture --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 993f192cd5..59acc6a275 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -250,7 +250,7 @@ namespace osu.Game.Screens.Ranking { Origin = Anchor.CentreLeft, Anchor = Anchor.CentreLeft, - Text = datetime.ToString("dd/MM/yyyy"), + Text = datetime.ToShortDateString(), Padding = new MarginPadding { Horizontal = 10, Vertical = 5 }, Colour = Color4.White, }, From 301efb948ea00e75faccf47c8bfe51f601eb655f Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 22:45:02 +0100 Subject: [PATCH 63/64] add required types to TestCase --- osu.Game.Tests/Visual/TestCaseResults.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/osu.Game.Tests/Visual/TestCaseResults.cs b/osu.Game.Tests/Visual/TestCaseResults.cs index d0c5aa4939..7a84742e7d 100644 --- a/osu.Game.Tests/Visual/TestCaseResults.cs +++ b/osu.Game.Tests/Visual/TestCaseResults.cs @@ -15,6 +15,15 @@ namespace osu.Game.Tests.Visual { private BeatmapManager beatmaps; + public override IReadOnlyList RequiredTypes => new[] + { + typeof(Score), + typeof(Results), + typeof(ResultsPage), + typeof(ResultsPageScore), + typeof(ResultsPageRanking) + }; + [BackgroundDependencyLoader] private void load(BeatmapManager beatmaps) { From 3d66b879a7ad36ec11fc672a6af1b19ffa49d319 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 30 Dec 2017 22:45:28 +0100 Subject: [PATCH 64/64] use ToShortTimeString to create a time depending on current culture --- osu.Game/Screens/Ranking/ResultsPageScore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Ranking/ResultsPageScore.cs b/osu.Game/Screens/Ranking/ResultsPageScore.cs index 59acc6a275..9d778e0679 100644 --- a/osu.Game/Screens/Ranking/ResultsPageScore.cs +++ b/osu.Game/Screens/Ranking/ResultsPageScore.cs @@ -258,7 +258,7 @@ namespace osu.Game.Screens.Ranking { Origin = Anchor.CentreRight, Anchor = Anchor.CentreRight, - Text = datetime.ToString("HH:mm"), + Text = datetime.ToShortTimeString(), Padding = new MarginPadding { Horizontal = 10, Vertical = 5 }, Colour = Color4.White, }