mirror of
https://github.com/ppy/osu.git
synced 2024-11-06 11:27:24 +08:00
Merge pull request #9578 from smoogipoo/accuracy-based-mania
This commit is contained in:
commit
5049977395
@ -7,6 +7,10 @@ namespace osu.Game.Rulesets.Mania.Scoring
|
|||||||
{
|
{
|
||||||
internal class ManiaScoreProcessor : ScoreProcessor
|
internal class ManiaScoreProcessor : ScoreProcessor
|
||||||
{
|
{
|
||||||
|
protected override double DefaultAccuracyPortion => 0.8;
|
||||||
|
|
||||||
|
protected override double DefaultComboPortion => 0.2;
|
||||||
|
|
||||||
public override HitWindows CreateHitWindows() => new ManiaHitWindows();
|
public override HitWindows CreateHitWindows() => new ManiaHitWindows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,10 @@ namespace osu.Game.Rulesets.Taiko.Scoring
|
|||||||
{
|
{
|
||||||
internal class TaikoScoreProcessor : ScoreProcessor
|
internal class TaikoScoreProcessor : ScoreProcessor
|
||||||
{
|
{
|
||||||
|
protected override double DefaultAccuracyPortion => 0.75;
|
||||||
|
|
||||||
|
protected override double DefaultComboPortion => 0.25;
|
||||||
|
|
||||||
public override HitWindows CreateHitWindows() => new TaikoHitWindows();
|
public override HitWindows CreateHitWindows() => new TaikoHitWindows();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
@ -16,8 +17,6 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
{
|
{
|
||||||
public class ScoreProcessor : JudgementProcessor
|
public class ScoreProcessor : JudgementProcessor
|
||||||
{
|
{
|
||||||
private const double base_portion = 0.3;
|
|
||||||
private const double combo_portion = 0.7;
|
|
||||||
private const double max_score = 1000000;
|
private const double max_score = 1000000;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -55,8 +54,20 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly Bindable<ScoringMode> Mode = new Bindable<ScoringMode>();
|
public readonly Bindable<ScoringMode> Mode = new Bindable<ScoringMode>();
|
||||||
|
|
||||||
private double maxHighestCombo;
|
/// <summary>
|
||||||
|
/// The default portion of <see cref="max_score"/> awarded for hitting <see cref="HitObject"/>s accurately. Defaults to 30%.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual double DefaultAccuracyPortion => 0.3;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The default portion of <see cref="max_score"/> awarded for achieving a high combo. Default to 70%.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual double DefaultComboPortion => 0.7;
|
||||||
|
|
||||||
|
private readonly double accuracyPortion;
|
||||||
|
private readonly double comboPortion;
|
||||||
|
|
||||||
|
private double maxHighestCombo;
|
||||||
private double maxBaseScore;
|
private double maxBaseScore;
|
||||||
private double rollingMaxBaseScore;
|
private double rollingMaxBaseScore;
|
||||||
private double baseScore;
|
private double baseScore;
|
||||||
@ -69,7 +80,11 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
|
|
||||||
public ScoreProcessor()
|
public ScoreProcessor()
|
||||||
{
|
{
|
||||||
Debug.Assert(base_portion + combo_portion == 1.0);
|
accuracyPortion = DefaultAccuracyPortion;
|
||||||
|
comboPortion = DefaultComboPortion;
|
||||||
|
|
||||||
|
if (!Precision.AlmostEquals(1.0, accuracyPortion + comboPortion))
|
||||||
|
throw new InvalidOperationException($"{nameof(DefaultAccuracyPortion)} + {nameof(DefaultComboPortion)} must equal 1.");
|
||||||
|
|
||||||
Combo.ValueChanged += combo => HighestCombo.Value = Math.Max(HighestCombo.Value, combo.NewValue);
|
Combo.ValueChanged += combo => HighestCombo.Value = Math.Max(HighestCombo.Value, combo.NewValue);
|
||||||
Accuracy.ValueChanged += accuracy =>
|
Accuracy.ValueChanged += accuracy =>
|
||||||
@ -189,7 +204,10 @@ namespace osu.Game.Rulesets.Scoring
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case ScoringMode.Standardised:
|
case ScoringMode.Standardised:
|
||||||
return (max_score * (base_portion * baseScore / maxBaseScore + combo_portion * HighestCombo.Value / maxHighestCombo) + bonusScore) * scoreMultiplier;
|
double accuracyScore = accuracyPortion * baseScore / maxBaseScore;
|
||||||
|
double comboScore = comboPortion * HighestCombo.Value / maxHighestCombo;
|
||||||
|
|
||||||
|
return (max_score * (accuracyScore + comboScore) + bonusScore) * scoreMultiplier;
|
||||||
|
|
||||||
case ScoringMode.Classic:
|
case ScoringMode.Classic:
|
||||||
// should emulate osu-stable's scoring as closely as we can (https://osu.ppy.sh/help/wiki/Score/ScoreV1)
|
// should emulate osu-stable's scoring as closely as we can (https://osu.ppy.sh/help/wiki/Score/ScoreV1)
|
||||||
|
Loading…
Reference in New Issue
Block a user