osu/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs

174 lines
5.8 KiB
C#
Raw Normal View History

2018-01-05 11:21:19 +00:00
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System.Linq;
2017-05-26 10:56:50 +00:00
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Judgements;
2017-04-18 07:05:58 +00:00
using osu.Game.Rulesets.Mania.Judgements;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
2017-04-18 07:05:58 +00:00
namespace osu.Game.Rulesets.Mania.Scoring
{
2017-09-06 09:05:51 +00:00
internal class ManiaScoreProcessor : ScoreProcessor<ManiaHitObject>
{
2017-05-26 11:42:03 +00:00
/// <summary>
/// The hit HP multiplier at OD = 0.
/// </summary>
private const double hp_multiplier_min = 0.75;
/// <summary>
/// The hit HP multiplier at OD = 0.
/// </summary>
private const double hp_multiplier_mid = 0.85;
/// <summary>
/// The hit HP multiplier at OD = 0.
/// </summary>
private const double hp_multiplier_max = 1;
/// <summary>
/// The default BAD hit HP increase.
/// </summary>
private const double hp_increase_bad = 0.005;
/// <summary>
/// The default OK hit HP increase.
/// </summary>
private const double hp_increase_ok = 0.010;
/// <summary>
/// The default GOOD hit HP increase.
/// </summary>
private const double hp_increase_good = 0.035;
/// <summary>
/// The default tick hit HP increase.
/// </summary>
private const double hp_increase_tick = 0.040;
/// <summary>
/// The default GREAT hit HP increase.
/// </summary>
private const double hp_increase_great = 0.055;
/// <summary>
/// The default PERFECT hit HP increase.
/// </summary>
private const double hp_increase_perfect = 0.065;
/// <summary>
/// The MISS HP multiplier at OD = 0.
/// </summary>
private const double hp_multiplier_miss_min = 0.5;
/// <summary>
/// The MISS HP multiplier at OD = 5.
/// </summary>
private const double hp_multiplier_miss_mid = 0.75;
/// <summary>
/// The MISS HP multiplier at OD = 10.
/// </summary>
private const double hp_multiplier_miss_max = 1;
/// <summary>
/// The default MISS HP increase.
/// </summary>
private const double hp_increase_miss = -0.125;
2017-05-29 02:42:43 +00:00
/// <summary>
/// The MISS HP multiplier. This is multiplied to the miss hp increase.
/// </summary>
private double hpMissMultiplier = 1;
/// <summary>
/// The HIT HP multiplier. This is multiplied to hit hp increases.
/// </summary>
private double hpMultiplier = 1;
public ManiaScoreProcessor()
{
}
2017-09-06 09:05:51 +00:00
public ManiaScoreProcessor(RulesetContainer<ManiaHitObject> rulesetContainer)
2017-08-09 04:28:29 +00:00
: base(rulesetContainer)
{
}
protected override void SimulateAutoplay(Beatmap<ManiaHitObject> beatmap)
2017-05-26 10:56:50 +00:00
{
2017-10-19 05:05:11 +00:00
BeatmapDifficulty difficulty = beatmap.BeatmapInfo.BaseDifficulty;
2017-05-26 11:42:03 +00:00
hpMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_min, hp_multiplier_mid, hp_multiplier_max);
hpMissMultiplier = BeatmapDifficulty.DifficultyRange(difficulty.DrainRate, hp_multiplier_miss_min, hp_multiplier_miss_mid, hp_multiplier_miss_max);
2017-05-26 11:26:26 +00:00
while (true)
2017-05-26 10:56:50 +00:00
{
2017-05-26 11:26:26 +00:00
foreach (var obj in beatmap.HitObjects)
2017-05-26 10:56:50 +00:00
{
var holdNote = obj as HoldNote;
if (holdNote != null)
2017-05-26 10:56:50 +00:00
{
2017-05-26 11:26:26 +00:00
// Head
2017-09-05 10:44:59 +00:00
AddJudgement(new ManiaJudgement { Result = HitResult.Perfect });
2017-05-26 10:56:50 +00:00
2017-05-26 11:26:26 +00:00
// Ticks
int tickCount = holdNote.NestedHitObjects.OfType<HoldNoteTick>().Count();
for (int i = 0; i < tickCount; i++)
2017-09-05 10:44:59 +00:00
AddJudgement(new HoldNoteTickJudgement { Result = HitResult.Perfect });
2017-05-26 10:56:50 +00:00
}
AddJudgement(new ManiaJudgement { Result = HitResult.Perfect });
2017-05-26 10:56:50 +00:00
}
2017-05-26 11:26:26 +00:00
if (!HasFailed)
break;
hpMultiplier *= 1.01;
hpMissMultiplier *= 0.98;
Reset(false);
2017-05-26 10:56:50 +00:00
}
}
protected override void OnNewJudgement(Judgement judgement)
{
base.OnNewJudgement(judgement);
2017-05-26 10:56:50 +00:00
bool isTick = judgement is HoldNoteTickJudgement;
2017-09-05 10:44:59 +00:00
if (isTick)
{
if (judgement.IsHit)
Health.Value += hpMultiplier * hp_increase_tick;
}
else
{
switch (judgement.Result)
{
case HitResult.Miss:
Health.Value += hpMissMultiplier * hp_increase_miss;
break;
case HitResult.Meh:
Health.Value += hpMultiplier * hp_increase_bad;
break;
case HitResult.Ok:
Health.Value += hpMultiplier * hp_increase_ok;
break;
case HitResult.Good:
Health.Value += hpMultiplier * hp_increase_good;
break;
case HitResult.Great:
Health.Value += hpMultiplier * hp_increase_great;
break;
case HitResult.Perfect:
Health.Value += hpMultiplier * hp_increase_perfect;
break;
}
2017-05-26 10:56:50 +00:00
}
2017-05-22 06:28:51 +00:00
}
}
}