mirror of
https://github.com/ppy/osu.git
synced 2024-11-15 07:27:33 +08:00
1eb10e029c
Per the request of spaceman_atlas, the No Release mod is rewritten to avoid modifications to DrawableHoldNoteTail. The approach is based on that of the Strict Tracking mod for the osu!(standard) ruleset, injecting the mod behavior by replacing the normal hold note with the mod's variant. The variant inherits most bevaior from the normal hold note, but when creating nested hitobjects, it creates its own hold note tail variant instead, which in turn is used to instantiate the mod's variant of DrawableHoldNoteTail with a new behavior. The time a judgement is awarded is changed from the end of its Perfect window to the time of the tail itself.
108 lines
3.5 KiB
C#
108 lines
3.5 KiB
C#
// 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.
|
|
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using osu.Framework.Localisation;
|
|
using osu.Game.Beatmaps;
|
|
using osu.Game.Rulesets.Mania.Beatmaps;
|
|
using osu.Game.Rulesets.Mania.Objects;
|
|
using osu.Game.Rulesets.Mania.Objects.Drawables;
|
|
using osu.Game.Rulesets.Mania.UI;
|
|
using osu.Game.Rulesets.Mods;
|
|
using osu.Game.Rulesets.Scoring;
|
|
using osu.Game.Rulesets.UI;
|
|
|
|
namespace osu.Game.Rulesets.Mania.Mods
|
|
{
|
|
public partial class ManiaModNoRelease : Mod, IApplicableAfterBeatmapConversion, IApplicableToDrawableRuleset<ManiaHitObject>
|
|
{
|
|
public override string Name => "No Release";
|
|
|
|
public override string Acronym => "NR";
|
|
|
|
public override LocalisableString Description => "No more timing the end of hold notes.";
|
|
|
|
public override double ScoreMultiplier => 0.9;
|
|
|
|
public override ModType Type => ModType.DifficultyReduction;
|
|
|
|
public void ApplyToBeatmap(IBeatmap beatmap)
|
|
{
|
|
var maniaBeatmap = (ManiaBeatmap)beatmap;
|
|
var hitObjects = maniaBeatmap.HitObjects.Select(obj =>
|
|
{
|
|
if (obj is HoldNote hold)
|
|
return new NoReleaseHoldNote(hold);
|
|
|
|
return obj;
|
|
}).ToList();
|
|
|
|
maniaBeatmap.HitObjects = hitObjects;
|
|
}
|
|
|
|
public void ApplyToDrawableRuleset(DrawableRuleset<ManiaHitObject> drawableRuleset)
|
|
{
|
|
var maniaRuleset = (DrawableManiaRuleset)drawableRuleset;
|
|
|
|
foreach (var stage in maniaRuleset.Playfield.Stages)
|
|
{
|
|
foreach (var column in stage.Columns)
|
|
{
|
|
column.RegisterPool<NoReleaseTailNote, NoReleaseDrawableHoldNoteTail>(10, 50);
|
|
}
|
|
}
|
|
}
|
|
|
|
private partial class NoReleaseDrawableHoldNoteTail : DrawableHoldNoteTail
|
|
{
|
|
protected override void CheckForResult(bool userTriggered, double timeOffset)
|
|
{
|
|
// apply perfect once the tail is reached
|
|
if (HoldNote.HoldStartTime != null && timeOffset >= 0)
|
|
ApplyResult(GetCappedResult(HitResult.Perfect));
|
|
else
|
|
base.CheckForResult(userTriggered, timeOffset);
|
|
}
|
|
}
|
|
|
|
private class NoReleaseTailNote : TailNote
|
|
{
|
|
}
|
|
|
|
private class NoReleaseHoldNote : HoldNote
|
|
{
|
|
public NoReleaseHoldNote(HoldNote hold)
|
|
{
|
|
StartTime = hold.StartTime;
|
|
Duration = hold.Duration;
|
|
Column = hold.Column;
|
|
NodeSamples = hold.NodeSamples;
|
|
}
|
|
|
|
protected override void CreateNestedHitObjects(CancellationToken cancellationToken)
|
|
{
|
|
AddNested(Head = new HeadNote
|
|
{
|
|
StartTime = StartTime,
|
|
Column = Column,
|
|
Samples = GetNodeSamples(0),
|
|
});
|
|
|
|
AddNested(Tail = new NoReleaseTailNote
|
|
{
|
|
StartTime = EndTime,
|
|
Column = Column,
|
|
Samples = GetNodeSamples((NodeSamples?.Count - 1) ?? 1),
|
|
});
|
|
|
|
AddNested(Body = new HoldNoteBody
|
|
{
|
|
StartTime = StartTime,
|
|
Column = Column
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|