diff --git a/osu.Game.Rulesets.Taiko/Configuration/TaikoHitFlyingEnable.cs b/osu.Game.Rulesets.Taiko/Configuration/TaikoHitFlyingEnable.cs new file mode 100644 index 000000000000..66887d02d628 --- /dev/null +++ b/osu.Game.Rulesets.Taiko/Configuration/TaikoHitFlyingEnable.cs @@ -0,0 +1,20 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Localisation; +using osu.Game.Localisation; + +namespace osu.Game.Rulesets.Taiko.Configuration +{ + public enum TaikoHitFlyingEnable + { + [LocalisableDescription(typeof(RulesetSettingsStrings), nameof(RulesetSettingsStrings.FlyingHitEnableNever))] + Never, + + [LocalisableDescription(typeof(RulesetSettingsStrings), nameof(RulesetSettingsStrings.FlyingHitEnableHUD))] + HUD, + + [LocalisableDescription(typeof(RulesetSettingsStrings), nameof(RulesetSettingsStrings.FlyingHitEnableAlways))] + Always, + } +} diff --git a/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs b/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs index c3bc7f643958..0e8912e45469 100644 --- a/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs +++ b/osu.Game.Rulesets.Taiko/Configuration/TaikoRulesetConfigManager.cs @@ -18,11 +18,13 @@ protected override void InitialiseDefaults() base.InitialiseDefaults(); SetDefault(TaikoRulesetSetting.TouchControlScheme, TaikoTouchControlScheme.KDDK); + SetDefault(TaikoRulesetSetting.HitFlyingEnable, TaikoHitFlyingEnable.Always); } } public enum TaikoRulesetSetting { - TouchControlScheme + TouchControlScheme, + HitFlyingEnable } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs index aad9214c5e4c..69dc62fb6e79 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableFlyingHit.cs @@ -26,6 +26,11 @@ protected override void LoadComplete() { base.LoadComplete(); ApplyMaxResult(); + + if (!ShowFlyingHits) + { + Hide(); + } } protected override void LoadSamples() diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index 28831a6d2c7b..d27d8018d267 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -7,11 +7,14 @@ 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.Configuration; 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.Skinning; using osuTK; @@ -39,6 +42,9 @@ public TaikoAction? HitAction private double? lastPressHandleTime; private readonly Bindable type = new Bindable(); + private readonly Bindable hitFlyingEnableSetting = new Bindable(); + private readonly Bindable hudVisible = new Bindable(); + protected bool ShowFlyingHits; public DrawableHit() : this(null) @@ -51,6 +57,23 @@ public DrawableHit([CanBeNull] Hit hit) FillMode = FillMode.Fit; } + [BackgroundDependencyLoader] + private void load(TaikoRulesetConfigManager rulesetConfig, OsuConfigManager osuConfig) + { + rulesetConfig.BindWith(TaikoRulesetSetting.HitFlyingEnable, hitFlyingEnableSetting); + hitFlyingEnableSetting.BindValueChanged(_ => updateHitFlying()); + osuConfig.BindWith(OsuSetting.HUDVisibilityMode, hudVisible); + hudVisible.BindValueChanged(_ => updateHitFlying(), true); + } + + private void updateHitFlying() + { + var hitFlyingEnable = hitFlyingEnableSetting.Value; + var showHud = hudVisible.Value; + ShowFlyingHits = hitFlyingEnable == TaikoHitFlyingEnable.Always || + (hitFlyingEnable == TaikoHitFlyingEnable.HUD && showHud == HUDVisibilityMode.Always); + } + protected override void OnApply() { type.BindTo(HitObject.TypeBindable); @@ -168,13 +191,21 @@ protected override void UpdateHitStateTransforms(ArmedState state) if (SnapJudgementLocation) MainPiece.MoveToX(-X); - this.ScaleTo(0.8f, gravity_time * 2, Easing.OutQuad); + if (ShowFlyingHits) + { + this.ScaleTo(0.8f, gravity_time * 2, Easing.OutQuad); + + this.MoveToY(-gravity_travel_height, gravity_time, Easing.Out) + .Then() + .MoveToY(gravity_travel_height * 2, gravity_time * 2, Easing.In); - this.MoveToY(-gravity_travel_height, gravity_time, Easing.Out) - .Then() - .MoveToY(gravity_travel_height * 2, gravity_time * 2, Easing.In); + this.FadeOut(800); + } + else + { + Hide(); + } - this.FadeOut(800); break; } } diff --git a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs index 84dea474c545..f4c2257b7fe3 100644 --- a/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs +++ b/osu.Game.Rulesets.Taiko/TaikoSettingsSubsection.cs @@ -30,6 +30,12 @@ private void load() { LabelText = RulesetSettingsStrings.TouchControlScheme, Current = config.GetBindable(TaikoRulesetSetting.TouchControlScheme) + }, + new SettingsEnumDropdown + { + ClassicDefault = TaikoHitFlyingEnable.HUD, + LabelText = RulesetSettingsStrings.FlyingHitEnable, + Current = config.GetBindable(TaikoRulesetSetting.HitFlyingEnable) } }; } diff --git a/osu.Game/Localisation/RulesetSettingsStrings.cs b/osu.Game/Localisation/RulesetSettingsStrings.cs index 9434cd53deab..9af68c2205f0 100644 --- a/osu.Game/Localisation/RulesetSettingsStrings.cs +++ b/osu.Game/Localisation/RulesetSettingsStrings.cs @@ -89,6 +89,26 @@ public static class RulesetSettingsStrings /// public static LocalisableString TouchControlScheme => new TranslatableString(getKey(@"touch_control_scheme"), @"Touch control scheme"); + /// + /// "Circles fly off after successful hit" + /// + public static LocalisableString FlyingHitEnable => new TranslatableString(getKey(@"hit_flying_enable"), @"Circles fly off after successful hit"); + + /// + /// "Never" + /// + public static LocalisableString FlyingHitEnableNever => new TranslatableString(getKey(@"hit_flying_enable_never"), @"Never"); + + /// + /// "When HUD is visible" + /// + public static LocalisableString FlyingHitEnableHUD => new TranslatableString(getKey(@"hit_flying_enable_hud"), @"When HUD is visible"); + + /// + /// "Always" + /// + public static LocalisableString FlyingHitEnableAlways => new TranslatableString(getKey(@"hit_flying_enable_always"), @"Always"); + private static string getKey(string key) => $@"{prefix}:{key}"; } }