From f5bea077a09bcca057d6ad628a7e9977f75f7399 Mon Sep 17 00:00:00 2001 From: Ninjaprawn Date: Fri, 8 Dec 2017 11:26:34 +1100 Subject: [PATCH 01/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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/45] 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 0cea0185767d71d7a94538c9127d2fb49ef158d4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 28 Dec 2017 21:23:59 +0900 Subject: [PATCH 13/45] 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 2669974bff052a75d6502a6dcd92d3eed29a93d0 Mon Sep 17 00:00:00 2001 From: kiroma Date: Thu, 28 Dec 2017 15:25:54 +0100 Subject: [PATCH 14/45] 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 15/45] 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 16/45] 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 17/45] 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 18/45] 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 b74248a705665adf9f68037c5f8dfbb9b26e7f7a Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 29 Dec 2017 16:22:06 +0900 Subject: [PATCH 19/45] 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 20/45] 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 21/45] 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 22/45] 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 23/45] 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 24/45] 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 25/45] 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 26/45] 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 27/45] 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 28/45] 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 29/45] 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 30/45] 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 31/45] 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 32/45] 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 33/45] 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 34/45] 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 35/45] 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 36/45] 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 b1dd64983dcc5eb7b0bd76cedfc9de9d257ea5f9 Mon Sep 17 00:00:00 2001 From: jai_ Date: Fri, 29 Dec 2017 19:05:50 +0000 Subject: [PATCH 37/45] 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 38/45] 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 39/45] 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 40/45] 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 41/45] 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 42/45] 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 43/45] 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 44/45] 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 45/45] 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) + { } - } } }