1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-18 10:22:56 +08:00
osu-lazer/osu.Game.Rulesets.Taiko/Mods/TaikoModHidden.cs

74 lines
3.0 KiB
C#
Raw Normal View History

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
using System.Diagnostics;
2021-06-11 15:07:38 +08:00
using osu.Framework.Graphics;
2018-04-13 17:19:50 +08:00
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects;
2021-05-15 11:51:39 +08:00
using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.Taiko.Objects;
2021-06-11 15:07:38 +08:00
using osu.Game.Rulesets.Taiko.Objects.Drawables;
using osu.Game.Rulesets.Taiko.UI;
using osu.Game.Rulesets.UI;
2018-04-13 17:19:50 +08:00
namespace osu.Game.Rulesets.Taiko.Mods
{
public class TaikoModHidden : ModHidden, IApplicableToDrawableRuleset<TaikoHitObject>
2018-04-13 17:19:50 +08:00
{
public override string Description => @"Beats fade out before you hit them!";
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.06 : 1;
2021-06-11 15:07:38 +08:00
/// <summary>
/// How far away from the hit target should hitobjects start to fade out.
/// Range: [0, 1]
/// </summary>
private const float fade_out_start_time = 1f;
/// <summary>
/// How long hitobjects take to fade out, in terms of the scrolling length.
/// Range: [0, 1]
/// </summary>
private const float fade_out_duration = 0.375f;
private DrawableTaikoRuleset? drawableRuleset;
2021-06-11 15:07:38 +08:00
public void ApplyToDrawableRuleset(DrawableRuleset<TaikoHitObject> drawableRuleset)
2021-05-15 11:51:39 +08:00
{
this.drawableRuleset = (DrawableTaikoRuleset)drawableRuleset;
2021-06-11 15:07:38 +08:00
}
protected override void ApplyIncreasedVisibilityState(DrawableHitObject hitObject, ArmedState state)
2021-06-11 15:07:38 +08:00
{
ApplyNormalVisibilityState(hitObject, state);
2021-05-15 11:51:39 +08:00
}
protected override void ApplyNormalVisibilityState(DrawableHitObject hitObject, ArmedState state)
{
Debug.Assert(drawableRuleset != null);
2021-06-11 15:07:38 +08:00
switch (hitObject)
{
2022-06-24 20:25:23 +08:00
case DrawableDrumRollTick:
case DrawableHit:
double preempt = drawableRuleset.TimeRange.Value / drawableRuleset.ControlPointAt(hitObject.HitObject.StartTime).Multiplier;
double start = hitObject.HitObject.StartTime - preempt * fade_out_start_time;
double duration = preempt * fade_out_duration;
2021-06-11 15:07:38 +08:00
2021-06-16 15:32:59 +08:00
using (hitObject.BeginAbsoluteSequence(start))
{
hitObject.FadeOut(duration);
2021-06-11 15:07:38 +08:00
2021-06-16 15:32:59 +08:00
// DrawableHitObject sets LifetimeEnd to LatestTransformEndTime if it isn't manually changed.
// in order for the object to not be killed before its actual end time (as the latest transform ends earlier), set lifetime end explicitly.
hitObject.LifetimeEnd = state == ArmedState.Idle || !hitObject.AllJudged
? hitObject.HitObject.GetEndTime() + hitObject.HitObject.HitWindows.WindowFor(HitResult.Miss)
: hitObject.HitStateUpdateTime;
}
2021-06-11 15:07:38 +08:00
2021-06-16 15:32:59 +08:00
break;
2021-06-11 15:07:38 +08:00
}
}
2018-04-13 17:19:50 +08:00
}
}