From d9242278105febc065dcc57b4bd318a89dcb190a Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Fri, 24 Nov 2023 18:04:57 +0900 Subject: [PATCH] Add `ManiaHealthProcessor` that uses the legacy drain rate algorithm --- .../Scoring/ManiaHealthProcessor.cs | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Scoring/ManiaHealthProcessor.cs b/osu.Game.Rulesets.Mania/Scoring/ManiaHealthProcessor.cs index e63a037ca94a..183550eb7bb4 100644 --- a/osu.Game.Rulesets.Mania/Scoring/ManiaHealthProcessor.cs +++ b/osu.Game.Rulesets.Mania/Scoring/ManiaHealthProcessor.cs @@ -1,23 +1,61 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Game.Rulesets.Judgements; +using System.Collections.Generic; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Mania.Scoring { - public partial class ManiaHealthProcessor : DrainingHealthProcessor + public partial class ManiaHealthProcessor : LegacyDrainingHealthProcessor { - /// public ManiaHealthProcessor(double drainStartTime) - : base(drainStartTime, 1.0) + : base(drainStartTime) { } - protected override HitResult GetSimulatedHitResult(Judgement judgement) + protected override IEnumerable EnumerateTopLevelHitObjects() => Beatmap.HitObjects; + + protected override IEnumerable EnumerateNestedHitObjects(HitObject hitObject) => hitObject.NestedHitObjects; + + protected override double GetHealthIncreaseFor(HitObject hitObject, HitResult result) { - // Users are not expected to attain perfect judgements for all notes due to the tighter hit window. - return judgement.MaxResult == HitResult.Perfect ? HitResult.Great : judgement.MaxResult; + double increase = 0; + + switch (result) + { + case HitResult.Miss: + switch (hitObject) + { + case HeadNote: + case TailNote: + return -(Beatmap.Difficulty.DrainRate + 1) * 0.00375; + + default: + return -(Beatmap.Difficulty.DrainRate + 1) * 0.0075; + } + + case HitResult.Meh: + return -(Beatmap.Difficulty.DrainRate + 1) * 0.0016; + + case HitResult.Ok: + return 0; + + case HitResult.Good: + increase = 0.004 - Beatmap.Difficulty.DrainRate * 0.0004; + break; + + case HitResult.Great: + increase = 0.005 - Beatmap.Difficulty.DrainRate * 0.0005; + break; + + case HitResult.Perfect: + increase = 0.0055 - Beatmap.Difficulty.DrainRate * 0.0005; + break; + } + + return HpMultiplierNormal * increase; } } }