store hit_window in speed skill
This commit is contained in:
@@ -55,7 +55,6 @@ pub struct OsuGradualDifficultyAttributes {
|
|||||||
hit_objects: Vec<OsuObject>,
|
hit_objects: Vec<OsuObject>,
|
||||||
diff_objects: Vec<OsuDifficultyObject<'static>>,
|
diff_objects: Vec<OsuDifficultyObject<'static>>,
|
||||||
skills: Skills,
|
skills: Skills,
|
||||||
hit_window: f64,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for OsuGradualDifficultyAttributes {
|
impl Debug for OsuGradualDifficultyAttributes {
|
||||||
@@ -65,7 +64,6 @@ impl Debug for OsuGradualDifficultyAttributes {
|
|||||||
.field("attrs", &self.attrs)
|
.field("attrs", &self.attrs)
|
||||||
.field("diff_objects", &self.diff_objects)
|
.field("diff_objects", &self.diff_objects)
|
||||||
.field("skills", &self.skills)
|
.field("skills", &self.skills)
|
||||||
.field("hit_window", &self.hit_window)
|
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -133,7 +131,13 @@ impl OsuGradualDifficultyAttributes {
|
|||||||
h
|
h
|
||||||
});
|
});
|
||||||
|
|
||||||
let skills = Skills::new(mods, scaling_factor.radius, time_preempt, time_fade_in);
|
let skills = Skills::new(
|
||||||
|
mods,
|
||||||
|
scaling_factor.radius,
|
||||||
|
time_preempt,
|
||||||
|
time_fade_in,
|
||||||
|
hit_window,
|
||||||
|
);
|
||||||
|
|
||||||
let last = match hit_objects_iter.next() {
|
let last = match hit_objects_iter.next() {
|
||||||
Some(prev) => prev,
|
Some(prev) => prev,
|
||||||
@@ -145,7 +149,6 @@ impl OsuGradualDifficultyAttributes {
|
|||||||
hit_objects: Vec::new(),
|
hit_objects: Vec::new(),
|
||||||
diff_objects: Vec::new(),
|
diff_objects: Vec::new(),
|
||||||
skills,
|
skills,
|
||||||
hit_window,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -189,7 +192,6 @@ impl OsuGradualDifficultyAttributes {
|
|||||||
diff_objects: extend_lifetime(diff_objects),
|
diff_objects: extend_lifetime(diff_objects),
|
||||||
hit_objects,
|
hit_objects,
|
||||||
skills,
|
skills,
|
||||||
hit_window,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,8 +224,7 @@ impl Iterator for OsuGradualDifficultyAttributes {
|
|||||||
let curr = self.diff_objects.get(self.idx)?;
|
let curr = self.diff_objects.get(self.idx)?;
|
||||||
self.idx += 1;
|
self.idx += 1;
|
||||||
|
|
||||||
self.skills
|
self.skills.process(curr, &self.diff_objects);
|
||||||
.process(curr, &self.diff_objects, self.hit_window);
|
|
||||||
|
|
||||||
Self::increment_combo(curr.base, &mut self.attrs);
|
Self::increment_combo(curr.base, &mut self.attrs);
|
||||||
|
|
||||||
@@ -308,8 +309,7 @@ impl Iterator for OsuGradualDifficultyAttributes {
|
|||||||
let curr = self.diff_objects.get(self.idx)?;
|
let curr = self.diff_objects.get(self.idx)?;
|
||||||
self.idx += 1;
|
self.idx += 1;
|
||||||
|
|
||||||
self.skills
|
self.skills.process(curr, &self.diff_objects);
|
||||||
.process(curr, &self.diff_objects, self.hit_window);
|
|
||||||
|
|
||||||
Self::increment_combo(curr.base, &mut self.attrs);
|
Self::increment_combo(curr.base, &mut self.attrs);
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-2
@@ -298,7 +298,13 @@ fn calculate_skills(params: OsuStars<'_>) -> (Skills, OsuDifficultyAttributes) {
|
|||||||
h
|
h
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut skills = Skills::new(mods, scaling_factor.radius, time_preempt, time_fade_in);
|
let mut skills = Skills::new(
|
||||||
|
mods,
|
||||||
|
scaling_factor.radius,
|
||||||
|
time_preempt,
|
||||||
|
time_fade_in,
|
||||||
|
hit_window,
|
||||||
|
);
|
||||||
|
|
||||||
let last = match hit_objects.next() {
|
let last = match hit_objects.next() {
|
||||||
Some(prev) => prev,
|
Some(prev) => prev,
|
||||||
@@ -336,7 +342,7 @@ fn calculate_skills(params: OsuStars<'_>) -> (Skills, OsuDifficultyAttributes) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for curr in diff_objects.iter() {
|
for curr in diff_objects.iter() {
|
||||||
skills.process(curr, &diff_objects, hit_window);
|
skills.process(curr, &diff_objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
(skills, attrs)
|
(skills, attrs)
|
||||||
|
|||||||
@@ -38,9 +38,8 @@ impl Skill for Aim {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) {
|
) {
|
||||||
<Self as StrainSkill>::process(self, curr, diff_objects, hit_window)
|
<Self as StrainSkill>::process(self, curr, diff_objects)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -70,7 +69,6 @@ impl StrainSkill for Aim {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
_hit_window: f64,
|
|
||||||
) -> f64 {
|
) -> f64 {
|
||||||
self.curr_strain *= Self::strain_decay(curr.delta_time);
|
self.curr_strain *= Self::strain_decay(curr.delta_time);
|
||||||
self.curr_strain += AimEvaluator::evaluate_diff_of(curr, diff_objects, self.with_sliders)
|
self.curr_strain += AimEvaluator::evaluate_diff_of(curr, diff_objects, self.with_sliders)
|
||||||
|
|||||||
@@ -45,9 +45,8 @@ impl Skill for Flashlight {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) {
|
) {
|
||||||
<Self as StrainSkill>::process(self, curr, diff_objects, hit_window)
|
<Self as StrainSkill>::process(self, curr, diff_objects)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -79,7 +78,6 @@ impl StrainSkill for Flashlight {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
_hit_window: f64,
|
|
||||||
) -> f64 {
|
) -> f64 {
|
||||||
self.curr_strain *= Self::strain_decay(curr.delta_time);
|
self.curr_strain *= Self::strain_decay(curr.delta_time);
|
||||||
self.curr_strain += FlashlightEvaluator::evaluate_diff_of(
|
self.curr_strain += FlashlightEvaluator::evaluate_diff_of(
|
||||||
|
|||||||
+12
-7
@@ -21,11 +21,17 @@ pub(crate) struct Skills {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Skills {
|
impl Skills {
|
||||||
pub(crate) fn new(mods: u32, radius: f32, time_preempt: f64, time_fade_in: f64) -> Self {
|
pub(crate) fn new(
|
||||||
|
mods: u32,
|
||||||
|
radius: f32,
|
||||||
|
time_preempt: f64,
|
||||||
|
time_fade_in: f64,
|
||||||
|
hit_window: f64,
|
||||||
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
aim: Aim::new(true),
|
aim: Aim::new(true),
|
||||||
aim_no_sliders: Aim::new(false),
|
aim_no_sliders: Aim::new(false),
|
||||||
speed: Speed::new(),
|
speed: Speed::new(hit_window),
|
||||||
flashlight: Flashlight::new(mods, radius, time_preempt, time_fade_in),
|
flashlight: Flashlight::new(mods, radius, time_preempt, time_fade_in),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,12 +40,11 @@ impl Skills {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) {
|
) {
|
||||||
<Aim as Skill>::process(&mut self.aim, curr, diff_objects, hit_window);
|
<Aim as Skill>::process(&mut self.aim, curr, diff_objects);
|
||||||
<Aim as Skill>::process(&mut self.aim_no_sliders, curr, diff_objects, hit_window);
|
<Aim as Skill>::process(&mut self.aim_no_sliders, curr, diff_objects);
|
||||||
<Speed as Skill>::process(&mut self.speed, curr, diff_objects, hit_window);
|
<Speed as Skill>::process(&mut self.speed, curr, diff_objects);
|
||||||
<Flashlight as Skill>::process(&mut self.flashlight, curr, diff_objects, hit_window);
|
<Flashlight as Skill>::process(&mut self.flashlight, curr, diff_objects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,13 +12,14 @@ pub(crate) struct Speed {
|
|||||||
curr_rhythm: f64,
|
curr_rhythm: f64,
|
||||||
pub(crate) strain_peaks: Vec<f64>,
|
pub(crate) strain_peaks: Vec<f64>,
|
||||||
object_strains: Vec<f64>,
|
object_strains: Vec<f64>,
|
||||||
|
hit_window: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Speed {
|
impl Speed {
|
||||||
const SKILL_MULTIPLIER: f64 = 1375.0;
|
const SKILL_MULTIPLIER: f64 = 1375.0;
|
||||||
const STRAIN_DECAY_BASE: f64 = 0.3;
|
const STRAIN_DECAY_BASE: f64 = 0.3;
|
||||||
|
|
||||||
pub(crate) fn new() -> Self {
|
pub(crate) fn new(hit_window: f64) -> Self {
|
||||||
Self {
|
Self {
|
||||||
curr_strain: 0.0,
|
curr_strain: 0.0,
|
||||||
curr_section_peak: 0.0,
|
curr_section_peak: 0.0,
|
||||||
@@ -26,6 +27,7 @@ impl Speed {
|
|||||||
curr_rhythm: 0.0,
|
curr_rhythm: 0.0,
|
||||||
strain_peaks: Vec::new(),
|
strain_peaks: Vec::new(),
|
||||||
object_strains: Vec::new(),
|
object_strains: Vec::new(),
|
||||||
|
hit_window,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,9 +55,8 @@ impl Skill for Speed {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) {
|
) {
|
||||||
<Self as StrainSkill>::process(self, curr, diff_objects, hit_window)
|
<Self as StrainSkill>::process(self, curr, diff_objects)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -85,12 +86,11 @@ impl StrainSkill for Speed {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) -> f64 {
|
) -> f64 {
|
||||||
self.curr_strain *= Self::strain_decay(curr.strain_time);
|
self.curr_strain *= Self::strain_decay(curr.strain_time);
|
||||||
self.curr_strain += SpeedEvaluator::evaluate_diff_of(curr, diff_objects, hit_window)
|
self.curr_strain += SpeedEvaluator::evaluate_diff_of(curr, diff_objects, self.hit_window)
|
||||||
* Self::SKILL_MULTIPLIER;
|
* Self::SKILL_MULTIPLIER;
|
||||||
self.curr_rhythm = RhythmEvaluator::evaluate_diff_of(curr, diff_objects, hit_window);
|
self.curr_rhythm = RhythmEvaluator::evaluate_diff_of(curr, diff_objects, self.hit_window);
|
||||||
|
|
||||||
let total_strain = self.curr_strain * self.curr_rhythm;
|
let total_strain = self.curr_strain * self.curr_rhythm;
|
||||||
self.object_strains.push(total_strain);
|
self.object_strains.push(total_strain);
|
||||||
|
|||||||
@@ -3,12 +3,7 @@ use std::{cmp::Ordering, mem};
|
|||||||
use crate::osu::{difficulty_object::OsuDifficultyObject, SECTION_LEN};
|
use crate::osu::{difficulty_object::OsuDifficultyObject, SECTION_LEN};
|
||||||
|
|
||||||
pub(crate) trait Skill {
|
pub(crate) trait Skill {
|
||||||
fn process(
|
fn process(&mut self, curr: &OsuDifficultyObject<'_>, diff_objects: &[OsuDifficultyObject<'_>]);
|
||||||
&mut self,
|
|
||||||
curr: &OsuDifficultyObject<'_>,
|
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
|
||||||
hit_window: f64,
|
|
||||||
);
|
|
||||||
fn difficulty_value(&mut self) -> f64;
|
fn difficulty_value(&mut self) -> f64;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,7 +18,6 @@ pub(crate) trait StrainSkill: Skill + Sized {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) -> f64;
|
) -> f64;
|
||||||
|
|
||||||
fn calculate_initial_strain(
|
fn calculate_initial_strain(
|
||||||
@@ -37,7 +31,6 @@ pub(crate) trait StrainSkill: Skill + Sized {
|
|||||||
&mut self,
|
&mut self,
|
||||||
curr: &OsuDifficultyObject<'_>,
|
curr: &OsuDifficultyObject<'_>,
|
||||||
diff_objects: &[OsuDifficultyObject<'_>],
|
diff_objects: &[OsuDifficultyObject<'_>],
|
||||||
hit_window: f64,
|
|
||||||
) {
|
) {
|
||||||
// * The first object doesn't generate a strain, so we begin with an incremented section end
|
// * The first object doesn't generate a strain, so we begin with an incremented section end
|
||||||
if curr.idx == 0 {
|
if curr.idx == 0 {
|
||||||
@@ -57,7 +50,7 @@ pub(crate) trait StrainSkill: Skill + Sized {
|
|||||||
}
|
}
|
||||||
|
|
||||||
*self.curr_section_peak() = self
|
*self.curr_section_peak() = self
|
||||||
.strain_value_at(curr, diff_objects, hit_window)
|
.strain_value_at(curr, diff_objects)
|
||||||
.max(*self.curr_section_peak());
|
.max(*self.curr_section_peak());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user