mirror of
https://github.com/natsukagami/youmubot.git
synced 2025-04-19 16:58:55 +00:00
Update rosu_pp to 1.1, pass full mods to it
This commit is contained in:
parent
1ba5cdf6f7
commit
76fd6c803d
4 changed files with 28 additions and 26 deletions
5
Cargo.lock
generated
5
Cargo.lock
generated
|
@ -1818,11 +1818,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rosu-pp"
|
name = "rosu-pp"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "26f146c66bed5900ee1fa2b55ef5cc5dd2dbd45e6cac0f7bee5cae535980afbc"
|
checksum = "002a6b12cedcb185f4051f0b3d0466e0b61ff414a9ca8375f09be581c0e70f06"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rosu-map",
|
"rosu-map",
|
||||||
|
"rosu-mods",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -14,7 +14,7 @@ dashmap = "5.3.4"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
regex = "1.5.6"
|
regex = "1.5.6"
|
||||||
reqwest = "0.11.10"
|
reqwest = "0.11.10"
|
||||||
rosu-pp = "1.0"
|
rosu-pp = "1.1"
|
||||||
rosu-v2 = { git = "https://github.com/MaxOhn/rosu-v2", branch = "lazer" }
|
rosu-v2 = { git = "https://github.com/MaxOhn/rosu-v2", branch = "lazer" }
|
||||||
rosu-map = "0.1"
|
rosu-map = "0.1"
|
||||||
time = "0.3"
|
time = "0.3"
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::io::Read;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use rosu_map::Beatmap as BeatmapMetadata;
|
use rosu_map::Beatmap as BeatmapMetadata;
|
||||||
use rosu_pp::Beatmap;
|
use rosu_pp::{Beatmap, GameMods};
|
||||||
|
|
||||||
use youmubot_db_sql::{models::osu as models, Pool};
|
use youmubot_db_sql::{models::osu as models, Pool};
|
||||||
use youmubot_prelude::*;
|
use youmubot_prelude::*;
|
||||||
|
@ -67,6 +67,19 @@ impl Accuracy {
|
||||||
/// Beatmap Info with attached 95/98/99/100% FC pp.
|
/// Beatmap Info with attached 95/98/99/100% FC pp.
|
||||||
pub type BeatmapInfoWithPP = (BeatmapInfo, [f64; 4]);
|
pub type BeatmapInfoWithPP = (BeatmapInfo, [f64; 4]);
|
||||||
|
|
||||||
|
fn apply_mods(
|
||||||
|
perf: rosu_pp::Performance<'_>,
|
||||||
|
mods: impl Into<GameMods>,
|
||||||
|
) -> rosu_pp::Performance<'_> {
|
||||||
|
use rosu_pp::Performance::*;
|
||||||
|
match perf {
|
||||||
|
Osu(o) => Osu(o.mods(mods)),
|
||||||
|
Taiko(t) => Taiko(t.mods(mods)),
|
||||||
|
Catch(f) => Catch(f.mods(mods)),
|
||||||
|
Mania(m) => Mania(m.mods(mods)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl BeatmapContent {
|
impl BeatmapContent {
|
||||||
/// Get pp given the combo and accuracy.
|
/// Get pp given the combo and accuracy.
|
||||||
pub fn get_pp_from(
|
pub fn get_pp_from(
|
||||||
|
@ -76,18 +89,13 @@ impl BeatmapContent {
|
||||||
accuracy: Accuracy,
|
accuracy: Accuracy,
|
||||||
mods: &Mods,
|
mods: &Mods,
|
||||||
) -> Result<f64> {
|
) -> Result<f64> {
|
||||||
let clock = match mods.inner.clock_rate() {
|
let perf = self
|
||||||
None => bail!("cannot calculate pp for mods: {}", mods),
|
|
||||||
Some(clock) => clock as f64,
|
|
||||||
};
|
|
||||||
let mut perf = self
|
|
||||||
.content
|
.content
|
||||||
.performance()
|
.performance()
|
||||||
.mode_or_ignore(mode.into())
|
.mode_or_ignore(mode.into())
|
||||||
.accuracy(accuracy.into())
|
.accuracy(accuracy.into())
|
||||||
.misses(accuracy.misses() as u32)
|
.misses(accuracy.misses() as u32);
|
||||||
.mods(mods.bits())
|
let mut perf = apply_mods(perf, mods.inner.clone());
|
||||||
.clock_rate(clock);
|
|
||||||
if let Some(combo) = combo {
|
if let Some(combo) = combo {
|
||||||
perf = perf.combo(combo as u32);
|
perf = perf.combo(combo as u32);
|
||||||
}
|
}
|
||||||
|
@ -97,17 +105,8 @@ impl BeatmapContent {
|
||||||
|
|
||||||
/// Get info given mods.
|
/// Get info given mods.
|
||||||
pub fn get_info_with(&self, mode: Mode, mods: &Mods) -> Result<BeatmapInfo> {
|
pub fn get_info_with(&self, mode: Mode, mods: &Mods) -> Result<BeatmapInfo> {
|
||||||
let clock = match mods.inner.clock_rate() {
|
let perf = self.content.performance().mode_or_ignore(mode.into());
|
||||||
None => bail!("cannot calculate info for mods: {}", mods),
|
let attrs = apply_mods(perf, mods.inner.clone()).calculate();
|
||||||
Some(clock) => clock as f64,
|
|
||||||
};
|
|
||||||
let attrs = self
|
|
||||||
.content
|
|
||||||
.performance()
|
|
||||||
.mode_or_ignore(mode.into())
|
|
||||||
.mods(mods.bits())
|
|
||||||
.clock_rate(clock)
|
|
||||||
.calculate();
|
|
||||||
Ok(BeatmapInfo {
|
Ok(BeatmapInfo {
|
||||||
objects: self.content.hit_objects.len(),
|
objects: self.content.hit_objects.len(),
|
||||||
max_combo: attrs.max_combo() as usize,
|
max_combo: attrs.max_combo() as usize,
|
||||||
|
|
|
@ -110,10 +110,12 @@ impl Difficulty {
|
||||||
diff.cs = old_cs * 1.3;
|
diff.cs = old_cs * 1.3;
|
||||||
}
|
}
|
||||||
if let Some(ratio) = mods.inner.clock_rate() {
|
if let Some(ratio) = mods.inner.clock_rate() {
|
||||||
|
if ratio != 1.0 {
|
||||||
diff.apply_length_by_ratio(1.0 / ratio as f64);
|
diff.apply_length_by_ratio(1.0 / ratio as f64);
|
||||||
diff.apply_ar_by_time_ratio(1.0 / ratio as f64);
|
diff.apply_ar_by_time_ratio(1.0 / ratio as f64);
|
||||||
diff.apply_od_by_time_ratio(1.0 / ratio as f64);
|
diff.apply_od_by_time_ratio(1.0 / ratio as f64);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// if mods.contains(Mods::HT) {
|
// if mods.contains(Mods::HT) {
|
||||||
// diff.apply_ar_by_time_ratio(4.0 / 3.0);
|
// diff.apply_ar_by_time_ratio(4.0 / 3.0);
|
||||||
// diff.apply_od_by_time_ratio(4.0 / 3.0);
|
// diff.apply_od_by_time_ratio(4.0 / 3.0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue