osu: ignore Hold objects instead of panicking
This commit is contained in:
@@ -9,7 +9,6 @@ Conversions are generally not supported.
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use rosu_pp::{Beatmap, BeatmapExt, GameMode, OsuPP, TaikoPP};
|
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,
|
Ok(file) => file,
|
||||||
Err(why) => panic!("Could not open file: {}", why),
|
Err(why) => panic!("Could not open file: {}", why),
|
||||||
@@ -71,7 +70,6 @@ fn main() {
|
|||||||
let max_pp = map.max_pp(16);
|
let max_pp = map.max_pp(16);
|
||||||
|
|
||||||
println!("Stars: {} | Max PP: {}", stars, max_pp);
|
println!("Stars: {} | Max PP: {}", stars, max_pp);
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### osu!standard versions
|
#### osu!standard versions
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
//! use std::fs::File;
|
//! use std::fs::File;
|
||||||
//! use rosu_pp::{Beatmap, BeatmapExt, GameMode, OsuPP, TaikoPP};
|
//! 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,
|
//! Ok(file) => file,
|
||||||
//! Err(why) => panic!("Could not open file: {}", why),
|
//! Err(why) => panic!("Could not open file: {}", why),
|
||||||
@@ -69,7 +68,6 @@
|
|||||||
//! let max_pp = map.max_pp(16);
|
//! let max_pp = map.max_pp(16);
|
||||||
//!
|
//!
|
||||||
//! println!("Stars: {} | Max PP: {}", stars, max_pp);
|
//! println!("Stars: {} | Max PP: {}", stars, max_pp);
|
||||||
//! }
|
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! ### osu!standard versions
|
//! ### osu!standard versions
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ pub fn stars(
|
|||||||
.hit_objects
|
.hit_objects
|
||||||
.iter()
|
.iter()
|
||||||
.take(take)
|
.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)];
|
let mut skills = vec![Skill::new(SkillKind::Aim), Skill::new(SkillKind::Speed)];
|
||||||
|
|
||||||
|
|||||||
@@ -42,14 +42,18 @@ pub(crate) enum OsuObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl 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 pos = h.pos;
|
||||||
let time = h.start_time;
|
let time = h.start_time;
|
||||||
|
|
||||||
let scale = (1.0 - 0.7 * (attributes.cs - 5.0) / 5.0) / 2.0;
|
let scale = (1.0 - 0.7 * (attributes.cs - 5.0) / 5.0) / 2.0;
|
||||||
let mut stack_height = 0.0;
|
let mut stack_height = 0.0;
|
||||||
|
|
||||||
match &h.kind {
|
let obj = match &h.kind {
|
||||||
HitObjectKind::Circle => Self::Circle {
|
HitObjectKind::Circle => Self::Circle {
|
||||||
pos,
|
pos,
|
||||||
time,
|
time,
|
||||||
@@ -303,8 +307,10 @@ impl OsuObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
HitObjectKind::Spinner { .. } => Self::Spinner { pos, time },
|
HitObjectKind::Spinner { .. } => Self::Spinner { pos, time },
|
||||||
HitObjectKind::Hold { .. } => panic!("found Hold object in osu!standard file"),
|
HitObjectKind::Hold { .. } => return None,
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Some(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ pub fn stars(
|
|||||||
let mut slider_state = SliderState::new(map);
|
let mut slider_state = SliderState::new(map);
|
||||||
let mut ticks_buf = Vec::new();
|
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(
|
OsuObject::new(
|
||||||
h,
|
h,
|
||||||
map,
|
map,
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ impl OsuObject {
|
|||||||
ticks: &mut Vec<f32>,
|
ticks: &mut Vec<f32>,
|
||||||
attributes: &mut DifficultyAttributes,
|
attributes: &mut DifficultyAttributes,
|
||||||
slider_state: &mut SliderState,
|
slider_state: &mut SliderState,
|
||||||
) -> Self {
|
) -> Option<Self> {
|
||||||
attributes.max_combo += 1; // hitcircle, slider head, or spinner
|
attributes.max_combo += 1; // hitcircle, slider head, or spinner
|
||||||
|
|
||||||
match &h.kind {
|
let obj = match &h.kind {
|
||||||
HitObjectKind::Circle => {
|
HitObjectKind::Circle => {
|
||||||
attributes.n_circles += 1;
|
attributes.n_circles += 1;
|
||||||
|
|
||||||
@@ -168,8 +168,10 @@ impl OsuObject {
|
|||||||
travel_dist: None,
|
travel_dist: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HitObjectKind::Hold { .. } => panic!("found Hold object in osu!standard file"),
|
HitObjectKind::Hold { .. } => return None,
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Some(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -64,32 +64,36 @@ pub fn stars(
|
|||||||
let mut n_spinners = 0;
|
let mut n_spinners = 0;
|
||||||
let mut state = SliderState::new(&map);
|
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 => {
|
HitObjectKind::Circle => {
|
||||||
max_combo += 1;
|
max_combo += 1;
|
||||||
n_circles += 1;
|
n_circles += 1;
|
||||||
|
|
||||||
Cow::Borrowed(h)
|
Some(Cow::Borrowed(h))
|
||||||
}
|
}
|
||||||
HitObjectKind::Slider {
|
HitObjectKind::Slider {
|
||||||
pixel_len, repeats, ..
|
pixel_len, repeats, ..
|
||||||
} => {
|
} => {
|
||||||
max_combo += state.count_ticks(h.start_time, *pixel_len, *repeats, &map);
|
max_combo += state.count_ticks(h.start_time, *pixel_len, *repeats, &map);
|
||||||
|
|
||||||
Cow::Owned(HitObject {
|
Some(Cow::Owned(HitObject {
|
||||||
pos: h.pos,
|
pos: h.pos,
|
||||||
start_time: h.start_time,
|
start_time: h.start_time,
|
||||||
kind: HitObjectKind::Circle,
|
kind: HitObjectKind::Circle,
|
||||||
sound: h.sound,
|
sound: h.sound,
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
HitObjectKind::Spinner { .. } => {
|
HitObjectKind::Spinner { .. } => {
|
||||||
max_combo += 1;
|
max_combo += 1;
|
||||||
n_spinners += 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);
|
let mut aim = Skill::new(SkillKind::Aim);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::cmp::Ordering;
|
|||||||
|
|
||||||
static COMMON_RHYTHMS: [HitObjectRhythm; 9] = [
|
static COMMON_RHYTHMS: [HitObjectRhythm; 9] = [
|
||||||
HitObjectRhythm {
|
HitObjectRhythm {
|
||||||
ratio: 1.0 / 1.0,
|
ratio: 1.0,
|
||||||
difficulty: 0.0,
|
difficulty: 0.0,
|
||||||
},
|
},
|
||||||
HitObjectRhythm {
|
HitObjectRhythm {
|
||||||
|
|||||||
Reference in New Issue
Block a user