mirror of
https://github.com/ppy/osu
synced 2024-12-27 09:23:15 +00:00
Change S rank to require no miss
This commit is contained in:
parent
7f31070b87
commit
c8521b49cd
@ -89,7 +89,7 @@ namespace osu.Game.Rulesets.Catch.Scoring
|
||||
return baseIncrease * Math.Min(Math.Max(0.5, Math.Log(result.ComboAfterJudgement, combo_base)), Math.Log(combo_cap, combo_base));
|
||||
}
|
||||
|
||||
public override ScoreRank RankFromAccuracy(double accuracy)
|
||||
public override ScoreRank RankFromScore(double accuracy, Dictionary<HitResult, int> results)
|
||||
{
|
||||
if (accuracy == accuracy_cutoff_x)
|
||||
return ScoreRank.X;
|
||||
|
@ -1,9 +1,11 @@
|
||||
// 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.Collections.Generic;
|
||||
using osu.Game.Rulesets.Judgements;
|
||||
using osu.Game.Rulesets.Osu.Judgements;
|
||||
using osu.Game.Rulesets.Scoring;
|
||||
using osu.Game.Scoring;
|
||||
|
||||
namespace osu.Game.Rulesets.Osu.Scoring
|
||||
{
|
||||
@ -14,6 +16,22 @@ namespace osu.Game.Rulesets.Osu.Scoring
|
||||
{
|
||||
}
|
||||
|
||||
public override ScoreRank RankFromScore(double accuracy, Dictionary<HitResult, int> results)
|
||||
{
|
||||
ScoreRank rank = base.RankFromScore(accuracy, results);
|
||||
|
||||
switch (rank)
|
||||
{
|
||||
case ScoreRank.S:
|
||||
case ScoreRank.X:
|
||||
if (results.GetValueOrDefault(HitResult.Miss) > 0)
|
||||
rank = ScoreRank.A;
|
||||
break;
|
||||
}
|
||||
|
||||
return rank;
|
||||
}
|
||||
|
||||
protected override HitEvent CreateHitEvent(JudgementResult result)
|
||||
=> base.CreateHitEvent(result).With((result as OsuHitCircleJudgementResult)?.CursorPositionAtHit);
|
||||
}
|
||||
|
@ -2,9 +2,11 @@
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using osu.Game.Rulesets.Judgements;
|
||||
using osu.Game.Rulesets.Scoring;
|
||||
using osu.Game.Rulesets.Taiko.Objects;
|
||||
using osu.Game.Scoring;
|
||||
|
||||
namespace osu.Game.Rulesets.Taiko.Scoring
|
||||
{
|
||||
@ -33,6 +35,22 @@ namespace osu.Game.Rulesets.Taiko.Scoring
|
||||
* strongScaleValue(result);
|
||||
}
|
||||
|
||||
public override ScoreRank RankFromScore(double accuracy, Dictionary<HitResult, int> results)
|
||||
{
|
||||
ScoreRank rank = base.RankFromScore(accuracy, results);
|
||||
|
||||
switch (rank)
|
||||
{
|
||||
case ScoreRank.S:
|
||||
case ScoreRank.X:
|
||||
if (results.GetValueOrDefault(HitResult.Miss) == 0)
|
||||
rank = ScoreRank.A;
|
||||
break;
|
||||
}
|
||||
|
||||
return rank;
|
||||
}
|
||||
|
||||
public override int GetBaseScoreForResult(HitResult result)
|
||||
{
|
||||
switch (result)
|
||||
|
@ -2,6 +2,7 @@
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NUnit.Framework;
|
||||
using osu.Framework.Extensions.Color4Extensions;
|
||||
using osu.Framework.Graphics;
|
||||
@ -96,6 +97,14 @@ namespace osu.Game.Tests.Visual.Ranking
|
||||
{
|
||||
var scoreProcessor = ruleset.CreateScoreProcessor();
|
||||
|
||||
var statistics = new Dictionary<HitResult, int>
|
||||
{
|
||||
{ HitResult.Miss, 1 },
|
||||
{ HitResult.Meh, 50 },
|
||||
{ HitResult.Good, 100 },
|
||||
{ HitResult.Great, 300 },
|
||||
};
|
||||
|
||||
return new ScoreInfo
|
||||
{
|
||||
User = new APIUser
|
||||
@ -109,15 +118,9 @@ namespace osu.Game.Tests.Visual.Ranking
|
||||
TotalScore = 2845370,
|
||||
Accuracy = accuracy,
|
||||
MaxCombo = 999,
|
||||
Rank = scoreProcessor.RankFromAccuracy(accuracy),
|
||||
Rank = scoreProcessor.RankFromScore(accuracy, statistics),
|
||||
Date = DateTimeOffset.Now,
|
||||
Statistics =
|
||||
{
|
||||
{ HitResult.Miss, 1 },
|
||||
{ HitResult.Meh, 50 },
|
||||
{ HitResult.Good, 100 },
|
||||
{ HitResult.Great, 300 },
|
||||
}
|
||||
Statistics = statistics,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -370,7 +370,7 @@ namespace osu.Game.Rulesets.Scoring
|
||||
if (rank.Value == ScoreRank.F)
|
||||
return;
|
||||
|
||||
rank.Value = RankFromAccuracy(Accuracy.Value);
|
||||
rank.Value = RankFromScore(Accuracy.Value, ScoreResultCounts);
|
||||
foreach (var mod in Mods.Value.OfType<IApplicableToScoreProcessor>())
|
||||
rank.Value = mod.AdjustRank(Rank.Value, Accuracy.Value);
|
||||
}
|
||||
@ -505,7 +505,7 @@ namespace osu.Game.Rulesets.Scoring
|
||||
/// <summary>
|
||||
/// Given an accuracy (0..1), return the correct <see cref="ScoreRank"/>.
|
||||
/// </summary>
|
||||
public virtual ScoreRank RankFromAccuracy(double accuracy)
|
||||
public virtual ScoreRank RankFromScore(double accuracy, Dictionary<HitResult, int> results)
|
||||
{
|
||||
if (accuracy == accuracy_cutoff_x)
|
||||
return ScoreRank.X;
|
||||
|
@ -280,7 +280,7 @@ namespace osu.Game.Scoring.Legacy
|
||||
{
|
||||
scoreInfo.Accuracy = StandardisedScoreMigrationTools.ComputeAccuracy(scoreInfo);
|
||||
|
||||
var rank = currentRuleset.CreateScoreProcessor().RankFromAccuracy(scoreInfo.Accuracy);
|
||||
var rank = currentRuleset.CreateScoreProcessor().RankFromScore(scoreInfo.Accuracy, scoreInfo.Statistics);
|
||||
|
||||
foreach (var mod in scoreInfo.Mods.OfType<IApplicableToScoreProcessor>())
|
||||
rank = mod.AdjustRank(rank, scoreInfo.Accuracy);
|
||||
|
Loading…
Reference in New Issue
Block a user