From eea96e3e182bf2f0a643344d4384a086f5427ebc Mon Sep 17 00:00:00 2001 From: Rian8337 <52914632+Rian8337@users.noreply.github.com> Date: Thu, 23 Jan 2025 01:42:29 +0800 Subject: [PATCH] Match slider snaking in speed and slider tail circle fade animation with osu!stable --- .../ccfit/zuev/osu/game/GameplaySlider.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java b/src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java index 0374e4f81..51726ce01 100644 --- a/src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java +++ b/src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java @@ -250,8 +250,12 @@ public void init(final GameObjectListener listener, final Scene scene, timePreempt = (float) beatmapSlider.timePreempt / 1000; float fadeInDuration = (float) beatmapSlider.timeFadeIn / 1000; + // When snaking in is enabled, the first repeat or tail needs to be delayed until the snaking completes. + float fadeInDelay = Config.isSnakingInSliders() ? timePreempt / 3 : 0; + if (GameHelper.isHidden()) { float fadeOutDuration = timePreempt * (float) ModHidden.FADE_OUT_DURATION_MULTIPLIER; + float finalTailAlpha = (fadeInDuration - fadeInDelay) / fadeInDuration; headCirclePiece.registerEntityModifier(Modifiers.sequence( Modifiers.fadeIn(fadeInDuration), @@ -259,13 +263,18 @@ public void init(final GameObjectListener listener, final Scene scene, )); tailCirclePiece.registerEntityModifier(Modifiers.sequence( - Modifiers.fadeIn(fadeInDuration), - Modifiers.fadeOut(fadeOutDuration) + Modifiers.delay(fadeInDelay), + Modifiers.alpha(fadeInDuration - fadeInDelay, 0, finalTailAlpha), + Modifiers.alpha(fadeOutDuration, finalTailAlpha, 0) )); } else { headCirclePiece.registerEntityModifier(Modifiers.fadeIn(fadeInDuration)); - tailCirclePiece.registerEntityModifier(Modifiers.fadeIn(fadeInDuration)); + + tailCirclePiece.registerEntityModifier(Modifiers.sequence( + Modifiers.delay(fadeInDelay), + Modifiers.fadeIn(fadeInDuration) + )); } if (approachCircle.isVisible()) { @@ -289,6 +298,11 @@ public void init(final GameObjectListener listener, final Scene scene, endArrow.setPosition(pathEndPosition.x, pathEndPosition.y); } + endArrow.registerEntityModifier(Modifiers.sequence( + Modifiers.delay(fadeInDelay), + Modifiers.fadeIn(fadeInDuration) + )); + scene.attachChild(endArrow, 0); } scene.attachChild(tailCirclePiece, 0); @@ -771,17 +785,10 @@ public void update(final float dt) { approachCircle.setAlpha(0); } - float percentage = (float) (1 + elapsedSpanTime / timePreempt); - - if (percentage <= 0.5f) { - // Following core doing a very cute show animation ^_^" - percentage = Math.min(1, percentage * 2); - - if (beatmapSlider.getSpanCount() > 1) { - endArrow.setAlpha(percentage); - } + if (Config.isSnakingInSliders()) { + float percentage = FMath.clamp((float) (timePreempt + elapsedSpanTime) / (timePreempt / 3), 0, 1); - if (Config.isSnakingInSliders()) { + if (percentage < 1) { if (superPath != null && sliderBody != null) { float l = superPath.getMeasurer().maxLength() * percentage; @@ -792,12 +799,7 @@ public void update(final float dt) { tailCirclePiece.setPosition(position.x, position.y); endArrow.setPosition(position.x, position.y); - } - } else if (percentage - dt / timePreempt <= 0.5f) { - if (beatmapSlider.getSpanCount() > 1) { - endArrow.setAlpha(1); - } - if (Config.isSnakingInSliders()) { + } else { if (!preStageFinish && superPath != null && sliderBody != null) { sliderBody.setEndLength(superPath.getMeasurer().maxLength()); preStageFinish = true;