osu: fixed pp underflow

This commit is contained in:
MaxOhn
2021-02-04 14:30:16 +01:00
parent 6e0bd2c93b
commit f429509c75
2 changed files with 19 additions and 14 deletions
+8 -3
View File
@@ -1,6 +1,11 @@
# Upcoming
- fruits: Fixed passed objects in star calculation
- mania: Fixed pp calculation on HR
- osu: Fixed panic on unwraping unavailable hit results
- osu:
- Fixed panic on unwrapping unavailable hit results
- Fixed occasional underflow when calculating pp with passed_objects
- fruits:
- Fixed passed objects in star calculation
- mania:
- Fixed pp calculation on HR
+11 -11
View File
@@ -279,7 +279,7 @@ impl<'m> OsuPP<'m> {
// Make sure the hitresults and accuracy are set
self.assert_hitresults();
let total_hits = self.total_hits();
let total_hits = self.total_hits() as f32;
let mut multiplier = 1.12;
// NF penalty
@@ -290,11 +290,11 @@ impl<'m> OsuPP<'m> {
// SO penalty
if self.mods.so() {
let n_spinners = self.attributes.as_ref().unwrap().n_spinners;
multiplier *= 1.0 - (n_spinners as f32 / total_hits as f32).powf(0.85);
multiplier *= 1.0 - (n_spinners as f32 / total_hits).powf(0.85);
}
let aim_value = self.compute_aim_value(total_hits as f32);
let speed_value = self.compute_speed_value(total_hits as f32);
let aim_value = self.compute_aim_value(total_hits);
let speed_value = self.compute_speed_value(total_hits);
let acc_value = self.compute_accuracy_value(total_hits);
let pp = (aim_value.powf(1.1) + speed_value.powf(1.1) + acc_value.powf(1.1))
@@ -417,15 +417,15 @@ impl<'m> OsuPP<'m> {
speed_value
}
fn compute_accuracy_value(&self, total_hits: usize) -> f32 {
fn compute_accuracy_value(&self, total_hits: f32) -> f32 {
let attributes = self.attributes.as_ref().unwrap();
let n_circles = attributes.n_circles;
let n_circles = attributes.n_circles as f32;
let n300 = self.n300.unwrap_or(0) as f32;
let n100 = self.n100.unwrap_or(0) as f32;
let n50 = self.n50.unwrap_or(0) as f32;
let better_acc_percentage = (n_circles > 0) as u8 as f32
* (((self.n300.unwrap_or(0) - (total_hits - n_circles)) * 6
+ self.n100.unwrap_or(0) * 2
+ self.n50.unwrap_or(0)) as f32
/ (n_circles * 6) as f32)
let better_acc_percentage = (n_circles > 0.0) as u8 as f32
* (((n300 - (total_hits - n_circles)) * 6.0 + n100 * 2.0 + n50) / (n_circles * 6.0))
.max(0.0);
let mut acc_value = 1.52163_f32.powf(attributes.od) * better_acc_percentage.powi(24) * 2.83;