osu: ignore Hold objects instead of panicking

This commit is contained in:
MaxOhn
2021-01-18 08:45:22 +01:00
parent f75215dd83
commit 6c1a204b41
8 changed files with 153 additions and 145 deletions
+17 -19
View File
@@ -9,23 +9,22 @@ Conversions are generally not supported.
use std::fs::File;
use rosu_pp::{Beatmap, BeatmapExt, GameMode, OsuPP, TaikoPP};
fn main() {
let file = match File::open("/path/to/file.osu") {
let file = match File::open("/path/to/file.osu") {
Ok(file) => file,
Err(why) => panic!("Could not open file: {}", why),
};
};
// Parse the map yourself
let map = match Beatmap::parse(file) {
// Parse the map yourself
let map = match Beatmap::parse(file) {
Ok(map) => map,
Err(why) => panic!("Error while parsing map: {}", why),
};
};
// The different modes make things annoying because their
// pp calculations require different parameters.
// For now, you will have to match on the mode yourself
// to be able to set all options for pp calculation.
match map.mode {
// The different modes make things annoying because their
// pp calculations require different parameters.
// For now, you will have to match on the mode yourself
// to be able to set all options for pp calculation.
match map.mode {
GameMode::STD => {
let result = OsuPP::new(&map)
.mods(24) // HDHR
@@ -63,15 +62,14 @@ fn main() {
println!("Stars: {} | PP: {}", result.stars(), result.pp());
}
GameMode::MNA | GameMode::CTB => panic!("do your thing"),
}
// If all you want is the map's stars or max pp,
// you can make use of the BeatmapExt trait.
let stars = map.stars(16, None); // HR
let max_pp = map.max_pp(16);
println!("Stars: {} | Max PP: {}", stars, max_pp);
}
// If all you want is the map's stars or max pp,
// you can make use of the BeatmapExt trait.
let stars = map.stars(16, None); // HR
let max_pp = map.max_pp(16);
println!("Stars: {} | Max PP: {}", stars, max_pp);
```
#### osu!standard versions
-2
View File
@@ -7,7 +7,6 @@
//! use std::fs::File;
//! use rosu_pp::{Beatmap, BeatmapExt, GameMode, OsuPP, TaikoPP};
//!
//! fn main() {
//! let file = match File::open("/path/to/file.osu") {
//! Ok(file) => file,
//! Err(why) => panic!("Could not open file: {}", why),
@@ -69,7 +68,6 @@
//! let max_pp = map.max_pp(16);
//!
//! println!("Stars: {} | Max PP: {}", stars, max_pp);
//! }
//! ```
//!
//! ### osu!standard versions
+1 -1
View File
@@ -44,7 +44,7 @@ pub fn stars(
.hit_objects
.iter()
.take(take)
.map(|h| OsuObject::new(h, map, &attributes));
.filter_map(|h| OsuObject::new(h, map, &attributes));
let mut skills = vec![Skill::new(SkillKind::Aim), Skill::new(SkillKind::Speed)];
+10 -4
View File
@@ -42,14 +42,18 @@ pub(crate) enum OsuObject {
}
impl OsuObject {
pub(crate) fn new(h: &HitObject, map: &Beatmap, attributes: &BeatmapAttributes) -> Self {
pub(crate) fn new(
h: &HitObject,
map: &Beatmap,
attributes: &BeatmapAttributes,
) -> Option<Self> {
let pos = h.pos;
let time = h.start_time;
let scale = (1.0 - 0.7 * (attributes.cs - 5.0) / 5.0) / 2.0;
let mut stack_height = 0.0;
match &h.kind {
let obj = match &h.kind {
HitObjectKind::Circle => Self::Circle {
pos,
time,
@@ -303,8 +307,10 @@ impl OsuObject {
}
}
HitObjectKind::Spinner { .. } => Self::Spinner { pos, time },
HitObjectKind::Hold { .. } => panic!("found Hold object in osu!standard file"),
}
HitObjectKind::Hold { .. } => return None,
};
Some(obj)
}
#[inline]
+1 -1
View File
@@ -66,7 +66,7 @@ pub fn stars(
let mut slider_state = SliderState::new(map);
let mut ticks_buf = Vec::new();
let mut hit_objects = map.hit_objects.iter().take(take).map(|h| {
let mut hit_objects = map.hit_objects.iter().take(take).filter_map(|h| {
OsuObject::new(
h,
map,
+6 -4
View File
@@ -21,10 +21,10 @@ impl OsuObject {
ticks: &mut Vec<f32>,
attributes: &mut DifficultyAttributes,
slider_state: &mut SliderState,
) -> Self {
) -> Option<Self> {
attributes.max_combo += 1; // hitcircle, slider head, or spinner
match &h.kind {
let obj = match &h.kind {
HitObjectKind::Circle => {
attributes.n_circles += 1;
@@ -168,8 +168,10 @@ impl OsuObject {
travel_dist: None,
}
}
HitObjectKind::Hold { .. } => panic!("found Hold object in osu!standard file"),
}
HitObjectKind::Hold { .. } => return None,
};
Some(obj)
}
#[inline]
+10 -6
View File
@@ -64,32 +64,36 @@ pub fn stars(
let mut n_spinners = 0;
let mut state = SliderState::new(&map);
let mut hit_objects = map.hit_objects.iter().take(take).map(|h| match &h.kind {
let mut hit_objects = map
.hit_objects
.iter()
.take(take)
.filter_map(|h| match &h.kind {
HitObjectKind::Circle => {
max_combo += 1;
n_circles += 1;
Cow::Borrowed(h)
Some(Cow::Borrowed(h))
}
HitObjectKind::Slider {
pixel_len, repeats, ..
} => {
max_combo += state.count_ticks(h.start_time, *pixel_len, *repeats, &map);
Cow::Owned(HitObject {
Some(Cow::Owned(HitObject {
pos: h.pos,
start_time: h.start_time,
kind: HitObjectKind::Circle,
sound: h.sound,
})
}))
}
HitObjectKind::Spinner { .. } => {
max_combo += 1;
n_spinners += 1;
Cow::Borrowed(h)
Some(Cow::Borrowed(h))
}
HitObjectKind::Hold { .. } => panic!("found Hold object in osu!standard map"),
HitObjectKind::Hold { .. } => None,
});
let mut aim = Skill::new(SkillKind::Aim);
+1 -1
View File
@@ -4,7 +4,7 @@ use std::cmp::Ordering;
static COMMON_RHYTHMS: [HitObjectRhythm; 9] = [
HitObjectRhythm {
ratio: 1.0 / 1.0,
ratio: 1.0,
difficulty: 0.0,
},
HitObjectRhythm {