store duration instead of end_time (/b/1901200+Mania)

This commit is contained in:
MaxOhn
2024-02-19 15:03:05 +01:00
parent 305041376b
commit f2bb6ce6cb
10 changed files with 39 additions and 33 deletions
+3 -3
View File
@@ -107,9 +107,9 @@ fn convert_object<'a>(
ObjectIterState::JuiceStream(stream) ObjectIterState::JuiceStream(stream)
} }
HitObjectKind::Spinner(Spinner { end_time }) HitObjectKind::Spinner(Spinner { duration })
| HitObjectKind::Hold(HoldNote { end_time }) => { | HitObjectKind::Hold(HoldNote { duration }) => {
ObjectIterState::BananaShower(BananaShower::new(h.start_time, end_time)) ObjectIterState::BananaShower(BananaShower::new(h.start_time, duration))
} }
}; };
+2 -2
View File
@@ -3,9 +3,9 @@ pub struct BananaShower {
} }
impl BananaShower { impl BananaShower {
pub fn new(start_time: f64, end_time: f64) -> Self { pub fn new(start_time: f64, duration: f64) -> Self {
let duration = end_time - start_time;
let mut spacing = duration; let mut spacing = duration;
let end_time = start_time + duration;
while spacing > 100.0 { while spacing > 100.0 {
spacing /= 2.0; spacing /= 2.0;
+4 -2
View File
@@ -132,8 +132,10 @@ fn convert(map: &mut Beatmap) {
last_values.pattern = new_pattern; last_values.pattern = new_pattern;
} }
} }
HitObjectKind::Spinner(Spinner { end_time }) HitObjectKind::Spinner(Spinner { duration })
| HitObjectKind::Hold(HoldNote { end_time }) => { | HitObjectKind::Hold(HoldNote { duration }) => {
let end_time = obj.start_time + duration;
let mut gen = EndTimeObjectPatternGenerator::new( let mut gen = EndTimeObjectPatternGenerator::new(
&mut random, &mut random,
obj, obj,
+9 -5
View File
@@ -72,7 +72,7 @@ impl Pattern {
pos, pos,
start_time: generator.inner.hit_object.start_time, start_time: generator.inner.hit_object.start_time,
kind: HitObjectKind::Hold(HoldNote { kind: HitObjectKind::Hold(HoldNote {
end_time: generator.end_time, duration: generator.end_time - generator.inner.hit_object.start_time,
}), }),
} }
} else { } else {
@@ -102,11 +102,13 @@ impl Pattern {
kind: HitObjectKind::Circle, kind: HitObjectKind::Circle,
} }
} else { } else {
let start_time = f64::from(start_time);
HitObject { HitObject {
pos, pos,
start_time: f64::from(start_time), start_time,
kind: HitObjectKind::Hold(HoldNote { kind: HitObjectKind::Hold(HoldNote {
end_time: f64::from(end_time), duration: f64::from(end_time) - start_time,
}), }),
} }
}; };
@@ -131,11 +133,13 @@ impl Pattern {
kind: HitObjectKind::Circle, kind: HitObjectKind::Circle,
} }
} else { } else {
let start_time = f64::from(start_time);
HitObject { HitObject {
pos, pos,
start_time: f64::from(start_time), start_time,
kind: HitObjectKind::Hold(HoldNote { kind: HitObjectKind::Hold(HoldNote {
end_time: f64::from(end_time), duration: f64::from(end_time) - start_time,
}), }),
} }
}; };
@@ -80,9 +80,6 @@ impl<'h> EndTimeObjectPatternGenerator<'h> {
&mut self, &mut self,
mut initial_column: u8, mut initial_column: u8,
lower: Option<i32>, lower: Option<i32>,
// upper: Option<i32>,
// next_column: Option<&dyn Fn(u8) -> u8>,
// validation: Option<&dyn Fn(i32) -> bool>,
patterns: &[&Pattern], patterns: &[&Pattern],
) -> u8 { ) -> u8 {
let lower = lower.unwrap_or_else(|| self.inner.random_start()); let lower = lower.unwrap_or_else(|| self.inner.random_start());
+4 -4
View File
@@ -54,13 +54,13 @@ impl ManiaObject {
column, column,
} }
} }
HitObjectKind::Spinner(Spinner { end_time }) HitObjectKind::Spinner(Spinner { duration })
| HitObjectKind::Hold(HoldNote { end_time }) => { | HitObjectKind::Hold(HoldNote { duration }) => {
params.max_combo += ((end_time - h.start_time) / 100.0) as u32; params.max_combo += (duration / 100.0) as u32;
Self { Self {
start_time: h.start_time, start_time: h.start_time,
end_time, end_time: h.start_time + duration,
column, column,
} }
} }
+6 -2
View File
@@ -615,7 +615,9 @@ impl DecodeBeatmap for Beatmap {
parse_custom_sound(split.next())?; parse_custom_sound(split.next())?;
HitObjectKind::Spinner(Spinner { end_time }) let duration = (end_time - start_time).max(0.0);
HitObjectKind::Spinner(Spinner { duration })
} else if hit_object_type.has_flag(HitObjectType::HOLD) { } else if hit_object_type.has_flag(HitObjectType::HOLD) {
let end_time = if let Some(s) = split.next().filter(|s| !s.is_empty()) { let end_time = if let Some(s) = split.next().filter(|s| !s.is_empty()) {
let (end_time, bank_info) = s let (end_time, bank_info) = s
@@ -629,7 +631,9 @@ impl DecodeBeatmap for Beatmap {
start_time start_time
}; };
HitObjectKind::Hold(HoldNote { end_time }) let duration = end_time - start_time;
HitObjectKind::Hold(HoldNote { duration })
} else { } else {
return Err(ParseBeatmapError::UnknownHitObjectType); return Err(ParseBeatmapError::UnknownHitObjectType);
}; };
+5 -5
View File
@@ -35,11 +35,11 @@ impl HitObject {
/// The end time of the object. /// The end time of the object.
/// ///
/// Note that this will not return the correct value for sliders. /// Note that this will not return the correct value for sliders.
pub(crate) const fn end_time(&self) -> f64 { pub(crate) fn end_time(&self) -> f64 {
match &self.kind { match &self.kind {
HitObjectKind::Circle | HitObjectKind::Slider { .. } => self.start_time, HitObjectKind::Circle | HitObjectKind::Slider { .. } => self.start_time,
HitObjectKind::Spinner(Spinner { end_time }) HitObjectKind::Spinner(Spinner { duration })
| HitObjectKind::Hold(HoldNote { end_time }) => *end_time, | HitObjectKind::Hold(HoldNote { duration }) => self.start_time + *duration,
} }
} }
} }
@@ -84,11 +84,11 @@ impl Slider {
/// A spinner. /// A spinner.
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]
pub struct Spinner { pub struct Spinner {
pub end_time: f64, pub duration: f64,
} }
/// A hold note. /// A hold note.
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]
pub struct HoldNote { pub struct HoldNote {
pub end_time: f64, pub duration: f64,
} }
+4 -4
View File
@@ -39,8 +39,8 @@ impl OsuObject {
OsuObjectKind::Slider(OsuSlider::new(h, slider, converted, curve_bufs, ticks_buf)) OsuObjectKind::Slider(OsuSlider::new(h, slider, converted, curve_bufs, ticks_buf))
} }
HitObjectKind::Spinner(spinner) => OsuObjectKind::Spinner(spinner), HitObjectKind::Spinner(spinner) => OsuObjectKind::Spinner(spinner),
HitObjectKind::Hold(HoldNote { end_time }) => { HitObjectKind::Hold(HoldNote { duration }) => {
OsuObjectKind::Spinner(Spinner { end_time }) OsuObjectKind::Spinner(Spinner { duration })
} }
}; };
@@ -95,11 +95,11 @@ impl OsuObject {
} }
} }
pub const fn end_time(&self) -> f64 { pub fn end_time(&self) -> f64 {
match self.kind { match self.kind {
OsuObjectKind::Circle => self.start_time, OsuObjectKind::Circle => self.start_time,
OsuObjectKind::Slider(ref slider) => slider.end_time, OsuObjectKind::Slider(ref slider) => slider.end_time,
OsuObjectKind::Spinner(ref spinner) => spinner.end_time, OsuObjectKind::Spinner(ref spinner) => self.start_time + spinner.duration,
} }
} }
+2 -3
View File
@@ -93,9 +93,8 @@ fn convert(map: &mut Beatmap) {
} }
} }
} }
// Pathological case; shouldn't realistically happen HitObjectKind::Hold(HoldNote { duration }) => {
HitObjectKind::Hold(HoldNote { end_time }) => { map.hit_objects[idx].kind = HitObjectKind::Spinner(Spinner { duration });
map.hit_objects[idx].kind = HitObjectKind::Spinner(Spinner { end_time });
} }
} }