Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace the length bonus with a new bonus dependant on object difficulty #30924

Open
wants to merge 21 commits into
base: pp-dev
Choose a base branch
from

Conversation

TextAdventurer12
Copy link
Contributor

@TextAdventurer12 TextAdventurer12 commented Nov 29, 2024

The current length bonus depends only on object count, which means maps with very short difficulty spikes and a large amount of easy objects receive excess length bonus (such as Save Me), while maps with very consistent difficulty do not receive sufficient length bonus (such as Devour Me, Colossus)
The new bonus using a weighted sum similar to that used in the miss penalty (however it is slightly different, and a different variable is used to prevent unwanted changes to the miss penalty), and uses the result of that as a length factor.

This is intended to go alongside #30923 and the #30925, both of which aid in creating a suitable base for this new bonus to function.

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.

Upon initial review I mostly have questions around reasons/rationale for some of these, as they don't really explain themselves.

I have one other open question though - how feasible would it be for the length bonuses to be modeled under the idea that length bonus starts at 1.0 and either stays the same or increases? Essentially, can we have the length bonus actually act as a bonus and not a factor that is generally applied?

My naive first assumption would be that you could remove the non-1.0 base from the formulas and then adjust the global multiplier to compensate and essentially simplify the bonus, but feel free to correct me if I'm wrong.

@@ -79,7 +96,7 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat
);

double starRating = basePerformance > 0.00001
? Math.Cbrt(OsuPerformanceCalculator.PERFORMANCE_BASE_MULTIPLIER) * 0.027 * (Math.Cbrt(100000 / Math.Pow(2, 1 / 1.1) * basePerformance) + 4)
? Math.Cbrt(OsuPerformanceCalculator.PERFORMANCE_BASE_MULTIPLIER) * 0.026 * (Math.Cbrt(100000 / Math.Pow(2, 1 / 1.1) * basePerformance) + 4)
Copy link
Member

Choose a reason for hiding this comment

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

Why?

Copy link

Choose a reason for hiding this comment

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

Why?

Pretty sure this was changed because adding length bonus juiced up some maps way too much, kermit can probably elaborate better

Copy link
Contributor Author

Choose a reason for hiding this comment

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

puttng length bonus into star rating increases star rating for everything, so I decreased multiplier to account for that and keep the average about the same

Copy link
Member

Choose a reason for hiding this comment

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

Was changing PERFORMANCE_BASE_MULTIPLIER not good enough? Ideally we avoid touching the actual formula if we can help 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.

changing PERFORMANCE_BASE_MULTIPLIER would affect final pp values, when the problem is with the star rating => pp relationship. Including length in star rating means that for the same pp value star rating will be higher, and so the multiplier in the formula is decreased to keep it on average the same.

Copy link
Member

@tsunyoku tsunyoku Dec 12, 2024

Choose a reason for hiding this comment

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

Yeah sure that makes sense.

double aimLengthBonus = (aimRelevantObjectCount < 25 ? 0.8 + aimRelevantObjectCount / 150.0 : 0.9 + Math.Min(1.5, aimRelevantObjectCount / 375.0) +
(aimRelevantObjectCount > 562.5 ? Math.Log10(aimRelevantObjectCount / 562.5) : 0));
aimRating *= Math.Cbrt(aimLengthBonus);
double aimNoSlidersLengthBonus = (aimNoSlidersRelevantObjectCount < 25 ? 0.8 + aimNoSlidersRelevantObjectCount / 150.0 : 0.9 + aimNoSlidersRelevantObjectCount / 375.0);
Copy link
Member

Choose a reason for hiding this comment

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

Is it intended that the no sliders bonus is missing half of the bonus? If so, why?

Copy link

Choose a reason for hiding this comment

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

Is it intended that the no sliders bonus is missing half of the bonus? If so, why?

Yes this is an oversight, it's supposed to be the same length bonus. Happened when we added the fix for the very long consistent maps, will fix

Comment on lines 72 to 73
double aimLengthBonus = (aimRelevantObjectCount < 25 ? 0.8 + aimRelevantObjectCount / 150.0 : 0.9 + Math.Min(1.5, aimRelevantObjectCount / 375.0) +
(aimRelevantObjectCount > 562.5 ? Math.Log10(aimRelevantObjectCount / 562.5) : 0));
Copy link
Member

Choose a reason for hiding this comment

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

A lot of this feels particularly random/arbitrary upon reading. Why aimRelevantCount < 25? Why aimRelevantObjectCount > 562.5 on the second part of the bonus (this one is particularly more questionable for me - 562.5?)

Copy link

Choose a reason for hiding this comment

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

The initial arbitrary curve change is for the ringtone nerf in place due to strain reduction removal, it can be removed in case a better way to nerf such maps is implemented. The second part with the super specific 562.5 is basically where the log begins to fix the pp drop issue for incredibly long maps. It could probably be made to look more pretty but I didn't see too much of an issue personally.

@TextAdventurer12
Copy link
Contributor Author

I have one other open question though - how feasible would it be for the length bonuses to be modeled under the idea that length bonus starts at 1.0 and either stays the same or increases? Essentially, can we have the length bonus actually act as a bonus and not a factor that is generally applied?

it would be possible, but I don't really see the purpose. It's doing the exact same thing, just taking out a common factor and moving it somewhere else.

@tsunyoku
Copy link
Member

but I don't really see the purpose.

In my opinion it makes the intent of the bonus a little clearer, and also for people touching other places of the system it would be easier to balance changes around the length bonus since they don't have both factors reducing difficulty.

@kwotaq
Copy link

kwotaq commented Dec 16, 2024

but I don't really see the purpose.

In my opinion it makes the intent of the bonus a little clearer, and also for people touching other places of the system it would be easier to balance changes around the length bonus since they don't have both factors reducing difficulty.

Making the bonuses start from 1 makes them look even more unnecessarily complex since we have to multiply everything by the common factor. Making them look prettier requires value changes which takes us back to the balancing stage.

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.

Just tiny formatting things I noticed. I can live with not making the length bonus 1-based, it was just an idea.

Comment on lines 69 to 72
//Being consistently difficult for 1000 notes should be worth more than being consistently difficult for 100.
double totalStrains = ObjectStrains.Count;
double lengthFactor = 0.74 * Math.Pow(0.9987, totalStrains);
//// Use a weighted sum of all strains. Constants are arbitrary and give nice values
Copy link
Member

Choose a reason for hiding this comment

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

Can we fix up the formatting on these comments

: 0.9 + Math.Min(1.5, aimRelevantObjectCount / 375.0) +
(aimRelevantObjectCount > 562.5 ? Math.Log10(aimRelevantObjectCount / 562.5) : 0);
aimRating *= Math.Cbrt(aimLengthBonus);
double aimNoSlidersLengthBonus = aimNoSlidersRelevantObjectCount < 25
Copy link
Member

Choose a reason for hiding this comment

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

Nitpicking but can we add some whitespace between these bonuses just to make it easier to digest

@TextAdventurer12 TextAdventurer12 changed the base branch from master to pp-dev December 18, 2024 07:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: In Progress
Development

Successfully merging this pull request may close these issues.

5 participants