// 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.Beatmaps; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Objects; using osu.Game.Rulesets.UI; namespace osu.Game.Rulesets.Taiko.Scoring { internal class TaikoScoreProcessor : ScoreProcessor { /// /// A value used for calculating . /// private const double object_count_factor = 3; /// /// Taiko fails at the end of the map if the player has not half-filled their HP bar. /// protected override bool DefaultFailCondition => JudgedHits == MaxHits && Health.Value <= 0.5; /// /// HP multiplier for a successful . /// private double hpMultiplier; /// /// HP multiplier for a . /// private double hpMissMultiplier; public TaikoScoreProcessor(DrawableRuleset rrawableRuleset) : base(rrawableRuleset) { } protected override void ApplyBeatmap(Beatmap beatmap) { base.ApplyBeatmap(beatmap); hpMultiplier = 1 / (object_count_factor * beatmap.HitObjects.FindAll(o => o is Hit).Count * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.5, 0.75, 0.98)); hpMissMultiplier = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.BaseDifficulty.DrainRate, 0.0018, 0.0075, 0.0120); } protected override void ApplyResult(JudgementResult result) { base.ApplyResult(result); double hpIncrease = result.Judgement.HealthIncreaseFor(result); if (result.Type == HitResult.Miss) hpIncrease *= hpMissMultiplier; else hpIncrease *= hpMultiplier; Health.Value += hpIncrease; } protected override void Reset(bool storeResults) { base.Reset(storeResults); Health.Value = 0; } public override HitWindows CreateHitWindows() => new TaikoHitWindows(); } }