1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-13 00:42:55 +08:00

added sliders bandaid (overbuffed on purpose)

This commit is contained in:
Givikap120 2024-09-06 22:55:18 +03:00
parent 3e32aa779e
commit 4f12a3afdb
3 changed files with 16 additions and 11 deletions

View File

@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators
private const double overlap_multiplier = 1;
public static double EvaluateDensityOf(DifficultyHitObject current, bool applyDistanceNerf = true)
public static double EvaluateDensityOf(DifficultyHitObject current, bool applyDistanceNerf = true, bool applySliderbodyDensity = true)
{
var currObj = (OsuDifficultyHitObject)current;
@ -41,6 +41,17 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators
// Small distances means objects may be cheesed, so it doesn't matter whether they are arranged confusingly.
if (applyDistanceNerf) loopDifficulty *= (logistic((loopObj.MinimumJumpDistance - 80) / 10) + 0.2) / 1.2;
// Additional buff for long sliderbodies. OVERBUFFED ON PURPOSE
if (applySliderbodyDensity && loopObj.BaseObject is Slider slider)
{
// In radiuses, with minimal of 1
double sliderBodyLength = Math.Max(1, slider.Velocity * slider.SpanDuration / slider.Radius);
// The maximum is 3x buff
double sliderBodyBuff = Math.Log10(sliderBodyLength);
loopDifficulty *= 1 + 1.5 * Math.Min(sliderBodyBuff, 2);
}
// Reduce density bonus for this object if they're too apart in time
// Nerf starts on 1500ms and reaches maximum (*=0) on 3000ms
double timeBetweenCurrAndLoopObj = currObj.StartTime - loopObj.StartTime;
@ -153,7 +164,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators
if (current.BaseObject is Spinner || current.Index == 0)
return 0;
double difficulty = Math.Pow(4 * Math.Log(Math.Max(1, ((OsuDifficultyHitObject)current).Density)), 2.5);
double difficulty = Math.Pow(4 * Math.Log(Math.Max(1, EvaluateDensityOf(current, true, true))), 2.5);
double overlapBonus = EvaluateOverlapDifficultyOf(current) * difficulty;
difficulty += overlapBonus;
@ -163,7 +174,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators
public static double EvaluateAimingDensityFactorOf(DifficultyHitObject current)
{
double difficulty = ((OsuDifficultyHitObject)current).Density;
double difficulty = EvaluateDensityOf(current, true, false);
return Math.Max(0, Math.Pow(difficulty, 1.5) - 1);
}
@ -292,7 +303,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators
{
var currObj = (OsuDifficultyHitObject)current;
double density = ReadingEvaluator.EvaluateDensityOf(current, false);
double density = ReadingEvaluator.EvaluateDensityOf(current, false, false);
double preempt = currObj.Preempt / 1000;
double densityFactor = Math.Pow(density / 6.2, 1.5);

View File

@ -103,11 +103,6 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
/// </summary>
public double RhythmDifficulty { get; private set; }
/// <summary>
/// Density of the object for given preempt. Saved for optimization, density calculation is expensive.
/// </summary>
public double Density { get; private set; }
/// <summary>
/// Predictabiliy of the angle. Gives high values only in exceptionally repetitive patterns.
/// </summary>
@ -175,7 +170,6 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Preprocessing
(ReadingObjects, OverlapValues) = getReadingObjects();
RhythmDifficulty = RhythmEvaluator.EvaluateDifficultyOf(this);
Density = ReadingEvaluator.EvaluateDensityOf(this);
}
private (IList<ReadingObject>, IDictionary<int, double>) getReadingObjects()

View File

@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
public class ReadingLowAR : GraphSkill
{
private readonly List<double> difficulties = new List<double>();
private double skillMultiplier => 1.26;
private double skillMultiplier => 1.22;
private double aimComponentMultiplier => 0.4;
public ReadingLowAR(Mod[] mods)