From 7bad0113cddef9dade7c49a8cea1a0b78cdad28c Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 9 Feb 2023 11:15:21 -0600 Subject: [PATCH] Move early fade effect to classic mod setting --- osu.Game.Rulesets.Osu/Mods/OsuModClassic.cs | 25 +++++++++++++++++++ .../Objects/Drawables/DrawableHitCircle.cs | 4 --- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModClassic.cs b/osu.Game.Rulesets.Osu/Mods/OsuModClassic.cs index e021992f86..8d79157f82 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModClassic.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModClassic.cs @@ -4,6 +4,7 @@ using System; using System.Linq; using osu.Framework.Bindables; +using osu.Framework.Graphics; using osu.Game.Configuration; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Objects; @@ -11,6 +12,7 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.Osu.UI; +using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; namespace osu.Game.Rulesets.Osu.Mods @@ -31,6 +33,9 @@ namespace osu.Game.Rulesets.Osu.Mods [SettingSource("Always play a slider's tail sample", "Always plays a slider's tail sample regardless of whether it was hit or not.")] public Bindable AlwaysPlayTailSample { get; } = new BindableBool(true); + [SettingSource("Fade out hit circles earlier", "Make hit circles fade out into a miss, rather than after it.")] + public Bindable FadeHitCircleEarly { get; } = new Bindable(true); + public void ApplyToHitObject(HitObject hitObject) { switch (hitObject) @@ -59,12 +64,32 @@ namespace osu.Game.Rulesets.Osu.Mods { case DrawableSliderHead head: head.TrackFollowCircle = !NoSliderHeadMovement.Value; + if (FadeHitCircleEarly.Value) + applyEarlyFading(head); break; case DrawableSliderTail tail: tail.SamplePlaysOnlyOnHit = !AlwaysPlayTailSample.Value; break; + + case DrawableHitCircle circle: + if (FadeHitCircleEarly.Value) + applyEarlyFading(circle); + break; } } + + private void applyEarlyFading(DrawableHitCircle circle) + { + circle.ApplyCustomUpdateState += (o, _) => + { + using (o.BeginAbsoluteSequence(o.StateUpdateTime)) + { + double mehWindow = o.HitObject.HitWindows.WindowFor(HitResult.Meh); + double lateMissFadeTime = mehWindow / 4 + 15; + o.Delay(mehWindow - lateMissFadeTime).FadeOut(lateMissFadeTime); + } + }; + } } } diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs index 8467d33e9b..3458069dd1 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableHitCircle.cs @@ -200,10 +200,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables // always fade out at the circle's start time (to match user expectations). ApproachCircle.FadeOut(50); - - double mehWindow = HitObject.HitWindows.WindowFor(HitResult.Meh); - double lateMissFadeTime = mehWindow / 4 + 15; - this.Delay(mehWindow - lateMissFadeTime).FadeOut(lateMissFadeTime); } protected override void UpdateHitStateTransforms(ArmedState state)