diff --git a/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs b/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs index c3bc7f6439..de5e6d9a39 100644 --- a/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs +++ b/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs @@ -18,11 +18,13 @@ namespace osu.Game.Rulesets.Taiko.Configuration base.InitialiseDefaults(); SetDefault(TaikoRulesetSetting.TouchControlScheme, TaikoTouchControlScheme.KDDK); + SetDefault(TaikoRulesetSetting.RateAdjustedHitAnimation, true); } } public enum TaikoRulesetSetting { - TouchControlScheme + TouchControlScheme, + RateAdjustedHitAnimation, } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index 28831a6d2c..7daefb3890 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -7,12 +7,15 @@ using System; using System.Diagnostics; using System.Linq; using JetBrains.Annotations; +using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Input.Events; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.Taiko.Configuration; using osu.Game.Rulesets.Taiko.Skinning.Default; +using osu.Game.Screens.Play; using osu.Game.Skinning; using osuTK; @@ -34,12 +37,15 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables private set; } - private bool validActionPressed; - - private double? lastPressHandleTime; + [Resolved(CanBeNull = true)] + private TaikoRulesetConfigManager taikoConfig { get; set; } + private readonly Bindable rateAdjustedHitAnimations = new Bindable(true); private readonly Bindable type = new Bindable(); + private bool validActionPressed; + private double? lastPressHandleTime; + public DrawableHit() : this(null) { @@ -51,6 +57,12 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables FillMode = FillMode.Fit; } + [BackgroundDependencyLoader] + private void load() + { + taikoConfig?.BindWith(TaikoRulesetSetting.RateAdjustedHitAnimation, rateAdjustedHitAnimations); + } + protected override void OnApply() { type.BindTo(HitObject.TypeBindable); @@ -168,11 +180,15 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (SnapJudgementLocation) MainPiece.MoveToX(-X); - this.ScaleTo(0.8f, gravity_time * 2, Easing.OutQuad); + // Rate independent to match stable. + double rate = (Clock as IGameplayClock)?.GetTrueGameplayRate() ?? Clock.Rate; + double length = gravity_time * (rateAdjustedHitAnimations.Value ? 1 : rate); - this.MoveToY(-gravity_travel_height, gravity_time, Easing.Out) + this.ScaleTo(0.8f, length * 2, Easing.OutQuad); + + this.MoveToY(-gravity_travel_height, length, Easing.Out) .Then() - .MoveToY(gravity_travel_height * 2, gravity_time * 2, Easing.In); + .MoveToY(gravity_travel_height * 2, length * 2, Easing.In); this.FadeOut(800); break; diff --git a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs index 58fb6a0246..a7e346f3d3 100644 --- a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs +++ b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs @@ -3,6 +3,7 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; +using osu.Framework.Graphics.UserInterface; using osu.Framework.Localisation; using osu.Game.Graphics.UserInterfaceV2; using osu.Game.Localisation; @@ -31,7 +32,16 @@ namespace osu.Game.Rulesets.Taiko { Caption = RulesetSettingsStrings.TouchControlScheme, Current = config.GetBindable(TaikoRulesetSetting.TouchControlScheme) + }), + new SettingsItemV2(new FormCheckBox + { + Caption = RulesetSettingsStrings.RateAdjustedHitAnimation, + HintText = RulesetSettingsStrings.RateAdjustedHitAnimationTooltip, + Current = config.GetBindable(TaikoRulesetSetting.RateAdjustedHitAnimation) }) + { + ApplyClassicDefault = c => ((IHasCurrentValue)c).Current.Value = false, + } }; } } diff --git a/osu.Game/Localisation/RulesetSettingsStrings.cs b/osu.Game/Localisation/RulesetSettingsStrings.cs index 891da585d8..cc06474b76 100644 --- a/osu.Game/Localisation/RulesetSettingsStrings.cs +++ b/osu.Game/Localisation/RulesetSettingsStrings.cs @@ -79,6 +79,16 @@ namespace osu.Game.Localisation /// public static LocalisableString TimingBasedColouring => new TranslatableString(getKey(@"Timing_based_colouring"), @"Timing-based note colouring"); + /// + /// "Rate-adjusted hit animations" + /// + public static LocalisableString RateAdjustedHitAnimation => new TranslatableString(getKey(@"rate_adjusted_hit_animation"), @"Rate-adjusted hit animations"); + + /// + /// "Hits will fly faster or slower when beatmap rate is adjusted via mods." + /// + public static LocalisableString RateAdjustedHitAnimationTooltip => new TranslatableString(getKey(@"rate_adjusted_hit_animation_tooltip"), @"Hits will fly faster or slower when beatmap rate is adjusted via mods."); + /// /// "{0}ms (speed {1:N1})" ///