update miss penalty to use less flawed algo
This commit is contained in:
+14
-7
@@ -357,7 +357,10 @@ impl<'m> OsuPP<'m> {
|
|||||||
|
|
||||||
// Penalize misses
|
// Penalize misses
|
||||||
if effective_miss_count > 0.0 {
|
if effective_miss_count > 0.0 {
|
||||||
let miss_penalty = self.calculate_miss_penalty(effective_miss_count);
|
let miss_penalty = self.calculate_miss_penalty(
|
||||||
|
effective_miss_count,
|
||||||
|
attributes.aim_difficult_strain_count,
|
||||||
|
);
|
||||||
aim_value *= miss_penalty;
|
aim_value *= miss_penalty;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,7 +429,10 @@ impl<'m> OsuPP<'m> {
|
|||||||
|
|
||||||
// Penalize misses
|
// Penalize misses
|
||||||
if effective_miss_count > 0.0 {
|
if effective_miss_count > 0.0 {
|
||||||
let miss_penalty = self.calculate_miss_penalty(effective_miss_count);
|
let miss_penalty = self.calculate_miss_penalty(
|
||||||
|
effective_miss_count,
|
||||||
|
attributes.speed_difficult_strain_count,
|
||||||
|
);
|
||||||
speed_value *= miss_penalty;
|
speed_value *= miss_penalty;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -504,11 +510,12 @@ impl<'m> OsuPP<'m> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn calculate_miss_penalty(&self, effective_miss_count: f32) -> f32 {
|
fn calculate_miss_penalty(
|
||||||
let total_hits = self.total_hits() as f32;
|
&self,
|
||||||
|
effective_miss_count: f32,
|
||||||
0.97 * (1.0 - (effective_miss_count / total_hits).powf(0.5))
|
difficult_strain_count: f32,
|
||||||
.powf(1.0 + (effective_miss_count / 1.5))
|
) -> f32 {
|
||||||
|
0.94 / ((effective_miss_count / (2.0 * difficult_strain_count.sqrt())) + 1.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -72,16 +72,13 @@ impl Skill {
|
|||||||
difficulty
|
difficulty
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn count_difficult_strains(&mut self) -> f64 {
|
pub(crate) fn count_difficult_strains(&mut self) -> f32 {
|
||||||
let top_strain = self
|
let single_strain = self.difficulty_value() / 10.0;
|
||||||
.object_strains
|
|
||||||
.iter()
|
|
||||||
.fold(f64::NEG_INFINITY, |prev, curr| prev.max(*curr as f64));
|
|
||||||
|
|
||||||
self.object_strains
|
self.object_strains
|
||||||
.iter()
|
.iter()
|
||||||
.map(|strain| (strain / top_strain as f32).powi(4))
|
.map(|strain| 1.1 / (1.0 + (-10.0 * (strain / single_strain - 0.88)).exp()))
|
||||||
.sum::<f32>() as f64
|
.sum::<f32>()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -155,8 +155,8 @@ pub struct OsuDifficultyAttributes {
|
|||||||
pub n_spinners: usize,
|
pub n_spinners: usize,
|
||||||
pub stars: f64,
|
pub stars: f64,
|
||||||
pub max_combo: usize,
|
pub max_combo: usize,
|
||||||
pub aim_difficult_strain_count: f64,
|
pub aim_difficult_strain_count: f32,
|
||||||
pub speed_difficult_strain_count: f64,
|
pub speed_difficult_strain_count: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|||||||
Reference in New Issue
Block a user