Skip to content

Conversation

@Givikap120
Copy link
Contributor

This is a base version of separation that mainly focuses on preserving correct balancing.
Intended to be expanded with various bonuses that will improve quality of evaluators.

Copy link
Member

@tsunyoku tsunyoku left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some comments to get us started.

Comment on lines 131 to 134
// We want to use the average velocity over the whole object when awarding differences, not the individual jump and slider path velocities.
prevVelocity = (osuLastObj.LazyJumpDistance + osuLastLastObj.TravelDistance) / osuLastObj.AdjustedDeltaTime;
currVelocity = (osuCurrObj.LazyJumpDistance + osuLastObj.TravelDistance) / osuCurrObj.AdjustedDeltaTime;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the purpose of moving this out?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because then when it will be run inside the if statement - currVelocity and prevVelocity may be set to 0 both, and the evaluator will return NaN

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is referencing these that wasn't before? are you implying this is a pre-existing issue? I don't understand

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Zero velocity can be turned into non-zero thanks to "snapping difficulty"
so when raw velocity is recalculated for velocity change bonus - it can drop it back to zero again

Comment on lines 43 to 53
// Rescale the distance to make it closer d/t
if (osuCurrObj.LazyJumpDistance > diameter)
{
// Change those 2 power coeficients to control amount of buff high spaced flow aim has for comfy/uncomfy patterns
flowDifficulty *= Math.Pow(osuCurrObj.LazyJumpDistance / diameter, 0.4);
}
else
{
// Decrease power here if you want to buff low-spaced flow aim
flowDifficulty *= Math.Pow(osuCurrObj.LazyJumpDistance / diameter, 0.8);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this entire thing intended to be a crutch as a result of d/t^2? do things break without it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

theoretically flow aim should be d/t. So in order to achieve it in current strain system you need to raise distance to the power of 2.
But in practice the number "2" doesn't work, so instead I've used here numbers 1.4 and 1.8 (depending on spacing). They give the best results from my testing.

Comment on lines 156 to 181
// Summation for aim and speed, reducing reward for mixed maps
public static double SumMechanicalDifficulty(double aim, double speed)
{
const double addition_portion = 0.1;

// We take this min to max ratio as a basepoint to be not changed when addition_portion is changed
const double balance_base_point = 0.2;
const double power = 1.1;

// This is automatically-computed multiplier to avoid manual multiplier balancing when addition_portion is changed
double multiplier = Math.Pow(1 + Math.Pow(balance_base_point, power), 1.0 / power) /
Math.Pow(
Math.Pow(1 + addition_portion, power) +
Math.Pow(balance_base_point + addition_portion, power), 1.0 / power
);

double max = Math.Max(aim, speed);

double difficulty =
Math.Pow(
Math.Pow(aim + addition_portion * max, power) +
Math.Pow(speed + addition_portion * max, power), 1.0 / power
);

return difficulty * multiplier;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this?

Copy link
Contributor Author

@Givikap120 Givikap120 Oct 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This changes summation from current ^1.1 to more complicated.
Makes the balance significantly better because otherwise maps with similar aim and speed values were worth way too much.

Comment on lines 110 to 112
// To ensure that result would not be bigger than normal aim difficulty rating
if (mods.Any(m => m is OsuModTouchDevice))
flowAimRating = Math.Pow(flowAimRating, 0.83);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this still yield a TD nerf for flow aim in the end?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It still nerfs flow aim on TD in the end. I may try to fix it but I don't sure this is necessary.

Comment on lines +95 to +97
// Rescale wide angle bonus to reward lower spacing more
double velocityThreshold = diameter * 2.3 / osuCurrObj.AdjustedDeltaTime;
double wideVelocityBase = Math.Min(angleBonus, velocityThreshold + 0.4 * (angleBonus - velocityThreshold));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here the scaling for aim was changed from d/t^2.2 (roughly) to d/t^2 thanks to no distance limit in speed
Because of this - all high spaced patterns were buffed. But because wide angle bonus as very big spacing - by far the most buffed patterns were squares and c-type type stuff.
They were buffed significantly regardless of BPM (so it's now because of snapping difficulty thing), this rescale brings it back to be similar how it looked in master

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Pending Review

Development

Successfully merging this pull request may close these issues.

2 participants